Files
his/ANALYSIS_434.md
2026-05-16 14:18:41 +08:00

2.3 KiB
Raw Blame History

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 写的别名
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_methodanesMethod

对比同 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.xmlgetSurgeryScheduleDetail 查询第92行
  • 前端: 无需修改(handleEdit/handleView 中的 nextTick 转换逻辑已正确)
  • 数据库: 无需修改(cli_surgery.incision_level 字段已存在且有数据)

验证计划

  1. 修改 SQL 后,运行相同查询验证列名变为 incisionLevel
  2. 确认前端 node --check 语法通过