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

88 lines
3.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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` 中不存储
## 根因(双重问题)
### 根因 ASQL 别名 - 已修复)
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. 验证保存后数据正确