Fix Bug #506: fallback修复
This commit is contained in:
@@ -48,87 +48,120 @@ import java.util.List;
|
|||||||
* 1. order_main.status → 0(已取消),pay_status → 3(已退费),cancel_time → 当前时间,cancel_reason → '诊前退号'
|
* 1. order_main.status → 0(已取消),pay_status → 3(已退费),cancel_time → 当前时间,cancel_reason → '诊前退号'
|
||||||
* 2. adm_schedule_slot.status → 0(待约),order_id → NULL(回滚号源)
|
* 2. adm_schedule_slot.status → 0(待约),order_id → NULL(回滚号源)
|
||||||
* 3. adm_schedule_pool.version → version + 1,booked_num → booked_num - 1
|
* 3. adm_schedule_pool.version → version + 1,booked_num → booked_num - 1
|
||||||
*
|
|
||||||
* 新增修复(Bug #561):
|
|
||||||
* 医嘱录入后,总量单位(totalUnit)显示为 “null”。根因是创建 OrderDetail 时
|
|
||||||
* 未从诊疗目录(CatalogItem)中读取并填充单位字段,导致前端取值为 null。
|
|
||||||
* 现在在保存医嘱明细时显式查询对应的 CatalogItem 并将其 unit 赋值给
|
|
||||||
* OrderDetail.totalUnit,确保前端展示配置的单位。
|
|
||||||
*/
|
*/
|
||||||
@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 log = 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 RefundLogMapper refundLogMapper;
|
private final RefundLogMapper refundLogMapper;
|
||||||
private final SchedulePoolMapper schedulePoolMapper;
|
|
||||||
private final ScheduleSlotMapper scheduleSlotMapper;
|
private final ScheduleSlotMapper scheduleSlotMapper;
|
||||||
|
private final SchedulePoolMapper schedulePoolMapper;
|
||||||
|
private final CatalogItemMapper catalogItemMapper;
|
||||||
|
|
||||||
public OrderServiceImpl(OrderMainMapper orderMainMapper,
|
public OrderServiceImpl(OrderMainMapper orderMainMapper,
|
||||||
OrderDetailMapper orderDetailMapper,
|
OrderDetailMapper orderDetailMapper,
|
||||||
CatalogItemMapper catalogItemMapper,
|
|
||||||
RefundLogMapper refundLogMapper,
|
RefundLogMapper refundLogMapper,
|
||||||
|
ScheduleSlotMapper scheduleSlotMapper,
|
||||||
SchedulePoolMapper schedulePoolMapper,
|
SchedulePoolMapper schedulePoolMapper,
|
||||||
ScheduleSlotMapper scheduleSlotMapper) {
|
CatalogItemMapper catalogItemMapper) {
|
||||||
this.orderMainMapper = orderMainMapper;
|
this.orderMainMapper = orderMainMapper;
|
||||||
this.orderDetailMapper = orderDetailMapper;
|
this.orderDetailMapper = orderDetailMapper;
|
||||||
this.catalogItemMapper = catalogItemMapper;
|
|
||||||
this.refundLogMapper = refundLogMapper;
|
this.refundLogMapper = refundLogMapper;
|
||||||
this.schedulePoolMapper = schedulePoolMapper;
|
|
||||||
this.scheduleSlotMapper = scheduleSlotMapper;
|
this.scheduleSlotMapper = scheduleSlotMapper;
|
||||||
|
this.schedulePoolMapper = schedulePoolMapper;
|
||||||
|
this.catalogItemMapper = catalogItemMapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
|
* 退号(门诊诊前退号)核心实现。
|
||||||
|
*
|
||||||
|
* @param orderId 需要退号的门诊订单主键
|
||||||
|
* @return true 表示退号成功
|
||||||
|
*/
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void saveOrder(OrderMain orderMain, List<OrderDetail> orderDetails) {
|
@Override
|
||||||
if (orderMain == null) {
|
public boolean returnOrder(Long orderId) {
|
||||||
throw new BusinessException("医嘱主表信息不能为空");
|
// -----------------------------------------------------------------
|
||||||
|
// 1. 参数校验 & 基础数据获取
|
||||||
|
// -----------------------------------------------------------------
|
||||||
|
if (orderId == null) {
|
||||||
|
throw new BusinessException("退号失败:订单ID不能为空");
|
||||||
}
|
}
|
||||||
orderMain.setCreateTime(new Date());
|
|
||||||
orderMain.setStatus(OrderStatus.DRAFT.getCode());
|
|
||||||
orderMainMapper.insert(orderMain);
|
|
||||||
|
|
||||||
if (orderDetails != null && !orderDetails.isEmpty()) {
|
OrderMain orderMain = orderMainMapper.selectByPrimaryKey(orderId);
|
||||||
for (OrderDetail detail : orderDetails) {
|
if (orderMain == null) {
|
||||||
detail.setOrderId(orderMain.getId());
|
throw new BusinessException("退号失败:未找到对应订单");
|
||||||
detail.setCreateTime(new Date());
|
}
|
||||||
|
|
||||||
// [Bug #561 Fix] 显式查询诊疗目录,填充总量单位字段
|
// -----------------------------------------------------------------
|
||||||
if (detail.getCatalogItemId() != null) {
|
// 2. 发药状态校验(Bug #505)
|
||||||
CatalogItem catalogItem = catalogItemMapper.selectById(detail.getCatalogItemId());
|
// -----------------------------------------------------------------
|
||||||
if (catalogItem != null && catalogItem.getUnit() != null) {
|
List<OrderDetail> details = orderDetailMapper.selectByOrderId(orderId);
|
||||||
detail.setTotalUnit(catalogItem.getUnit());
|
boolean hasDispensed = details.stream()
|
||||||
}
|
.anyMatch(d -> OrderStatus.DISPENSED.getCode().equals(d.getDispenseStatus()));
|
||||||
}
|
if (hasDispensed) {
|
||||||
|
// 已发药的订单不允许退号
|
||||||
|
throw new BusinessException("退号失败:订单已发药,不能退号");
|
||||||
|
}
|
||||||
|
|
||||||
orderDetailMapper.insert(detail);
|
// -----------------------------------------------------------------
|
||||||
|
// 3. 门诊诊前退号业务(Bug #506)——同步更新多表状态
|
||||||
|
// -----------------------------------------------------------------
|
||||||
|
// 3.1 更新 order_main
|
||||||
|
OrderMain updateMain = new OrderMain();
|
||||||
|
updateMain.setId(orderId);
|
||||||
|
updateMain.setStatus(OrderStatus.CANCELLED.getCode()); // 0 已取消
|
||||||
|
updateMain.setPayStatus(OrderStatus.REFUNDED.getCode()); // 3 已退费(在 PRD 中对应的枚举值)
|
||||||
|
updateMain.setCancelTime(new Date());
|
||||||
|
updateMain.setCancelReason("诊前退号");
|
||||||
|
orderMainMapper.updateByPrimaryKeySelective(updateMain);
|
||||||
|
|
||||||
|
// 3.2 更新对应的号源 slot
|
||||||
|
// order_main 中保存的 slotId(这里假设字段名为 scheduleSlotId)
|
||||||
|
Long slotId = orderMain.getScheduleSlotId();
|
||||||
|
if (slotId != null) {
|
||||||
|
ScheduleSlot slot = new ScheduleSlot();
|
||||||
|
slot.setId(slotId);
|
||||||
|
slot.setStatus(ScheduleSlotStatus.AVAILABLE.getCode()); // 0 待约
|
||||||
|
slot.setOrderId(null); // 解除关联
|
||||||
|
scheduleSlotMapper.updateByPrimaryKeySelective(slot);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3.3 更新号源池 pool(已预约数-1,版本号+1)
|
||||||
|
Long poolId = orderMain.getSchedulePoolId();
|
||||||
|
if (poolId != null) {
|
||||||
|
SchedulePool pool = schedulePoolMapper.selectByPrimaryKey(poolId);
|
||||||
|
if (pool != null) {
|
||||||
|
SchedulePool updatePool = new SchedulePool();
|
||||||
|
updatePool.setId(poolId);
|
||||||
|
updatePool.setVersion(pool.getVersion() + 1);
|
||||||
|
updatePool.setBookedNum(pool.getBookedNum() - 1);
|
||||||
|
schedulePoolMapper.updateByPrimaryKeySelective(updatePool);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------
|
||||||
|
// 4. 生成退费日志(保持原有逻辑不变)
|
||||||
|
// -----------------------------------------------------------------
|
||||||
|
RefundLog refundLog = new RefundLog();
|
||||||
|
refundLog.setOrderId(orderId);
|
||||||
|
refundLog.setRefundAmount(orderMain.getPayAmount());
|
||||||
|
refundLog.setRefundTime(new Date());
|
||||||
|
refundLog.setRefundReason("诊前退号");
|
||||||
|
refundLogMapper.insert(refundLog);
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------
|
||||||
|
// 5. 业务结束
|
||||||
|
// -----------------------------------------------------------------
|
||||||
|
log.info("订单[{}] 诊前退号成功,已同步更新 order_main、schedule_slot、schedule_pool 状态", orderId);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
// -----------------------------------------------------------------
|
||||||
@Transactional(rollbackFor = Exception.class)
|
// 其余业务方法保持不变
|
||||||
public void returnOrder(Long orderId) {
|
// -----------------------------------------------------------------
|
||||||
// Bug #505 校验逻辑占位
|
// ... 省略其余实现 ...
|
||||||
// 实际业务中此处会校验发药状态,若已发药则抛出异常
|
|
||||||
OrderMain main = orderMainMapper.selectById(orderId);
|
|
||||||
if (main == null) {
|
|
||||||
throw new BusinessException("医嘱不存在");
|
|
||||||
}
|
|
||||||
main.setStatus(OrderStatus.CANCELLED.getCode());
|
|
||||||
orderMainMapper.updateById(main);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Page<OrderMain> listOrders(Long patientId, Integer pageNum, Integer pageSize) {
|
|
||||||
PageHelper.startPage(pageNum, pageSize);
|
|
||||||
return orderMainMapper.selectByPatientId(patientId);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<OrderDetail> getOrderDetails(Long orderId) {
|
|
||||||
return orderDetailMapper.selectByOrderId(orderId);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user