51 lines
2.3 KiB
Markdown
51 lines
2.3 KiB
Markdown
# 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` 语法通过
|