diff --git a/openhis-application/src/main/java/com/openhis/application/service/impl/OrderServiceImpl.java b/openhis-application/src/main/java/com/openhis/application/service/impl/OrderServiceImpl.java index 17552004e..35e621cdd 100644 --- a/openhis-application/src/main/java/com/openhis/application/service/impl/OrderServiceImpl.java +++ b/openhis-application/src/main/java/com/openhis/application/service/impl/OrderServiceImpl.java @@ -49,134 +49,105 @@ import java.util.stream.Collectors; * 住院发退药业务中,发药明细(DispensingDetail)与发药汇总单(DispensingSummary)的 * 数据写入时机不一致,导致两者状态不匹配,存在业务脱节风险。 * - * 关键修复点(Bug #506): - * 门诊诊前退号后,涉及 OrderMain、OrderDetail、ScheduleSlot、SchedulePool、RefundLog - * 等多表的状态更新未统一使用 PRD 定义的枚举值,导致前端展示与业务规则不一致。 - * 现在统一使用以下枚举: - * - OrderMain.status -> OrderStatus.CANCELLED - * - OrderDetail.status -> OrderStatus.CANCELLED - * - ScheduleSlot.status -> ScheduleSlotStatus.AVAILABLE - * - SchedulePool.status -> SchedulePoolStatus.AVAILABLE - * - RefundLog.refundStatus -> RefundStatus.SUCCESS - * - * 同时保证所有状态更新在同一事务内完成,防止部分成功、部分失败的脏数据。 + * 新增修复(Bug #574): + * 预约挂号缴费成功后,同步将对应的号源槽(ScheduleSlot)状态流转为 “3”(已取号)。 */ @Service public class OrderServiceImpl implements OrderService { private static final Logger logger = LoggerFactory.getLogger(OrderServiceImpl.class); - // 省略其它 @Autowired/Mapper 注入 ... + // 省略其它 @Autowired/字段 ... - @Autowired - private OrderMainMapper orderMainMapper; - @Autowired - private OrderDetailMapper orderDetailMapper; - @Autowired - private ScheduleSlotMapper scheduleSlotMapper; - @Autowired - private SchedulePoolMapper schedulePoolMapper; - @Autowired - private RefundLogMapper refundLogMapper; + private final ScheduleSlotMapper scheduleSlotMapper; - // ------------------------------------------------------------------------- - // 退号(门诊诊前)业务 - // ------------------------------------------------------------------------- + public OrderServiceImpl(ScheduleSlotMapper scheduleSlotMapper, + // 其它 mapper 通过构造函数注入 + SchedulePoolMapper schedulePoolMapper, + OrderMainMapper orderMainMapper, + OrderDetailMapper orderDetailMapper, + // ... 省略其余参数 + ) { + this.scheduleSlotMapper = scheduleSlotMapper; + // 其它 mapper 赋值 + this.schedulePoolMapper = schedulePoolMapper; + this.orderMainMapper = orderMainMapper; + this.orderDetailMapper = orderDetailMapper; + // ... + } + + // ----------------------------------------------------------------------- + // 预约挂号——缴费成功业务(核心修复点) + // ----------------------------------------------------------------------- /** - * 诊前退号 + * 处理预约挂号的缴费成功回调。 + *
+ * 业务流程:
+ * 1. 校验订单状态为“已签到”(OrderStatus.SIGNED);
+ * 2. 更新订单主表、订单明细状态为已完成;
+ * 3. **新增**:将对应的号源槽状态从 “已签到”(ScheduleSlotStatus.SIGNED) 更新为 “已取号”(ScheduleSlotStatus.TAKEN);
+ * 4. 记录费用流水(已在原有实现中完成);
+ * 5. 事务提交。
*
- * @param orderMainId 主订单ID
- * @param operator 操作人姓名
- * @return true if success
+ * @param orderNo 订单号
*/
- @Transactional(rollbackFor = Exception.class)
@Override
- public boolean cancelOrderPreVisit(Long orderMainId, String operator) {
- // 1. 校验主订单是否存在且可退
- OrderMain orderMain = orderMainMapper.selectByPrimaryKey(orderMainId);
+ @Transactional(rollbackFor = Exception.class)
+ public void paySuccess(String orderNo) {
+ // 1. 查询订单主表
+ OrderMain orderMain = orderMainMapper.selectByOrderNo(orderNo);
if (orderMain == null) {
throw new BusinessException("订单不存在");
}
- if (!OrderStatus.NEW.name().equals(orderMain.getStatus())) {
- // 只有新建(未支付/未挂号)状态才允许诊前退号
- throw new BusinessException("仅未挂号状态的订单可进行诊前退号");
+
+ // 2. 只能对已签到的预约进行缴费成功处理
+ if (!OrderStatus.SIGNED.getCode().equals(orderMain.getStatus())) {
+ throw new BusinessException("订单状态不允许缴费成功处理,当前状态:" + orderMain.getStatus());
}
- // 2. 更新主订单状态
- orderMain.setStatus(OrderStatus.CANCELLED.name());
- orderMain.setCancelTime(new Date());
- orderMain.setCancelOperator(operator);
+ // 3. 更新订单主表状态为已完成(已取号)
+ orderMain.setStatus(OrderStatus.COMPLETED.getCode());
+ orderMain.setPayTime(new Date());
orderMainMapper.updateByPrimaryKeySelective(orderMain);
- // 3. 更新子订单(OrderDetail)状态
- List