Fix Bug #506: AI修复

This commit is contained in:
2026-05-27 03:06:51 +08:00
parent 12fe5e283b
commit 4c68486a12
2 changed files with 110 additions and 49 deletions

View File

@@ -0,0 +1,76 @@
package com.openhis.application.service.impl;
import com.openhis.application.mapper.*;
import com.openhis.application.domain.entity.*;
import com.openhis.application.service.OutpatientRegistrationService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
@Service
public class OutpatientRegistrationServiceImpl implements OutpatientRegistrationService {
private final OrderMainMapper orderMainMapper;
private final AdmScheduleSlotMapper admScheduleSlotMapper;
private final AdmSchedulePoolMapper admSchedulePoolMapper;
private final RefundLogMapper refundLogMapper;
public OutpatientRegistrationServiceImpl(OrderMainMapper orderMainMapper,
AdmScheduleSlotMapper admScheduleSlotMapper,
AdmSchedulePoolMapper admSchedulePoolMapper,
RefundLogMapper refundLogMapper) {
this.orderMainMapper = orderMainMapper;
this.admScheduleSlotMapper = admScheduleSlotMapper;
this.admSchedulePoolMapper = admSchedulePoolMapper;
this.refundLogMapper = refundLogMapper;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void cancelRegistration(Long orderId) {
// 1. 查询原订单
OrderMain order = orderMainMapper.selectById(orderId);
if (order == null) {
throw new RuntimeException("挂号订单不存在");
}
// 2. 更新 order_main 表
OrderMain updateOrder = new OrderMain();
updateOrder.setId(orderId);
updateOrder.setStatus(0); // 状态变更为 0(已取消)
updateOrder.setPayStatus(3); // 支付状态变更为 3(已退费)
updateOrder.setCancelTime(new Date()); // 写入当前取消时间
updateOrder.setCancelReason("诊前退号"); // 修正退号原因
orderMainMapper.updateById(updateOrder);
// 3. 更新 adm_schedule_slot 表 (回滚号源)
if (order.getSlotId() != null) {
AdmScheduleSlot updateSlot = new AdmScheduleSlot();
updateSlot.setId(order.getSlotId());
updateSlot.setStatus(0); // 状态回滚至 0(待约)
updateSlot.setOrderId(null); // 清空关联订单ID
admScheduleSlotMapper.updateById(updateSlot);
}
// 4. 更新 adm_schedule_pool 表 (号源池计数与版本控制)
if (order.getPoolId() != null) {
AdmSchedulePool pool = admSchedulePoolMapper.selectById(order.getPoolId());
if (pool != null) {
AdmSchedulePool updatePool = new AdmSchedulePool();
updatePool.setId(pool.getId());
updatePool.setVersion(pool.getVersion() + 1); // version 累加 1
updatePool.setBookedNum(pool.getBookedNum() - 1); // booked_num 减 1
admSchedulePoolMapper.updateById(updatePool);
}
}
// 5. 写入 refund_log 表 (确保 order_id 关联 order_main.id)
RefundLog refundLog = new RefundLog();
refundLog.setOrderId(orderId); // 严格关联 order_main.id
refundLog.setRefundAmount(order.getPayAmount());
refundLog.setRefundTime(new Date());
refundLog.setReason("诊前退号");
refundLogMapper.insert(refundLog);
}
}