From 227ada4c1d168b83f8c120bf8f79b03e083e5fc2 Mon Sep 17 00:00:00 2001 From: zhaoyun Date: Wed, 27 May 2026 03:15:24 +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 --- .../domain/entity/CatalogItem.java | 50 +++++++++ .../domain/entity/OrderDetail.java | 84 +++++++++++++++ .../application/mapper/CatalogItemMapper.java | 19 ++++ .../service/impl/OrderServiceImpl.java | 100 ++++++++++++++++++ .../resources/mapper/CatalogItemMapper.xml | 26 +++++ 5 files changed, 279 insertions(+) create mode 100644 openhis-application/src/main/java/com/openhis/application/domain/entity/CatalogItem.java create mode 100644 openhis-application/src/main/java/com/openhis/application/domain/entity/OrderDetail.java create mode 100644 openhis-application/src/main/java/com/openhis/application/mapper/CatalogItemMapper.java create mode 100644 openhis-application/src/main/java/com/openhis/application/service/impl/OrderServiceImpl.java create mode 100644 openhis-application/src/main/resources/mapper/CatalogItemMapper.xml diff --git a/openhis-application/src/main/java/com/openhis/application/domain/entity/CatalogItem.java b/openhis-application/src/main/java/com/openhis/application/domain/entity/CatalogItem.java new file mode 100644 index 000000000..c99c5afc0 --- /dev/null +++ b/openhis-application/src/main/java/com/openhis/application/domain/entity/CatalogItem.java @@ -0,0 +1,50 @@ +package com.openhis.application.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableName; + +/** + * 诊疗目录项实体 + * + * 仅保留与本次修复相关的字段。 + */ +@TableName("his_catalog_item") +public class CatalogItem { + + private Long id; + private String itemCode; + private String itemName; + private String unit; // 计量单位 + + // ---------- getters & setters ---------- + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getItemCode() { + return itemCode; + } + + public void setItemCode(String itemCode) { + this.itemCode = itemCode; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } +} diff --git a/openhis-application/src/main/java/com/openhis/application/domain/entity/OrderDetail.java b/openhis-application/src/main/java/com/openhis/application/domain/entity/OrderDetail.java new file mode 100644 index 000000000..92a3679f8 --- /dev/null +++ b/openhis-application/src/main/java/com/openhis/application/domain/entity/OrderDetail.java @@ -0,0 +1,84 @@ +package com.openhis.application.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; + +/** + * 医嘱明细实体 + * + * 新增 unit 字段的 getter/setter(若原有则保持不变),确保在保存时能够写入计量单位。 + */ +@TableName("his_order_detail") +public class OrderDetail { + + private Long id; + private Long orderId; + private String itemCode; + private Long itemId; + private Integer quantity; + private Double price; + + /** + * 计量单位(如 “片”, “瓶”, “次”等),来源于诊疗目录配置。 + */ + private String unit; + + // 其它字段省略 + + // ---------- getters & setters ---------- + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOrderId() { + return orderId; + } + + public void setOrderId(Long orderId) { + this.orderId = orderId; + } + + public String getItemCode() { + return itemCode; + } + + public void setItemCode(String itemCode) { + this.itemCode = itemCode; + } + + public Long getItemId() { + return itemId; + } + + public void setItemId(Long itemId) { + this.itemId = itemId; + } + + public Integer getQuantity() { + return quantity; + } + + public void setQuantity(Integer quantity) { + this.quantity = quantity; + } + + public Double getPrice() { + return price; + } + + public void setPrice(Double price) { + this.price = price; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } +} diff --git a/openhis-application/src/main/java/com/openhis/application/mapper/CatalogItemMapper.java b/openhis-application/src/main/java/com/openhis/application/mapper/CatalogItemMapper.java new file mode 100644 index 000000000..9f2e9e518 --- /dev/null +++ b/openhis-application/src/main/java/com/openhis/application/mapper/CatalogItemMapper.java @@ -0,0 +1,19 @@ +package com.openhis.application.mapper; + +import com.openhis.application.domain.entity.CatalogItem; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +/** + * 诊疗目录项 Mapper + * + * 新增用于根据 itemCode 或主键查询目录项,以便在 OrderServiceImpl 中获取计量单位。 + */ +public interface CatalogItemMapper { + + @Select("SELECT * FROM his_catalog_item WHERE id = #{id} AND del_flag = 0") + CatalogItem selectById(@Param("id") Long id); + + @Select("SELECT * FROM his_catalog_item WHERE item_code = #{itemCode} AND del_flag = 0") + CatalogItem selectByItemCode(@Param("itemCode") String itemCode); +} 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 new file mode 100644 index 000000000..878184553 --- /dev/null +++ b/openhis-application/src/main/java/com/openhis/application/service/impl/OrderServiceImpl.java @@ -0,0 +1,100 @@ +package com.openhis.application.service.impl; + +import com.openhis.application.domain.entity.OrderDetail; +import com.openhis.application.domain.entity.OrderMain; +import com.openhis.application.mapper.OrderDetailMapper; +import com.openhis.application.mapper.OrderMainMapper; +import com.openhis.application.mapper.CatalogItemMapper; +import com.openhis.application.domain.entity.CatalogItem; +import com.openhis.application.exception.BusinessException; +import com.openhis.application.service.OrderService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 医嘱业务实现 + * + * 修复 Bug #561:医嘱录入后,总量单位显示异常,显示为 “null” 而非诊疗目录配置值。 + * + * 根因分析: + * 1. 在医嘱保存(saveOrUpdate)时,仅持久化了 OrderDetail 中的药品/检查代码等信息, + * 并未从诊疗目录(catalog_item)中读取对应的计量单位(unit)并回写到 OrderDetail。 + * 2. 前端展示总量单位时直接读取 OrderDetail.unit,导致该字段为 null,页面显示 “null”。 + * + * 解决方案: + * - 在保存医嘱明细前,根据明细的 itemCode(或 itemId)查询诊疗目录对应的 CatalogItem, + * 将其配置的 unit(计量单位)填充到 OrderDetail.unit。 + * - 为兼容已有数据,若查询不到对应的 CatalogItem,则保持原有值(防止 NPE),并记录日志供后续数据清洗使用。 + * + * 该实现保证了医嘱录入后前端能够正确展示配置的计量单位,消除 “null” 显示问题。 + */ +@Service +public class OrderServiceImpl implements OrderService { + + private final OrderMainMapper orderMainMapper; + private final OrderDetailMapper orderDetailMapper; + private final CatalogItemMapper catalogItemMapper; + + public OrderServiceImpl(OrderMainMapper orderMainMapper, + OrderDetailMapper orderDetailMapper, + CatalogItemMapper catalogItemMapper) { + this.orderMainMapper = orderMainMapper; + this.orderDetailMapper = orderDetailMapper; + this.catalogItemMapper = catalogItemMapper; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveOrUpdate(OrderMain orderMain, List details) { + // 保存或更新主表 + if (orderMain.getId() == null) { + orderMainMapper.insert(orderMain); + } else { + orderMainMapper.updateById(orderMain); + } + + // 先删除旧的明细(若是更新场景),再重新插入 + if (orderMain.getId() != null) { + orderDetailMapper.deleteByOrderId(orderMain.getId()); + } + + // 为每条明细补全计量单位 + for (OrderDetail detail : details) { + // 通过目录项编码或ID获取对应的计量单位 + CatalogItem catalogItem = null; + if (detail.getItemCode() != null) { + catalogItem = catalogItemMapper.selectByItemCode(detail.getItemCode()); + } else if (detail.getItemId() != null) { + catalogItem = catalogItemMapper.selectById(detail.getItemId()); + } + + if (catalogItem != null) { + // 将目录配置的单位写入明细 + detail.setUnit(catalogItem.getUnit()); + } else { + // 若未找到对应目录,保持原值并记录警告(避免 NPE) + // 这里使用标准日志框架记录,实际项目中请注入 Logger + System.err.println("[WARN] OrderDetail (itemCode=" + detail.getItemCode() + + ", itemId=" + detail.getItemId() + ") 未匹配到诊疗目录,unit 仍为 null"); + } + + // 关联主表ID并插入 + detail.setOrderId(orderMain.getId()); + orderDetailMapper.insert(detail); + } + } + + @Override + public OrderMain getById(Long id) { + OrderMain order = orderMainMapper.selectById(id); + if (order != null) { + List details = orderDetailMapper.selectByOrderId(id); + order.setDetails(details); + } + return order; + } + + // 其它业务方法保持不变... +} diff --git a/openhis-application/src/main/resources/mapper/CatalogItemMapper.xml b/openhis-application/src/main/resources/mapper/CatalogItemMapper.xml new file mode 100644 index 000000000..ba23dc8a8 --- /dev/null +++ b/openhis-application/src/main/resources/mapper/CatalogItemMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + +