From d32ac8e9b3edc40a77effd35704ad4d00182d371 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=B3=E7=BE=BD?= <关羽@gentronhealth.com> Date: Sat, 16 May 2026 12:19:42 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#432:=20=E9=97=A8=E8=AF=8A=E6=89=8B?= =?UTF-8?q?=E6=9C=AF=E5=AE=89=E6=8E=92=EF=BC=9A=E6=96=B0=E5=A2=9E=E6=89=8B?= =?UTF-8?q?=E6=9C=AF=E5=AE=89=E6=8E=92=E4=BF=9D=E5=AD=98=E6=97=B6=E6=8A=A5?= =?UTF-8?q?=E9=94=99=20-=20=E6=A0=B9=E5=9B=A0+=E4=BF=AE=E5=A4=8D=E6=96=B9?= =?UTF-8?q?=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因: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 --- bug432_analysis.md | 43 +++++++++++++++++++ .../dto/OpCreateScheduleDto.java | 2 + 2 files changed, 45 insertions(+) create mode 100644 bug432_analysis.md diff --git a/bug432_analysis.md b/bug432_analysis.md new file mode 100644 index 000000000..1ac83faff --- /dev/null +++ b/bug432_analysis.md @@ -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. 确认保存成功,无报错 diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/dto/OpCreateScheduleDto.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/dto/OpCreateScheduleDto.java index 05554875e..fcc854712 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/dto/OpCreateScheduleDto.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/clinicalmanage/dto/OpCreateScheduleDto.java @@ -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