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 orderInfo = orderMapper.selectOrderById(orderId); if (orderInfo == null || orderInfo.get("slot_id") == null) { throw new RuntimeException("未能获取订单对应的号源 slot_id,orderId=" + orderId); } Long slotId = ((Number) orderInfo.get("slot_id")).longValue(); // 3. 将号源状态更新为已取号(status = 3) int slotUpdated = registrationMapper.updateSlotStatusToPaid(slotId); if (slotUpdated == 0) { throw new RuntimeException("号源状态更新为已取号失败,slotId=" + slotId); } // 4. 实时累加排班池已预约数量(Bug #575 已在其他提交实现,此处保持调用以确保完整性) registrationMapper.incrementBookedNumByOrderId(orderId); } }