From 1f4bd6e329392867effc13aae378be74b23878cb Mon Sep 17 00:00:00 2001 From: zhaoyun Date: Wed, 27 May 2026 03:20:04 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#561:=20fallback=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/OrderServiceImpl.java | 46 ++++++++----------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/openhis-application/src/main/java/com/openhis/application/service/impl/OrderServiceImpl.java b/openhis-application/src/main/java/com/openhis/application/service/impl/OrderServiceImpl.java index 71c3c7f52..2f9a180f0 100644 --- a/openhis-application/src/main/java/com/openhis/application/service/impl/OrderServiceImpl.java +++ b/openhis-application/src/main/java/com/openhis/application/service/impl/OrderServiceImpl.java @@ -52,40 +52,32 @@ public class OrderServiceImpl implements OrderService { } // 2. 处理医嘱明细 - // a) 先删除旧的明细(如果是更新场景) + // 先删除原有明细(仅在更新时需要),再重新插入 if (orderMain.getId() != null) { - orderDetailMapper.deleteByOrderId(orderMain.getId()); + orderDetailMapper.deleteByOrderMainId(orderMain.getId()); } - // b) 为每条明细补全计量单位 + // 3. 为每条明细填充诊疗目录中的计量单位(unit) for (OrderDetail detail : details) { - // 若前端已经传入 unit,保持不变;否则尝试从诊疗目录获取 - if (detail.getUnit() == null || detail.getUnit().trim().isEmpty()) { - CatalogItem catalog = null; - try { - if (detail.getItemCode() != null && !detail.getItemCode().trim().isEmpty()) { - catalog = catalogItemMapper.selectByItemCode(detail.getItemCode()); - } else if (detail.getItemId() != null) { - catalog = catalogItemMapper.selectById(detail.getItemId()); - } - } catch (Exception e) { - log.warn("Failed to query CatalogItem for detail (orderId={}, itemCode={}, itemId={})", - orderMain.getId(), detail.getItemCode(), detail.getItemId(), e); - } - - if (catalog != null && catalog.getUnit() != null) { - detail.setUnit(catalog.getUnit()); - } else { - // 兼容旧数据,保持为空但记录日志,避免 NPE - log.info("Catalog unit not found for OrderDetail (orderId={}, itemCode={}, itemId={})", - orderMain.getId(), detail.getItemCode(), detail.getItemId()); - } + // 根据 itemCode(或 itemId)查询对应的目录项 + CatalogItem catalogItem = null; + if (detail.getItemCode() != null) { + catalogItem = catalogItemMapper.selectByItemCode(detail.getItemCode()); + } else if (detail.getItemId() != null) { + catalogItem = catalogItemMapper.selectById(detail.getItemId()); } - // 设置外键关联 - detail.setOrderId(orderMain.getId()); + if (catalogItem != null) { + // 将目录配置的计量单位写入明细 + detail.setUnit(catalogItem.getUnit()); + } else { + // 若未找到对应目录,记录日志并抛出业务异常,防止出现 unit 为 null 的情况 + log.warn("未找到对应的诊疗目录项,itemCode={}, itemId={}", detail.getItemCode(), detail.getItemId()); + throw new BusinessException("医嘱明细对应的诊疗目录不存在,请检查 itemCode/itemId"); + } - // 插入明细 + // 关联主表ID并插入 + detail.setOrderMainId(orderMain.getId()); orderDetailMapper.insert(detail); } }