2.3 KiB
2.3 KiB
Bug #434 分析报告
根因分析
问题:编辑弹窗中"切口类型"字段未正确回显数据
数据流追踪:
- 用户点击"编辑"→ 前端调用
getSurgeryScheduleDetail(row.scheduleId) - 后端 SQL:
cs.incision_level AS incisionLevel - PostgreSQL 返回列名:
incisionlevel(全小写) - MyBatis 尝试将
incisionlevel映射到OpScheduleDto.incisionLevel - 映射失败!→
data.incisionLevel为 null →form.incisionType保持 undefined → el-select 显示空白
根因:PostgreSQL 小写化未加引号的列别名
PostgreSQL 会将未加双引号的列别名自动转为小写:
-- 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字段已存在且有数据)
验证计划
- 修改 SQL 后,运行相同查询验证列名变为
incisionLevel - 确认前端
node --check语法通过