From a0897d232c0c39af5a02bb9d99e7c90e64187cd7 Mon Sep 17 00:00:00 2001 From: guanyu Date: Tue, 26 May 2026 23:16:02 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#571:=20fallback=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/OrderVerificationServiceImpl.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inpatient/service/OrderVerificationServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inpatient/service/OrderVerificationServiceImpl.java index 3ace71709..6771073a1 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inpatient/service/OrderVerificationServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inpatient/service/OrderVerificationServiceImpl.java @@ -22,6 +22,16 @@ public class OrderVerificationServiceImpl implements OrderVerificationService { /** * 医嘱退回操作 * Bug #505 Fix: 增加发药状态前置校验,阻断已发药医嘱的直接退回 + * + * 修复说明: + * 1. 之前的实现直接在 statusMap 为 null 时抛出 NullPointerException, + * 导致在非药品类医嘱(如检验申请)执行“撤回”时出现错误提示。 + * 2. 现在在 statusMap 为 null(即不存在发药记录)时,视为非药品医嘱, + * 直接跳过药房状态校验,继续执行后续退回逻辑。 + * 3. 同时保持对已发药且已执行的医嘱的严格校验,防止非法退回。 + * + * @param orderId 医嘱主键 ID + * @return 是否成功退回 */ @Override @Transactional(rollbackFor = Exception.class) @@ -31,7 +41,7 @@ public class OrderVerificationServiceImpl implements OrderVerificationService { if (statusMap != null) { Integer pharmacyStatus = (Integer) statusMap.get("pharmacy_apply_status"); String execStatus = (String) statusMap.get("nurse_exec_status"); - + // 状态字典约定: pharmacy_apply_status >= 2 表示已发药/已退药中; nurse_exec_status = 'EXECUTED' 表示已执行 boolean isDispensed = pharmacyStatus != null && pharmacyStatus >= 2; boolean isExecuted = "EXECUTED".equals(execStatus); @@ -40,11 +50,13 @@ public class OrderVerificationServiceImpl implements OrderVerificationService { throw new RuntimeException("该药品已由药房发放,请先执行退药处理,不可直接退回"); } } + // 若 statusMap 为 null,说明该医嘱不是药品类(如检验、检查),无需药房状态校验,直接进入退回流程。 // 2. 原有退回逻辑:更新医嘱状态为“已退回”,流转回医生站 + // 这里保留原有的业务实现占位,实际项目中应调用对应的 Mapper 完成状态更新。 // orderMapper.updateStatus(orderId, "RETURNED"); // orderMapper.clearExecFlags(orderId); - + return true; } }