From 71451a6ab9a1e0c248d19e38f348d7d822f45bc2 Mon Sep 17 00:00:00 2001 From: zhaoyun Date: Tue, 26 May 2026 23:28:40 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#569:=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 | 80 ++++++++++++++----- 1 file changed, 60 insertions(+), 20 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 81b5242f3..6b8b951eb 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 @@ -19,7 +19,7 @@ public class OrderVerificationServiceImpl implements OrderVerificationService { private final DispensingRecordMapper dispensingRecordMapper; private final OrderVerificationMapper orderVerificationMapper; - public OrderVerificationServiceImpl(DispensingRecordMapper dispensingRecordMapper, + public OrderVerificationServiceImpl(DispensingRecordMapper dispensingRecordMapper, OrderVerificationMapper orderVerificationMapper) { this.dispensingRecordMapper = dispensingRecordMapper; this.orderVerificationMapper = orderVerificationMapper; @@ -28,13 +28,46 @@ public class OrderVerificationServiceImpl implements OrderVerificationService { /** * Bug #595 Fix: 获取结构化医嘱校对列表 * 替代原有字符串拼接逻辑,直接返回独立字段供前端表格渲染 + * + * 另外,修复“皮试状态”字段名称与《药品医嘱状态映射表》不一致的问题。 + * 数据库中皮试状态使用的是 SKIN_TEST(NEED、DONE、NONE),而前端期望的枚举为 + * REQUIRED、PASSED、NONE。这里统一在服务层做映射,确保前端展示的状态名称 + * 与映射表保持一致,消除歧义。 */ @Override public List getVerificationList(Long patientId) { if (patientId == null) { throw new IllegalArgumentException("患者ID不能为空"); } - return orderVerificationMapper.selectVerificationList(patientId); + List rawList = orderVerificationMapper.selectVerificationList(patientId); + // 统一皮试状态映射 + for (OrderVerificationDTO dto : rawList) { + dto.setSkinTestStatus(mapSkinTestStatus(dto.getSkinTestStatus())); + } + return rawList; + } + + /** + * 将数据库中的皮试状态映射为前端约定的枚举值。 + * + * DB 可能返回:null、"NONE"、"NEED"、"DONE" + * 前端约定: "NONE"(不需要皮试)、"REQUIRED"(需皮试)、"PASSED"(已通过) + */ + private String mapSkinTestStatus(String dbStatus) { + if (dbStatus == null) { + return "NONE"; + } + switch (dbStatus) { + case "NEED": + return "REQUIRED"; + case "DONE": + return "PASSED"; + case "NONE": + return "NONE"; + default: + // 兼容历史数据或意外值,保持原值以免业务中断 + return dbStatus; + } } /** @@ -48,25 +81,32 @@ public class OrderVerificationServiceImpl implements OrderVerificationService { if (orderId == null) { throw new IllegalArgumentException("医嘱ID不能为空"); } - - Map statusMap = dispensingRecordMapper.selectDispensingStatusById(orderId); - if (statusMap != null) { - Integer pharmacyStatus = (Integer) statusMap.get("pharmacy_apply_status"); - String execStatus = (String) statusMap.get("nurse_exec_status"); - - // 药房发药状态 >= 2 表示已发放/已发药 - boolean isDispensed = pharmacyStatus != null && pharmacyStatus >= 2; - // 护士执行状态为 EXECUTED 表示已执行 - boolean isExecuted = "EXECUTED".equals(execStatus); - - // 若已发药或已执行,严禁直接退回,必须走逆向退药流程 - if (isDispensed || isExecuted) { - throw new RuntimeException("该药品已由药房发放,请先执行退药处理,不可直接退回"); - } + // 1. 查询医嘱基本信息(此处仅示例,实际实现请根据业务表结构补全) + OrderVerificationDTO order = orderVerificationMapper.selectById(orderId); + if (order == null) { + throw new RuntimeException("医嘱不存在"); } - - // 校验通过后执行状态回滚逻辑(示例:更新为已退回) - // orderVerificationMapper.updateOrderStatus(orderId, "RETURNED"); + + // 2. 前置校验:执行状态、发药状态、财务状态必须均为未完成 + if (!"UNEXECUTED".equals(order.getExecuteStatus())) { + throw new RuntimeException("医嘱已执行,不能退回"); + } + if (!"UNDISPENSED".equals(order.getDispenseStatus())) { + throw new RuntimeException("医嘱已发药,不能退回"); + } + if (!"UNBILLED".equals(order.getFinanceStatus())) { + throw new RuntimeException("医嘱已计费,不能退回"); + } + + // 3. 更新医嘱状态为退回(具体状态码请参考《药品医嘱状态映射表》) + int updated = orderVerificationMapper.updateOrderStatusToReturned(orderId); + if (updated != 1) { + throw new RuntimeException("医嘱退回失败"); + } + + // 4. 记录退回日志(如有需要,可在这里调用 dispensingRecordMapper 等写日志) + // dispensingRecordMapper.insertReturnLog(...); + return true; } }