diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/appointment/service/AppointmentServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/appointment/service/AppointmentServiceImpl.java deleted file mode 100644 index a90f521d3..000000000 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/appointment/service/AppointmentServiceImpl.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.openhis.web.appointment.service; - -import com.openhis.web.appointment.entity.Appointment; -import com.openhis.web.appointment.mapper.AppointmentMapper; -import com.openhis.web.appointment.mapper.ScheduleSlotMapper; -import com.openhis.web.appointment.mapper.OrderMainMapper; -import com.openhis.web.appointment.mapper.SchedulePoolMapper; -import com.openhis.web.appointment.mapper.RefundLogMapper; -import com.openhis.web.appointment.dto.AppointmentParam; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * 门诊预约挂号服务实现 - */ -@Service -public class AppointmentServiceImpl implements AppointmentService { - - private final AppointmentMapper appointmentMapper; - private final ScheduleSlotMapper scheduleSlotMapper; - private final OrderMainMapper orderMainMapper; - private final SchedulePoolMapper schedulePoolMapper; - private final RefundLogMapper refundLogMapper; - - public AppointmentServiceImpl(AppointmentMapper appointmentMapper, - ScheduleSlotMapper scheduleSlotMapper, - OrderMainMapper orderMainMapper, - SchedulePoolMapper schedulePoolMapper, - RefundLogMapper refundLogMapper) { - this.appointmentMapper = appointmentMapper; - this.scheduleSlotMapper = scheduleSlotMapper; - this.orderMainMapper = orderMainMapper; - this.schedulePoolMapper = schedulePoolMapper; - this.refundLogMapper = refundLogMapper; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean createAppointment(AppointmentParam param) { - Appointment appointment = new Appointment(); - appointment.setPatientId(param.getPatientId()); - appointment.setScheduleId(param.getScheduleId()); - appointment.setDoctorId(param.getDoctorId()); - appointment.setDeptId(param.getDeptId()); - appointment.setVisitDate(param.getVisitDate()); - appointment.setCreateTime(LocalDateTime.now()); - - // 1. 保存预约记录 - appointmentMapper.insert(appointment); - - // 2. 累加号源池已预约数(已实现的原子操作) - schedulePoolMapper.incrementBookedNum(param.getScheduleId()); - - // 3. 创建订单并完成支付(简化示例,实际业务已在后续代码中实现) - Long orderId = orderMainMapper.insertOrder(appointment.getId(), - param.getAmount(), LocalDateTime.now()); - return orderId != null; - } - - /** - * Bug #574 Fix: 预约签到缴费成功后,更新号源时段状态为“已取号”(status=3) - * 修复原流程中遗漏调用 scheduleSlotMapper.updateStatusToTaken 导致状态滞留为 1 的问题 - * - * @param orderId 订单ID - * @param slotId 号源时段ID - * @return 是否更新成功 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public boolean checkInAndPay(Long orderId, Long slotId) { - if (orderId == null || slotId == null) { - throw new IllegalArgumentException("订单ID或号源时段ID不能为空"); - } - - // 核心修复:显式调用 Mapper 将 adm_schedule_slot.status 更新为 3(已取号/签到) - int rows = scheduleSlotMapper.updateStatusToTaken(slotId); - if (rows <= 0) { - throw new RuntimeException("更新号源时段状态失败,未找到对应记录或状态已变更"); - } - - // 此处可补充订单状态流转逻辑(如 orderMainMapper.updateOrderStatus(orderId, 2)) - return true; - } -} diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/outpatient/service/impl/AppointmentServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/outpatient/service/impl/AppointmentServiceImpl.java deleted file mode 100644 index 119bc77dd..000000000 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/outpatient/service/impl/AppointmentServiceImpl.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.openhis.web.outpatient.service.impl; - -import com.openhis.web.outpatient.mapper.AppointmentMapper; -import com.openhis.web.outpatient.mapper.OrderMapper; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -/** - * 预约挂号业务实现 - * - * 修复 Bug #506: - * 门诊诊前退号后,涉及的多表状态未按 PRD 定义同步更新,导致前端显示异常。 - * 现在在取消预约的业务路径中统一处理: - * 1. 将订单状态置为 “已取消”(4)。 - * 2. 将对应的 adm_schedule_slot.status 设回 “1”(可预约)。 - * 3. 将对应的 adm_schedule_pool.booked_num 递减 1。 - * - * 同时保持原有支付成功后的状态同步逻辑不变。 - */ -@Service -public class AppointmentServiceImpl { - - @Autowired - private OrderMapper orderMapper; - - @Autowired - private AppointmentMapper appointmentMapper; - - /** - * 预约缴费成功后调用。 - * - * @param orderId 预约订单ID - * @param slotId 对应的排班时段ID - */ - @Transactional(rollbackFor = Exception.class) - public void handlePaymentSuccess(Long orderId, Long slotId) { - // 1. 更新订单支付状态为 “已缴费”(2) - int orderUpdated = orderMapper.updatePayStatus(orderId, 2); - if (orderUpdated != 1) { - throw new IllegalStateException("Failed to update payment status for orderId: " + orderId); - } - - // 2. 将排班时段状态更新为已取号(3) - int slotUpdated = appointmentMapper.updateSlotStatus(slotId, 3); - if (slotUpdated != 1) { - throw new IllegalStateException("Failed to update slot status for slotId: " + slotId); - } - - // 3. 累加排班池已预约人数(已在支付成功时递增) - // 此处假设 slot 与 pool 已经关联,业务层可自行获取 poolId 并调用 - // appointmentMapper.updateBookedNum(poolId, 1); - } - - /** - * 门诊诊前退号(取消预约)处理。 - * - * @param orderId 预约订单ID - * @param slotId 对应的排班时段ID - * @param poolId 对应的排班池ID(用于 booked_num 调整) - */ - @Transactional(rollbackFor = Exception.class) - public void cancelPreRegistration(Long orderId, Long slotId, Long poolId) { - // 1. 将订单状态更新为 “已取消”(4) - int orderUpdated = orderMapper.updateOrderStatus(orderId, 4); - if (orderUpdated != 1) { - throw new IllegalStateException("Failed to cancel orderId: " + orderId); - } - - // 2. 将排班时段状态恢复为 “可预约”(1) - int slotUpdated = appointmentMapper.updateSlotStatus(slotId, 1); - if (slotUpdated != 1) { - throw new IllegalStateException("Failed to reset slot status for slotId: " + slotId); - } - - // 3. 已预约人数递减 1,防止 booked_num 超出实际可用数 - int poolUpdated = appointmentMapper.updateBookedNum(poolId, -1); - if (poolUpdated != 1) { - throw new IllegalStateException("Failed to decrement booked_num for poolId: " + poolId); - } - } -}