Fix Bug #432: 门诊手术安排:新增手术安排保存时报错 - 根因+修复方案

根因:OpCreateScheduleDto缺少@JsonIgnoreProperties注解,Jackson默认
FAIL_ON_UNKNOWN_PROPERTIES=true,前端提交的表单包含DTO中不存在的字段
(identifierNo、patientName、gender、age、birthDay等)导致反序列化失败

修复:在OpCreateScheduleDto类上添加@JsonIgnoreProperties(ignoreUnknown = true)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
关羽
2026-05-16 12:19:42 +08:00
committed by 赵云
parent cd88bfc7d4
commit a7ea08f075
2 changed files with 45 additions and 0 deletions

43
bug432_analysis.md Normal file
View File

@@ -0,0 +1,43 @@
# Bug #432 分析报告
## 根因分析
**根因**:后端 `OpCreateScheduleDto` 缺少 `@JsonIgnoreProperties(ignoreUnknown = true)` 注解。
Spring Boot 的 Jackson 默认配置 `FAIL_ON_UNKNOWN_PROPERTIES = true`,即反序列化时遇到 DTO 中不存在的字段会抛出 `JsonMappingException: Unrecognized field` 异常。
前端 `submitForm()` 使用 `{ ...form }` 展开整个表单对象提交,包含大量 DTO 中不存在的字段:
- `identifierNo`(就诊卡号)
- `patientName`(患者姓名)
- `gender`(性别)
- `age`(年龄)
- `birthDay`(出生日期)
- `orgName`(机构名称)
- `applyDeptName`(申请科室名称)
- `surgeonName`(主刀医生姓名)
- `applyDoctorName`(申请医生姓名)
- `applyTime`(申请时间)
- `surgeryNo`(手术单号)
- `scheduleId`排程ID新增时为undefined
- `orgId`机构ID前端显式添加
这些字段在后端 `OpCreateScheduleDto` 中均未定义,导致 JSON 反序列化失败,返回 400/500 错误,前端显示"新增手术安排失败"。
## 影响范围
- **后端文件**`OpCreateScheduleDto.java`
- **影响接口**`POST /clinical-manage/surgery-schedule/create`(新增手术安排)
- **影响数据表**`op_schedule`
- **前端无需修改**:前端提交逻辑正确,问题在后端 DTO 配置
## 修复方案
`OpCreateScheduleDto` 类上添加 `@JsonIgnoreProperties(ignoreUnknown = true)` 注解,使 Jackson 在反序列化时忽略 DTO 中不存在的字段。
这是最小侵入性修复(仅添加 1 行注解),不影响现有业务逻辑。
## 验证计划
1. 修改后运行 Maven 编译确认无语法错误
2. 部署后按 Bug 步骤操作:新增手术安排 → 查找并选择手术申请 → 填写入室时间 → 保存
3. 确认保存成功,无报错

View File

@@ -1,5 +1,6 @@
package com.openhis.web.clinicalmanage.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
@@ -7,6 +8,7 @@ import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class OpCreateScheduleDto {
/**
* 申请单ID