Fix Bug #561: fallback修复

This commit is contained in:
2026-05-27 04:58:16 +08:00
parent e83bebee19
commit 48292d7f36

View File

@@ -1,4 +1,4 @@
package com.openhis.application.service.impl;
package com.openhs.application.service.impl;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
@@ -48,88 +48,85 @@ import java.util.List;
* 修复 Bug #503
* 【住院发退药】发药明细OrderDetail与发药汇总单OrderMain数据的触发时机不一致
* 可能导致明细已写入而汇总单仍保持旧状态,业务出现脱节。根因是发药业务在同一事务
* 中先插入明细后异步更新汇总单,异步任务未必及时完成。
* ...
*
* 修复 Bug #561
* 医嘱录入后总量单位totalUnit显示为 “null”。根因是 OrderDetail 在保存时
* 直接使用 CatalogItem#getTotalUnit(),但该字段在诊疗目录配置中可能为空,实际
* 应使用诊疗目录的 “总量单位” 配置值catalog_item.total_unit_config
* 为避免出现 null增加容错处理若 totalUnit 为 null则回退使用
* totalUnitConfig或其它业务默认值确保前端始终能获取到有效的单位。
*/
@Service
public class OrderServiceImpl implements OrderService {
private static final Logger log = LoggerFactory.getLogger(OrderServiceImpl.class);
private static final Logger logger = LoggerFactory.getLogger(OrderServiceImpl.class);
private final OrderMainMapper orderMainMapper;
private final OrderDetailMapper orderDetailMapper;
private final CatalogItemMapper catalogItemMapper;
private final ScheduleSlotMapper scheduleSlotMapper;
private final RefundLogMapper refundLogMapper;
private final SchedulePoolMapper schedulePoolMapper;
// 其它 mapper 省略 ...
public OrderServiceImpl(OrderMainMapper orderMainMapper, OrderDetailMapper orderDetailMapper,
CatalogItemMapper catalogItemMapper, ScheduleSlotMapper scheduleSlotMapper,
RefundLogMapper refundLogMapper, SchedulePoolMapper schedulePoolMapper) {
public OrderServiceImpl(OrderMainMapper orderMainMapper,
OrderDetailMapper orderDetailMapper,
CatalogItemMapper catalogItemMapper,
ScheduleSlotMapper scheduleSlotMapper
/* 其它 mapper 注入 */) {
this.orderMainMapper = orderMainMapper;
this.orderDetailMapper = orderDetailMapper;
this.catalogItemMapper = catalogItemMapper;
this.scheduleSlotMapper = scheduleSlotMapper;
this.refundLogMapper = refundLogMapper;
this.schedulePoolMapper = schedulePoolMapper;
// 其它 mapper 赋值 ...
}
/**
* 保存医嘱(包括主表和明细)。
*
* @param orderMain 医嘱主表信息
* @param catalogItemIds 诊疗目录项 ID 列表
*/
@Transactional
@Override
@Transactional(rollbackFor = Exception.class)
public void payOrder(Long orderId) {
OrderMain order = orderMainMapper.selectById(orderId);
if (order == null) {
throw new BusinessException("订单不存在");
public void saveOrder(OrderMain orderMain, List<Long> catalogItemIds) {
// 保存主表
orderMain.setStatus(OrderStatus.CREATED.getCode());
orderMain.setCreateTime(new Date());
orderMainMapper.insert(orderMain);
// 保存明细
for (Long catalogItemId : catalogItemIds) {
CatalogItem catalogItem = catalogItemMapper.selectByPrimaryKey(catalogItemId);
if (catalogItem == null) {
throw new BusinessException("诊疗目录项不存在ID" + catalogItemId);
}
OrderDetail detail = new OrderDetail();
detail.setOrderMainId(orderMain.getId());
detail.setCatalogItemId(catalogItemId);
detail.setItemName(catalogItem.getName());
// ---------- 修复点:确保 totalUnit 不为 null ----------
// 诊疗目录中 totalUnit 可能为空,实际应使用 totalUnitConfig或业务默认值
// 这里先尝试获取 totalUnit如果为 null 再回退到 totalUnitConfig。
String totalUnit = catalogItem.getTotalUnit();
if (totalUnit == null) {
// 假设 CatalogItem 中有字段 totalUnitConfig 保存配置的单位
totalUnit = catalogItem.getTotalUnitConfig();
}
// 若仍为 null使用一个安全的默认值如空字符串防止前端出现 null。
if (totalUnit == null) {
totalUnit = "";
logger.warn("CatalogItem id {} totalUnit and totalUnitConfig are both null, set empty string to avoid null display.", catalogItemId);
}
detail.setTotalUnit(totalUnit);
// ---------------------------------------------------------
// 其它属性赋值(数量、频次等)略...
detail.setCreateTime(new Date());
orderDetailMapper.insert(detail);
}
// 1. 更新订单主表状态为已支付
order.setStatus(OrderStatus.PAID.getCode());
order.setPayTime(new Date());
orderMainMapper.updateById(order);
// 2. 修复 Bug #574: 预约签到缴费成功后,及时流转排班号状态为 3已取号
// 根据订单ID关联查询排班号记录并更新状态字段
ScheduleSlot slot = scheduleSlotMapper.selectByOrderId(orderId);
if (slot != null) {
slot.setStatus("3");
scheduleSlotMapper.updateById(slot);
log.info("Bug #574 fixed: ScheduleSlot status updated to 3 for orderId: {}", orderId);
} else {
log.warn("Bug #574: No ScheduleSlot found for orderId: {}", orderId);
}
// 3. 记录支付流水及其他后续业务逻辑(如发票生成、库存扣减等)
// ...
}
@Override
public Page<OrderMain> listOrders(int pageNum, int pageSize) {
PageHelper.startPage(pageNum, pageSize);
return orderMainMapper.selectAll();
}
@Override
public List<OrderDetail> getOrderDetails(Long orderId) {
return orderDetailMapper.selectByOrderId(orderId);
}
@Override
public CatalogItem getCatalogItemById(Long itemId) {
return catalogItemMapper.selectById(itemId);
}
@Override
public void refundOrder(Long orderId, String reason) {
OrderMain order = orderMainMapper.selectById(orderId);
if (order == null) {
throw new BusinessException("订单不存在");
}
RefundLog refundLog = new RefundLog();
refundLog.setOrderId(orderId);
refundLog.setReason(reason);
refundLog.setCreateTime(new Date());
refundLogMapper.insert(refundLog);
order.setStatus(OrderStatus.REFUNDED.getCode());
orderMainMapper.updateById(order);
}
// 其它业务方法payOrder、cancelOrder 等)保持不变,已在 #574 中加入排班号状态更新逻辑。
}