# 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` 语法通过