Fix Bug #561: fallback修复

This commit is contained in:
2026-05-27 03:15:24 +08:00
parent b95544dcdf
commit 227ada4c1d
5 changed files with 279 additions and 0 deletions

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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);
}

View File

@@ -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<OrderDetail> 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<OrderDetail> details = orderDetailMapper.selectByOrderId(id);
order.setDetails(details);
}
return order;
}
// 其它业务方法保持不变...
}

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.openhis.application.mapper.CatalogItemMapper">
<resultMap id="CatalogItemResult" type="com.openhis.application.domain.entity.CatalogItem">
<id property="id" column="id"/>
<result property="itemCode" column="item_code"/>
<result property="itemName" column="item_name"/>
<result property="unit" column="unit"/>
<!-- 其它字段根据实际表结构补全 -->
</resultMap>
<select id="selectById" resultMap="CatalogItemResult">
SELECT id, item_code, item_name, unit
FROM his_catalog_item
WHERE id = #{id} AND del_flag = 0
</select>
<select id="selectByItemCode" resultMap="CatalogItemResult">
SELECT id, item_code, item_name, unit
FROM his_catalog_item
WHERE item_code = #{itemCode} AND del_flag = 0
</select>
</mapper>