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. 更新订单状态为已支付(此处假设已有对应的 SQL) int orderUpdated = orderMapper.updateOrderStatusToPaid(orderId); 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. 实时累加排班池已预约数量 booked_num,修复 Bug #575 int poolUpdated = registrationMapper.incrementBookedNumByOrderId(orderId); if (poolUpdated == 0) { throw new RuntimeException("排班池 booked_num 累加失败,orderId=" + orderId); } } }