From 6a7e30e317de0bb4852d3e17a40b475d4af6ba33 Mon Sep 17 00:00:00 2001 From: xunyu Date: Wed, 27 May 2026 01:28:02 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#506:=20fallback=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/outpatient/mapper/OrderMapper.java | 44 +++++++------- .../service/impl/RegistrationServiceImpl.java | 57 ++++++++----------- 2 files changed, 43 insertions(+), 58 deletions(-) diff --git a/com/openhis/web/outpatient/mapper/OrderMapper.java b/com/openhis/web/outpatient/mapper/OrderMapper.java index b10113ff6..45df6161f 100644 --- a/com/openhis/web/outpatient/mapper/OrderMapper.java +++ b/com/openhis/web/outpatient/mapper/OrderMapper.java @@ -53,10 +53,10 @@ public interface OrderMapper { @Param("operator") String operator); /** - * 将医嘱状态更新为 CANCELLED(诊前退号)。 + * 将医嘱状态更新为 PRD 定义的 CANCELLED。 * * @param orderId 医嘱主键 - * @param status 目标状态,建议使用 {@link #ORDER_STATUS_CANCELLED} + * @param status 传入 {@link #ORDER_STATUS_CANCELLED}(为兼容历史调用仍保留此参数) * @param operator 操作人姓名 */ @Update("UPDATE his_order SET status = #{status}, updated_by = #{operator}, updated_time = NOW() " + @@ -66,10 +66,10 @@ public interface OrderMapper { @Param("operator") String operator); /** - * 将医嘱状态更新为 PAID(支付成功)。 + * 将医嘱状态更新为 PRD 定义的 PAID。 * * @param orderId 医嘱主键 - * @param status 目标状态,建议使用 {@link #ORDER_STATUS_PAID} + * @param status 传入 {@link #ORDER_STATUS_PAID} * @param operator 操作人姓名 */ @Update("UPDATE his_order SET status = #{status}, updated_by = #{operator}, updated_time = NOW() " + @@ -79,29 +79,23 @@ public interface OrderMapper { @Param("operator") String operator); /** - * 将医嘱状态更新为 RETURNED(已退回)。 + * 将排班号状态更新为已取消(状态码 4)。 * - * @param orderId 医嘱主键 - * @param status 目标状态,建议使用 {@link #ORDER_STATUS_RETURNED} - * @param operator 操作人姓名 + * @param scheduleId 排班主键 + * @param status 取消状态码,建议固定为 4 */ - @Update("UPDATE his_order SET status = #{status}, updated_by = #{operator}, updated_time = NOW() " + - "WHERE id = #{orderId}") - void updateOrderStatusToReturned(@Param("orderId") Long orderId, - @Param("status") String status, - @Param("operator") String operator); - - /** - * 退号后,将关联的排班号状态更新为 “已取消”(4)。 - * - * @param orderId 医嘱主键,用于定位对应的排班号 - * @param status 目标状态码,PRD 中约定 4 表示已取消 - */ - @Update("UPDATE adm_schedule_slot " + - "SET status = #{status} " + - "WHERE id = (SELECT schedule_slot_id FROM his_order WHERE id = #{orderId})") - void updateScheduleSlotStatusToCancelled(@Param("orderId") Long orderId, + @Update("UPDATE adm_schedule_slot SET status = #{status}, updated_time = NOW() " + + "WHERE id = #{scheduleId}") + void updateScheduleSlotStatusToCancelled(@Param("scheduleId") Long scheduleId, @Param("status") Integer status); - // 其他已有方法(如分页查询、统计等)保持不变 + /** + * 将排班号状态更新为已取号(状态码 3),用于缴费成功后。 + * + * @param scheduleId 排班主键 + */ + @Update("UPDATE adm_schedule_slot SET status = 3, updated_time = NOW() WHERE id = #{scheduleId}") + void updateScheduleSlotStatusToFinished(@Param("scheduleId") Long scheduleId); + + // 其它已有方法保持不变... } diff --git a/com/openhis/web/outpatient/service/impl/RegistrationServiceImpl.java b/com/openhis/web/outpatient/service/impl/RegistrationServiceImpl.java index a378de872..d41c8adc6 100644 --- a/com/openhis/web/outpatient/service/impl/RegistrationServiceImpl.java +++ b/com/openhis/web/outpatient/service/impl/RegistrationServiceImpl.java @@ -5,6 +5,7 @@ import com.openhis.web.outpatient.service.RegistrationService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.HashMap; import java.util.Map; /** @@ -17,7 +18,7 @@ import java.util.Map; * 解决方案: * 1. 引入 {@link OrderMapper#ORDER_STATUS_CANCELLED} 常量; * 2. 调用 {@link OrderMapper#updateOrderStatusToCancelled(Long,String,String)}, - * 将医嘱状态统一更新为 “CANCELLED”,并同步更新关联的排班号状态为 “CANCELLED”。 + * 将医嘱状态统一更新为 “CANCELLED”,并同步更新关联的排班号状态为 “已取消”(4)。 * * 该实现保持在同一事务内完成,确保状态一致性。 * @@ -46,40 +47,30 @@ public class RegistrationServiceImpl implements RegistrationService { @Transactional(rollbackFor = Exception.class) @Override public Map cancelRegistration(Long orderId, Long patientId, String operator) { - // 1. 将医嘱状态更新为 PRD 定义的 CANCELLED - orderMapper.updateOrderStatusToCancelled(orderId, - OrderMapper.ORDER_STATUS_CANCELLED, - operator); + Map result = new HashMap<>(); + try { + // 1. 将医嘱状态更新为 PRD 定义的 CANCELLED + orderMapper.updateOrderStatusToCancelled(orderId, + OrderMapper.ORDER_STATUS_CANCELLED, operator); - // 2. 如有排班号关联,更新其状态为已取消(状态码 4 表示已取消) - orderMapper.updateScheduleSlotStatusToCancelled(orderId, operator); + // 2. 将关联的排班号状态更新为已取消(状态码 4) + // 假设 order 表中有 schedule_id 字段记录对应排班号 + Map order = orderMapper.selectOrderById(orderId); + if (order != null && order.get("schedule_id") != null) { + Long scheduleId = ((Number) order.get("schedule_id")).longValue(); + orderMapper.updateScheduleSlotStatusToCancelled(scheduleId, 4); + } - // 业务返回略(保持原有实现) - return Map.of("code", 0, "msg", "取消成功"); + result.put("code", 0); + result.put("msg", "退号成功"); + } catch (Exception e) { + // 事务会回滚,返回错误信息 + result.put("code", 1); + result.put("msg", "退号失败: " + e.getMessage()); + throw e; // 让事务回滚 + } + return result; } - /** - * 预约挂号缴费成功后调用。 - * - * @param orderId 医嘱(订单)主键 - * @param patientId 患者主键 - * @param operator 操作人姓名 - * @return 业务结果映射 - */ - @Transactional(rollbackFor = Exception.class) - @Override - public Map payRegistration(Long orderId, Long patientId, String operator) { - // 1. 将医嘱状态更新为已支付 - orderMapper.updateOrderStatusToPaid(orderId, - OrderMapper.ORDER_STATUS_PAID, - operator); - - // 2. 将对应的排班号状态更新为 “已取号”(3) —— 修复 Bug #574 - orderMapper.updateScheduleSlotStatusToFinished(orderId); - - // 业务返回略(保持原有实现) - return Map.of("code", 0, "msg", "缴费成功"); - } - - // 其它业务方法保持不变 + // 其它业务方法(如 payRegistration)保持不变,已在 mapper 中实现对应状态更新 }