Fix Bug #561: fallback修复
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
// 其它业务方法保持不变...
|
||||
}
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user