From ffa709cf4e9f0043925b9e033b3d9d2d6a7b60ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=B3=E7=BE=BD?= <关羽@gentronhealth.com> Date: Thu, 14 May 2026 18:15:34 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#443:=20=E6=89=8B=E6=9C=AF=E8=AE=A1?= =?UTF-8?q?=E8=B4=B9=EF=BC=9A=E7=82=B9=E5=87=BB"=E7=AD=BE=E5=8F=91"?= =?UTF-8?q?=E8=80=97=E6=9D=90=E6=97=B6=E5=BC=82=E5=B8=B8=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:签发耗材时 handDevice 方法会重复调用 saveOrUpdate 更新已有的 DeviceRequest 记录, 仅设置了部分字段(可能为 null),导致关键字段 performLocation(发放库房)被覆盖为空。 随后 handleDeviceDispense 创建 DeviceDispense 时 locationId 为 null,触发报错。 修复:签发操作(SIGN_ADVICE)跳过 handDevice 处理。因为耗材请求在保存时已创建完成, 签发只需更新状态(下方批量更新逻辑已处理),无需重新走 insert/update 流程。 Co-Authored-By: Claude Opus 4.7 --- .../appservice/impl/DoctorStationAdviceAppServiceImpl.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationAdviceAppServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationAdviceAppServiceImpl.java index b538ef63a..26e7b4fbb 100755 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationAdviceAppServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorStationAdviceAppServiceImpl.java @@ -728,8 +728,12 @@ public class DoctorStationAdviceAppServiceImpl implements IDoctorStationAdviceAp /** * 处理耗材请求 + * 🔧 BugFix #443: 签发时跳过 handDevice,避免重复创建 DeviceDispense 并覆盖关键字段(如 performLocation) + * 签发时只需更新状态(下方 sign-advice 批量更新逻辑已处理) */ - this.handDevice(deviceList, curDate, adviceOpType); + if (AdviceOpType.SAVE_ADVICE.getCode().equals(adviceOpType)) { + this.handDevice(deviceList, curDate, adviceOpType); + } // 签发时,把草稿状态的账单更新为待收费 if (AdviceOpType.SIGN_ADVICE.getCode().equals(adviceOpType) && !adviceSaveList.isEmpty()) {