Files
his/ANALYSIS_434.md
赵云 37baa20163 Fix Bug #434: 门诊手术安排:编辑弹窗中"切口类型"字段未正确回显数据
根因:getSurgeryScheduleDetail SQL中 os.* 包含 os.incision_level(NULL),
与 cs.incision_level AS "incisionLevel" 产生列名冲突,MyBatis resultType
映射时将NULL值覆盖实际数据,导致前端form.incisionType为undefined。
修复:将 os.* 替换为显式列选择(排除os.incision_level),确保incisionLevel
只被 cs.incision_level 映射一次。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-16 18:05:34 +08:00

3.0 KiB
Raw Blame History

Bug #434 修复分析报告(追加)

问题:编辑弹窗中"切口类型"字段未正确回显数据

根因分析(数据流追踪)

1. SQL 查询 getSurgeryScheduleDetailMapper XML 第77-114行

SELECT os.*, cs.incision_level AS "incisionLevel", ...
FROM op_schedule os
INNER JOIN cli_surgery cs ON os.oper_code = cs.surgery_no

2. 关键矛盾:os.* 包含了 os.incision_level

  • os.* 展开所有 op_schedule 表列,包括 os.incision_levelNULL
  • 后面又显式选了 cs.incision_level AS "incisionLevel"(实际值,如 1

3. MyBatis resultType 映射冲突

MyBatis 使用 resultType 时按列在结果集中的出现顺序映射到 DTO 属性:

  1. 第一列 os.incision_levelsnake_case → incisionLevel)→ NULL
  2. 后面列 cs.incision_level AS "incisionLevel"incisionLevel → 1

当两列映射到同一属性时,第一列的值可能覆盖第二列(取决于 MyBatis 版本和配置),导致 incisionLevel 为 NULL。

4. 前端影响

if (data.incisionLevel != null) form.incisionType = Number(data.incisionLevel)

data.incisionLevel 为 NULL 时,form.incisionType 保持 undefinedel-select 无法匹配到任何选项,显示"请选择切口类型"。

5. 数据库验证

SELECT os.incision_level, cs.incision_level FROM op_schedule os
INNER JOIN cli_surgery cs ON os.oper_code = cs.surgery_no;
-- 结果: os.incision_level = NULL, cs.incision_level = 1有数据

修复方案

os.* 替换为显式列选择(排除 os.incision_level

- SELECT os.*,
+ SELECT os.schedule_id, os.tenant_id, os.apply_id, os.patient_id, os.visit_id,
+     os.oper_code, os.oper_name, os.preoperative_diagnosis, os.postoperative_diagnosis,
+     os.schedule_date, os.sequence_no, os.is_first_surgery, os.is_allergy_medication,
+     os.allergy_remark, os.surgery_nature, os.surgery_site,
+     os.admission_time, os.entry_time, os.room_code, os.table_no,
+     os.anes_method, os.anes_doctor1_code, os.anes_doctor2_code, os.anes_doctor3_code,
+     os.scrub_nurse_code, os.circu_nurse1_code, os.circu_nurse2_code,
+     os.scrub_nurse1_code, os.scrub_nurse2_code, os.surgeon_code,
+     os.assistant1_code, os.assistant2_code, os.assistant3_code,
+     os.start_time, os.end_time, os.anes_start, os.anes_end,
+     os.oper_status, os.implant_flag, os.implant_serial,
+     os.blood_loss, os.blood_trans, os.infection_diagnosis, os.isolation_type,
+     os.patient_weight, os.patient_height, os.communication_info,
+     os.is_external_expert, os.external_expert_name, os.fee_type,
+     os.remark, os.create_time, os.creator_id, os.update_time, os.tenant_id,
+     os.delete_flag, os.update_by, os.create_by, os.updater_id,
      os.oper_code AS surgeryNo,
      ...
      cs.incision_level AS "incisionLevel",
      ...

这样 incisionLevel 只被 cs.incision_level AS "incisionLevel" 映射一次,保证正确获取值。