# Bug #434 修复分析报告(追加) ## 问题:编辑弹窗中"切口类型"字段未正确回显数据 ## 根因分析(数据流追踪) ### 1. SQL 查询 `getSurgeryScheduleDetail`(Mapper XML 第77-114行) ```sql 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_level`(NULL) - 后面又显式选了 `cs.incision_level AS "incisionLevel"`(实际值,如 1) ### 3. MyBatis `resultType` 映射冲突 MyBatis 使用 `resultType` 时按**列在结果集中的出现顺序**映射到 DTO 属性: 1. 第一列 `os.incision_level`(snake_case → `incisionLevel`)→ NULL 2. 后面列 `cs.incision_level AS "incisionLevel"` → `incisionLevel` → 1 **当两列映射到同一属性时,第一列的值可能覆盖第二列**(取决于 MyBatis 版本和配置),导致 `incisionLevel` 为 NULL。 ### 4. 前端影响 ```javascript if (data.incisionLevel != null) form.incisionType = Number(data.incisionLevel) ``` 当 `data.incisionLevel` 为 NULL 时,`form.incisionType` 保持 `undefined`,el-select 无法匹配到任何选项,显示"请选择切口类型"。 ### 5. 数据库验证 ```sql 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`) ```diff - 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"` 映射一次,保证正确获取值。