# 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) ```sql 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 ```javascript Object.assign(form, data) // 后端返回 data.incisionLevel if (data.incisionLevel != null) form.incisionType = Number(data.incisionLevel) ``` - 前端使用 `form.incisionType` 绑定 el-select - 后端返回 `incisionLevel`,前端转换为 `incisionType` ### 5. 前端 submitForm ```javascript 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` 字段。导致: 1. 编辑时即使后端正确返回数据,保存到 `op_schedule` 时该字段被忽略 2. 数据仅存储在 `cli_surgery.incision_level`,`op_schedule` 中没有备份 ## 修复方案 ### 1. 执行 DDL ```sql 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 实体中添加字段 ```java /** 切口类型 */ 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` 字段 - **前端**: 无需修改(数据绑定和转换逻辑已正确) ## 验证计划 1. 执行 DDL 后验证字段存在 2. 修改 Java 实体后验证编译通过 3. 验证编辑弹窗回显 4. 验证保存后数据正确