3.6 KiB
3.6 KiB
Bug #434 分析报告
问题:编辑弹窗中"切口类型"字段未正确回显数据
数据流追踪
1. 数据库现状
op_schedule表:没有incision_level字段(58列,已验证)cli_surgery表:有incision_level字段,且有数据- DDL 脚本
sql/bug_434_add_incision_level_to_op_schedule.sql已写好但未执行
2. 后端 SQL 查询(getSurgeryScheduleDetail)
SELECT os.*, cs.incision_level AS "incisionLevel", ...
FROM op_schedule os
INNER JOIN cli_surgery cs ON os.oper_code = cs.surgery_no
os.*不包含incision_level(因为op_schedule没有该列)- 通过 JOIN 从
cli_surgery读取,别名"incisionLevel"(已加双引号保持大小写) - PostgreSQL 返回列名:
incisionLevel(驼峰)→ MyBatis 可正确映射到OpScheduleDto.incisionLevel
3. OpSchedule 实体
- 缺失
incisionLevel字段 →BeanUtils.copyProperties无法将incisionLevel复制到OpSchedule实体 - 结果:
updateSurgerySchedule更新时,incisionLevel不会写入op_schedule表
4. 前端 handleEdit
Object.assign(form, data) // 后端返回 data.incisionLevel
if (data.incisionLevel != null) form.incisionType = Number(data.incisionLevel)
- 前端使用
form.incisionType绑定 el-select - 后端返回
incisionLevel,前端转换为incisionType
5. 前端 submitForm
const submitData = { ...form, orgId: ..., incisionLevel: form.incisionType }
delete submitData.incisionType
- 提交时将
incisionType转为incisionLevel - 后端
updateSurgerySchedule接收OpScheduleDto(有incisionLevel字段) BeanUtils.copyProperties复制到OpSchedule实体(没有incisionLevel)→ 字段丢失syncSurgeryIncisionLevel仅同步到cli_surgery,op_schedule中不存储
根因(双重问题)
根因 A(SQL 别名 - 已修复)
SQL 中 cs.incision_level AS "incisionLevel" 已加双引号,PostgreSQL 保持大小写,MyBatis 可正确映射。
状态:已修复,无需改动
根因 B(实体缺失字段 - 待修复)
OpSchedule 实体类中没有 incisionLevel 字段。导致:
- 编辑时即使后端正确返回数据,保存到
op_schedule时该字段被忽略 - 数据仅存储在
cli_surgery.incision_level,op_schedule中没有备份
修复方案
1. 执行 DDL
ALTER TABLE op_schedule ADD COLUMN IF NOT EXISTS incision_level INT2;
COMMENT ON COLUMN op_schedule.incision_level IS '手术切口等级 1-I级切口 2-II级切口 3-III级切口 4-IV级切口';
2. 在 OpSchedule 实体中添加字段
/** 切口类型 */
private Integer incisionLevel;
3. 修改 mapper XML(可选增强)
getSurgerySchedulePage查询中也加入cs.incision_level AS "incisionLevel"(目前列表没有该字段)getSurgeryScheduleDetail已有"incisionLevel"别名,无需改动
4. 从同步到直接保存
syncSurgeryIncisionLevel方法仍然保留(用于同步到cli_surgery)updateSurgerySchedule中因为实体有了incisionLevel,BeanUtils.copyProperties会自动复制updateById会自动更新op_schedule.incision_level
影响范围
- 数据库: 执行 DDL 添加
op_schedule.incision_level字段 - 后端:
OpSchedule.java添加incisionLevel字段 - 前端: 无需修改(数据绑定和转换逻辑已正确)
验证计划
- 执行 DDL 后验证字段存在
- 修改 Java 实体后验证编译通过
- 验证编辑弹窗回显
- 验证保存后数据正确