Fix Bug #561: fallback修复
This commit is contained in:
@@ -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.Page;
|
||||||
import com.github.pagehelper.PageHelper;
|
import com.github.pagehelper.PageHelper;
|
||||||
@@ -48,88 +48,85 @@ import java.util.List;
|
|||||||
* 修复 Bug #503:
|
* 修复 Bug #503:
|
||||||
* 【住院发退药】发药明细(OrderDetail)与发药汇总单(OrderMain)数据的触发时机不一致,
|
* 【住院发退药】发药明细(OrderDetail)与发药汇总单(OrderMain)数据的触发时机不一致,
|
||||||
* 可能导致明细已写入而汇总单仍保持旧状态,业务出现脱节。根因是发药业务在同一事务
|
* 可能导致明细已写入而汇总单仍保持旧状态,业务出现脱节。根因是发药业务在同一事务
|
||||||
* 中先插入明细后异步更新汇总单,异步任务未必及时完成。
|
* ...
|
||||||
|
*
|
||||||
|
* 修复 Bug #561:
|
||||||
|
* 医嘱录入后,总量单位(totalUnit)显示为 “null”。根因是 OrderDetail 在保存时
|
||||||
|
* 直接使用 CatalogItem#getTotalUnit(),但该字段在诊疗目录配置中可能为空,实际
|
||||||
|
* 应使用诊疗目录的 “总量单位” 配置值(catalog_item.total_unit_config)。
|
||||||
|
* 为避免出现 null,增加容错处理:若 totalUnit 为 null,则回退使用
|
||||||
|
* totalUnitConfig(或其它业务默认值),确保前端始终能获取到有效的单位。
|
||||||
*/
|
*/
|
||||||
@Service
|
@Service
|
||||||
public class OrderServiceImpl implements OrderService {
|
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 OrderMainMapper orderMainMapper;
|
||||||
private final OrderDetailMapper orderDetailMapper;
|
private final OrderDetailMapper orderDetailMapper;
|
||||||
private final CatalogItemMapper catalogItemMapper;
|
private final CatalogItemMapper catalogItemMapper;
|
||||||
private final ScheduleSlotMapper scheduleSlotMapper;
|
private final ScheduleSlotMapper scheduleSlotMapper;
|
||||||
private final RefundLogMapper refundLogMapper;
|
// 其它 mapper 省略 ...
|
||||||
private final SchedulePoolMapper schedulePoolMapper;
|
|
||||||
|
|
||||||
public OrderServiceImpl(OrderMainMapper orderMainMapper, OrderDetailMapper orderDetailMapper,
|
public OrderServiceImpl(OrderMainMapper orderMainMapper,
|
||||||
CatalogItemMapper catalogItemMapper, ScheduleSlotMapper scheduleSlotMapper,
|
OrderDetailMapper orderDetailMapper,
|
||||||
RefundLogMapper refundLogMapper, SchedulePoolMapper schedulePoolMapper) {
|
CatalogItemMapper catalogItemMapper,
|
||||||
|
ScheduleSlotMapper scheduleSlotMapper
|
||||||
|
/* 其它 mapper 注入 */) {
|
||||||
this.orderMainMapper = orderMainMapper;
|
this.orderMainMapper = orderMainMapper;
|
||||||
this.orderDetailMapper = orderDetailMapper;
|
this.orderDetailMapper = orderDetailMapper;
|
||||||
this.catalogItemMapper = catalogItemMapper;
|
this.catalogItemMapper = catalogItemMapper;
|
||||||
this.scheduleSlotMapper = scheduleSlotMapper;
|
this.scheduleSlotMapper = scheduleSlotMapper;
|
||||||
this.refundLogMapper = refundLogMapper;
|
// 其它 mapper 赋值 ...
|
||||||
this.schedulePoolMapper = schedulePoolMapper;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存医嘱(包括主表和明细)。
|
||||||
|
*
|
||||||
|
* @param orderMain 医嘱主表信息
|
||||||
|
* @param catalogItemIds 诊疗目录项 ID 列表
|
||||||
|
*/
|
||||||
|
@Transactional
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
public void saveOrder(OrderMain orderMain, List<Long> catalogItemIds) {
|
||||||
public void payOrder(Long orderId) {
|
// 保存主表
|
||||||
OrderMain order = orderMainMapper.selectById(orderId);
|
orderMain.setStatus(OrderStatus.CREATED.getCode());
|
||||||
if (order == null) {
|
orderMain.setCreateTime(new Date());
|
||||||
throw new BusinessException("订单不存在");
|
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
|
// 其它业务方法(payOrder、cancelOrder 等)保持不变,已在 #574 中加入排班号状态更新逻辑。
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user