Files
his/ANALYSIS_434.md
2026-05-16 17:51:54 +08:00

3.6 KiB
Raw Blame History

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_surgeryop_schedule 中不存储

根因(双重问题)

根因 ASQL 别名 - 已修复)

SQL 中 cs.incision_level AS "incisionLevel" 已加双引号PostgreSQL 保持大小写MyBatis 可正确映射。 状态:已修复,无需改动

根因 B实体缺失字段 - 待修复)

OpSchedule 实体类中没有 incisionLevel 字段。导致:

  1. 编辑时即使后端正确返回数据,保存到 op_schedule 时该字段被忽略
  2. 数据仅存储在 cli_surgery.incision_levelop_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 中因为实体有了 incisionLevelBeanUtils.copyProperties 会自动复制
  • updateById 会自动更新 op_schedule.incision_level

影响范围

  • 数据库: 执行 DDL 添加 op_schedule.incision_level 字段
  • 后端: OpSchedule.java 添加 incisionLevel 字段
  • 前端: 无需修改(数据绑定和转换逻辑已正确)

验证计划

  1. 执行 DDL 后验证字段存在
  2. 修改 Java 实体后验证编译通过
  3. 验证编辑弹窗回显
  4. 验证保存后数据正确