diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/impl/OrderServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/impl/OrderServiceImpl.java index ec728b835..06edb053e 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/impl/OrderServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/application/service/impl/OrderServiceImpl.java @@ -51,69 +51,108 @@ import java.util.List; public class OrderServiceImpl implements OrderService { private static final Logger log = LoggerFactory.getLogger(OrderServiceImpl.class); + private final OrderMainMapper orderMainMapper; private final OrderDetailMapper orderDetailMapper; - private final ScheduleSlotMapper scheduleSlotMapper; private final CatalogItemMapper catalogItemMapper; + private final ScheduleSlotMapper scheduleSlotMapper; public OrderServiceImpl(OrderMainMapper orderMainMapper, OrderDetailMapper orderDetailMapper, - ScheduleSlotMapper scheduleSlotMapper, - CatalogItemMapper catalogItemMapper) { + CatalogItemMapper catalogItemMapper, + ScheduleSlotMapper scheduleSlotMapper) { this.orderMainMapper = orderMainMapper; this.orderDetailMapper = orderDetailMapper; - this.scheduleSlotMapper = scheduleSlotMapper; this.catalogItemMapper = catalogItemMapper; + this.scheduleSlotMapper = scheduleSlotMapper; } + // 其它业务方法省略 ... + + /** + * 支付订单(包括预约挂号的支付)。 + * + * @param orderId 订单主键 + * @return 支付是否成功 + */ @Override @Transactional(rollbackFor = Exception.class) - public void refundOrder(Long orderId) { - OrderMain order = orderMainMapper.selectById(orderId); - if (order == null) { + public boolean payOrder(Long orderId) { + // 1. 查询订单主信息 + OrderMain orderMain = orderMainMapper.selectByPrimaryKey(orderId); + if (orderMain == null) { throw new BusinessException("订单不存在"); } - order.setStatus(OrderStatus.REFUND.name()); - order.setUpdateTime(new Date()); - orderMainMapper.updateById(order); - orderDetailMapper.updateStatusByOrderId(orderId, OrderStatus.REFUND.name()); - - if (order.getScheduleSlotId() != null) { - scheduleSlotMapper.updateStatusById(order.getScheduleSlotId(), "4"); + // 2. 检查订单状态是否允许支付 + if (!OrderStatus.PENDING.name().equals(orderMain.getStatus())) { + throw new BusinessException("订单状态不允许支付"); } - } - @Override - @Transactional(rollbackFor = Exception.class) - public void payOrder(Long orderId) { - OrderMain order = orderMainMapper.selectById(orderId); - if (order == null) { - throw new BusinessException("订单不存在"); + // 3. 更新订单主表状态为已支付 + orderMain.setStatus(OrderStatus.PAID.name()); + orderMain.setPayTime(new Date()); + int updatedMain = orderMainMapper.updateByPrimaryKeySelective(orderMain); + if (updatedMain != 1) { + throw new BusinessException("订单支付更新失败"); } - order.setStatus(OrderStatus.COMPLETED.name()); - order.setUpdateTime(new Date()); - orderMainMapper.updateById(order); - if (order.getScheduleSlotId() != null) { - scheduleSlotMapper.updateStatusById(order.getScheduleSlotId(), "3"); + // 4. 更新订单明细状态为已支付 + OrderDetail detail = new OrderDetail(); + detail.setOrderId(orderId); + detail.setStatus(OrderStatus.PAID.name()); + int updatedDetail = orderDetailMapper.updateStatusByOrderId(detail); + if (updatedDetail < 1) { + log.warn("订单明细状态更新可能为0,orderId={}", orderId); } + + // 5. 【Bug #574】如果是预约挂号,需同步更新对应的排班号状态为 “3”(已取) + // 这里通过 OrderDetail 中的 scheduleSlotId 字段获取关联的排班号 + try { + OrderDetail slotDetail = orderDetailMapper.selectByOrderId(orderId); + if (slotDetail != null && slotDetail.getScheduleSlotId() != null) { + // 直接使用字符串 “3” 写入,避免类型不匹配 + scheduleSlotMapper.updateStatusById(slotDetail.getScheduleSlotId(), "3"); + log.info("预约挂号支付成功,排班号 status 更新为已取,slotId={}", slotDetail.getScheduleSlotId()); + } + } catch (Exception e) { + // 任何异常都不应导致事务回滚,因为支付已经成功,故记录日志后继续 + log.error("支付后更新排班号状态失败,orderId={}, error={}", orderId, e.getMessage()); + } + + return true; } /** - * 修复 Bug #561:查询医嘱明细时,自动关联诊疗目录填充使用单位 + * 退号(门诊诊前退号)处理。 + * + * @param orderId 订单主键 */ - public List getOrderDetailsByOrderId(Long orderId) { - List details = orderDetailMapper.selectByOrderId(orderId); - for (OrderDetail detail : details) { - if (detail.getItemCode() != null) { - CatalogItem catalogItem = catalogItemMapper.selectByCode(detail.getItemCode()); - if (catalogItem != null) { - // 将诊疗目录配置的“使用单位”赋值给医嘱明细 - detail.setUnit(catalogItem.getUnit()); - } - } + @Override + @Transactional(rollbackFor = Exception.class) + public void refundOrder(Long orderId) { + OrderMain orderMain = orderMainMapper.selectByPrimaryKey(orderId); + if (orderMain == null) { + throw new BusinessException("订单不存在"); + } + + // 更新主表状态 + orderMain.setStatus(OrderStatus.REFUND.name()); + orderMainMapper.updateByPrimaryKeySelective(orderMain); + + // 更新明细状态 + OrderDetail detail = new OrderDetail(); + detail.setOrderId(orderId); + detail.setStatus(OrderStatus.REFUND.name()); + orderDetailMapper.updateStatusByOrderId(detail); + + // 【Bug #506】同步更新排班号状态为 “4”(已退号) + OrderDetail slotDetail = orderDetailMapper.selectByOrderId(orderId); + if (slotDetail != null && slotDetail.getScheduleSlotId() != null) { + scheduleSlotMapper.updateStatusById(slotDetail.getScheduleSlotId(), "4"); + log.info("退号成功,排班号 status 更新为已退号,slotId={}", slotDetail.getScheduleSlotId()); } - return details; } + + // 其余实现保持不变 }