package com.openhis.web.outpatient.service.impl; import com.openhis.web.outpatient.mapper.RegistrationMapper; import com.openhis.web.outpatient.mapper.OrderMapper; import com.openhis.web.outpatient.service.RegistrationService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; /** * 门诊挂号业务实现 * * 修复 Bug #574:在预约签到缴费成功后,调用 {@link RegistrationMapper#updateSlotStatusToPaid} * 将对应的 adm_schedule_slot.status 状态及时流转为 “3”(已取号)。 * * 修复 Bug #575:在预约成功后,调用 {@link RegistrationMapper#incrementBookedNumByOrderId} * 实时累加 adm_schedule_pool 表中的 booked_num 字段。 * * 该方法假设在支付成功的业务流程中被调用,确保状态同步。 */ @Service public class RegistrationServiceImpl implements RegistrationService { private final RegistrationMapper registrationMapper; private final OrderMapper orderMapper; public RegistrationServiceImpl(RegistrationMapper registrationMapper, OrderMapper orderMapper) { this.registrationMapper = registrationMapper; this.orderMapper = orderMapper; } /** * 预约签到缴费成功后处理逻辑 * * @param orderId 订单ID */ @Override @Transactional(rollbackFor = Exception.class) public void handlePaymentSuccess(Long orderId) { if (orderId == null) { throw new IllegalArgumentException("订单ID不能为空"); } // 1. 更新订单状态为已支付(此处使用 OrderMapper 中新增的常量) int orderUpdated = orderMapper.updateOrderStatusToPaid(orderId, OrderMapper.ORDER_STATUS_PAID); if (orderUpdated == 0) { throw new RuntimeException("订单状态更新为已支付失败,orderId=" + orderId); } // 2. 将对应的号源状态更新为已取号(status = 3),修复 Bug #574 int slotUpdated = registrationMapper.updateSlotStatusToPaid(orderId); if (slotUpdated == 0) { throw new RuntimeException("号源状态更新为已取号失败,orderId=" + orderId); } // 3. 实时累加排班池已预约数量,修复 Bug #575 int poolUpdated = registrationMapper.incrementBookedNumByOrderId(orderId); if (poolUpdated == 0) { // 这里不抛异常,仅记录日志,防止业务回滚导致已支付订单状态不一致 // 业务层可根据需要补偿 System.err.println("警告:预约数量累加失败,orderId=" + orderId); } } }