PR REVIEW EVIDENCE

chore(ktv): 增加下机Kt/V历史错误数据修复程序与执行手册

hemo-backend #1383

  1. PR 提交时间2026-10-09 16:36:51
  2. 审核结束时间2026-10-09 16:46:42
  3. 固定版本30b5975b9265
  4. 模型链gpt-5.6-terra → gpt-5.6-sol
  5. 门禁blocked
  6. 结果success

难度分

76
  • code_volume63新增约千行的 Java 筛选与测试、Python SQL 生成器及执行手册。
  • architecture_complexity57跨越只读数据库筛选、CSV 交接、生成式 SQL、备份、核验和回滚多个环节。
  • domain_knowledge87涉及透析 Kt/V 累计计算、血流量口径、临床数据来源和历史病历修复边界。
  • impact_scope90工具未按医院过滤,生成的 SQL 可批量修改生产库中各机构的历史下机记录。
  • risk_level95直接批量更新临床历史数据,且涉及人工记录保护与回滚完整性。

完成分

76
  • correctness20最终风险固定扣分:high 1×40;medium 2×20;合计 -80
  • completeness100本次静态审核未发现该维度的确认问题;不代表绝对完善
  • code_quality100本次静态审核未发现该维度的确认问题;不代表绝对完善
  • security100本次静态审核未发现该维度的确认问题;不代表绝对完善
  • details100本次静态审核未发现该维度的确认问题;不代表绝对完善

固定范围

目标分支 SHA
f5e51f9cd2fcacd4a376708fadd694af078d90fe
共同祖先 SHA
13901a83f30accd65b049e2415e0017042c24c71
PR head SHA
30b5975b9265f305b20e0677d61f99bcb07ff449
轻量检查
passed · 轻量检查通过

风险与证据

high · 已确认 · 已计入完成分

未限定 PASSTHROUGH 来源,修复范围会扩大到其他自动来源记录

可能将未获确认范围内的自动或未知来源下机 Kt/V 改为推算值,造成历史透析治疗记录偏差。

证据:scripts/ktv-end-repair/KtvEndRepairDryRun.java:226 String sql = "select e.id, e.record_code, e.data_time, e.data_flag, e.data_xll, e.data_kt_v, " + "ifnull(e.is_force_modify_ktv,0), e.ktv_source_type, r.client_code " + "from patient_hemo_med_monitor_data e join patient_hemo_med_record r on r.code=e.record_code and r.is_deleted=0 " + "where e.data_flag=2 and (e.is_deleted=0 or e.is_deleted is null) and e.data_time>=? and e.data_time<? " + "and ifnull(e.is_force_modify_ktv,0)=0 and e.data_kt_v regexp '^[0-9]+(\\\\.[0-9]+)?$' "

建议:在只读筛选、备份核验和最终 UPDATE 条件中均明确限定来源为 PASSTHROUGH;同时核查已执行批次中 AUTO、UNKNOWN 等来源的记录并按备份纠正,补充非 PASSTHROUGH 来源必须跳过的测试。

medium · 已确认 · 已计入完成分

执行 SQL 未保护执行期间转为人工来源的记录

试运行后被医护改为人工确认的下机记录仍可能被批量修复覆盖,导致人工确认内容和来源标记丢失。

证据:scripts/ktv-end-repair/gen_repair_sql.py:88 'WHERE b.backed_up_at IS NOT NULL\n' ' AND m.data_kt_v = b.expected_old_ktv\n' ' AND m.data_kt_v = b.old_data_kt_v\n' ' AND m.data_flag = 2\n' ' AND IFNULL(m.is_force_modify_ktv, 0) = 0\n' ' AND (m.is_deleted = 0 OR m.is_deleted IS NULL);\n' % table)

建议:把来源纳入乐观并发条件,同时核对当前来源与备份来源,并只允许仍属于获准自动修复来源的记录更新;增加仅改变来源而不改变数值的并发场景测试。

medium · 已确认 · 已计入完成分

回滚只比较 Kt/V 数值,可能覆盖修复后的人工确认

回滚时可能把医护在修复后再次确认的记录恢复为旧值、旧来源和旧快照,导致最新人工确认数据丢失。

证据:scripts/ktv-end-repair/gen_repair_sql.py:99 'WHERE b.backed_up_at IS NOT NULL AND m.data_kt_v = b.new_ktv;\n' % table)

建议:记录本次修复后的版本或应用时间;回滚时同时校验该标识、修复后来源、快照及强制修改状态,任一不符即跳过并输出待人工处理清单。