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; import java.util.Map; /** * 门诊挂号业务实现 * * 修复 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. 获取订单关联的号源 slot_id Map order = orderMapper.selectOrderById(orderId); if (order == null) { throw new RuntimeException("未找到对应订单,orderId=" + orderId); } Object slotIdObj = order.get("slot_id"); if (slotIdObj == null) { throw new RuntimeException("订单未关联号源,无法更新号源状态,orderId=" + orderId); } Long slotId = Long.valueOf(String.valueOf(slotIdObj)); // 3. 将对应的号源状态更新为已取号(status = 3),修复 Bug #574 int slotUpdated = registrationMapper.updateSlotStatusToPaid(slotId); if (slotUpdated == 0) { throw new RuntimeException("号源状态更新为已取号失败,slotId=" + slotId); } // 4. 同步累加排班池已预约数量,修复 Bug #575 int poolUpdated = registrationMapper.incrementBookedNumByOrderId(orderId); if (poolUpdated == 0) { throw new RuntimeException("排班池已预约数量累加失败,orderId=" + orderId); } } }