diff --git a/ANALYSIS_434.md b/ANALYSIS_434.md new file mode 100644 index 000000000..cf1a659ff --- /dev/null +++ b/ANALYSIS_434.md @@ -0,0 +1,50 @@ +# Bug #434 分析报告 + +## 根因分析 + +### 问题:编辑弹窗中"切口类型"字段未正确回显数据 + +**数据流追踪**: +1. 用户点击"编辑"→ 前端调用 `getSurgeryScheduleDetail(row.scheduleId)` +2. 后端 SQL: `cs.incision_level AS incisionLevel` +3. PostgreSQL 返回列名: `incisionlevel` (全小写) +4. MyBatis 尝试将 `incisionlevel` 映射到 `OpScheduleDto.incisionLevel` +5. 映射失败!→ `data.incisionLevel` 为 null → `form.incisionType` 保持 undefined → el-select 显示空白 + +### 根因:PostgreSQL 小写化未加引号的列别名 + +PostgreSQL 会将未加双引号的列别名自动转为小写: +```sql +-- SQL 写的别名 +cs.incision_level AS incisionLevel +-- PostgreSQL 实际返回的列名 +incisionlevel ← 全小写! +``` + +MyBatis 收到列名 `incisionlevel`(全小写),尝试匹配 Java 属性 `incisionLevel`(驼峰)。由于 `mapUnderscoreToCamelCase` 只对含下划线的列生效(`incisionlevel` 无下划线),匹配失败。 + +**对比 `anes_method` 为什么能工作**: +- SQL: `os.anes_method`(无 AS 别名) +- PostgreSQL 返回: `anes_method`(保留下划线) +- MyBatis `mapUnderscoreToCamelCase`: `anes_method` → `anesMethod` ✅ + +**对比同 mapper 中的 `surgeryNo` 为什么能工作**: +- SQL: `os.oper_code AS surgeryNo` → PostgreSQL 返回 `surgeryno` +- 但 `OpSchedule` 实体中**没有** `surgeryNo` 字段,只有 `operCode` +- `os.oper_code` 列映射到 `operCode` 是通过 `mapUnderscoreToCamelCase` 正常工作的 +- `surgeryno` 找不到对应属性,被 MyBatis 忽略(不影响功能) + +### 修复方案 + +将 SQL 中的别名加双引号:`cs.incision_level AS "incisionLevel"` + +PostgreSQL 对加双引号的标识符保持大小写,返回列名 `incisionLevel`(驼峰),MyBatis 可直接匹配到 `OpScheduleDto.incisionLevel` 属性。 + +### 影响范围 +- **后端**: `SurgicalScheduleAppMapper.xml` — `getSurgeryScheduleDetail` 查询(第92行) +- **前端**: 无需修改(`handleEdit`/`handleView` 中的 nextTick 转换逻辑已正确) +- **数据库**: 无需修改(`cli_surgery.incision_level` 字段已存在且有数据) + +## 验证计划 +1. 修改 SQL 后,运行相同查询验证列名变为 `incisionLevel` +2. 确认前端 `node --check` 语法通过 diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/clinicalmanage/SurgicalScheduleAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/clinicalmanage/SurgicalScheduleAppMapper.xml index 5399be5ce..9514f62ff 100755 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/clinicalmanage/SurgicalScheduleAppMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/clinicalmanage/SurgicalScheduleAppMapper.xml @@ -89,7 +89,7 @@ cs.apply_doctor_name AS apply_doctor_name, drf.create_time AS apply_time, os.surgery_nature AS surgeryType, - cs.incision_level AS incisionLevel, + cs.incision_level AS "incisionLevel", os.fee_type AS feeType, COALESCE(pi.identifier_no, ap.bus_no, '') AS identifierNo FROM op_schedule os