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

67 lines
3.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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"` 映射一次,保证正确获取值。