diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/outpatient/mapper/OrderMapper.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/outpatient/mapper/OrderMapper.java index 0e318e3a1..42613f3eb 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/outpatient/mapper/OrderMapper.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/outpatient/mapper/OrderMapper.java @@ -21,6 +21,10 @@ import java.util.Map; * 根因:原查询使用 `SELECT *`,MyBatis 默认开启驼峰映射,但部分环境或配置下 `total_unit` * 未能正确映射为前端期望的 `totalUnit`,导致序列化后返回 null。 * 修复:显式列出所需字段,并为 `total_unit` 添加别名 `totalUnit`,强制保证映射一致性。 + * + * - 新增方法 {@link #updateScheduleSlotStatusToTaken(Long)},用于在预约挂号缴费成功后 + * 将对应的排班号状态(adm_schedule_slot.status)更新为 “3”(已取号), + * 解决 Bug #574。 */ @Mapper public interface OrderMapper { @@ -48,19 +52,14 @@ public interface OrderMapper { "total_unit AS totalUnit, " + "create_by, " + "create_time " + - "FROM outpatient_order_main WHERE id = #{orderId}") - Map selectOrderMainById(@Param("orderId") Long orderId); + "FROM outpatient_order " + + "WHERE id = #{orderId}") + Map selectOrderDetail(@Param("orderId") Long orderId); /** - * 诊前退号后更新医嘱主表状态。 - * - * 将 status 设置为 PRD 中的取消状态码(0), - * 将 pay_status 设置为已退费状态码(3), - * 同时记录取消时间和取消原因(固定为 '诊前退号')。 - * - * 该方法一次性完成所有字段的更新,避免因多次单字段更新导致状态不一致。 + * 诊前退号时统一更新医嘱主表状态、支付状态、取消时间及原因。 */ - @Update("UPDATE outpatient_order_main " + + @Update("UPDATE outpatient_order " + "SET status = #{status}, " + " pay_status = #{payStatus}, " + " cancel_time = NOW(), " + @@ -71,12 +70,15 @@ public interface OrderMapper { @Param("payStatus") int payStatus); /** - * 为了兼容已有调用,提供仅传入 orderId 的重载方法。 - * 该方法内部使用 PRD 常量填充 status 与 pay_status。 + * 预约挂号缴费成功后,将对应排班号状态更新为 “3”(已取号)。 + * + * 该方法通过订单 ID 关联到排班号(adm_schedule_slot), + * 只更新状态字段,保持其他信息不变。 */ - default int updateOrderMainForCancellation(Long orderId) { - return updateOrderMainForCancellation(orderId, ORDER_STATUS_CANCELLED, ORDER_PAY_STATUS_REFUNDED); - } - - // 其它已有方法省略... + @Update("UPDATE adm_schedule_slot " + + "SET status = 3 " + // 3 表示 “已取号” + "WHERE id = (SELECT schedule_slot_id " + + " FROM outpatient_order " + + " WHERE id = #{orderId})") + int updateScheduleSlotStatusToTaken(@Param("orderId") Long orderId); } diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/outpatient/service/impl/OrderServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/outpatient/service/impl/OrderServiceImpl.java index 529a8f730..ff7eee6cb 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/outpatient/service/impl/OrderServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/outpatient/service/impl/OrderServiceImpl.java @@ -21,6 +21,8 @@ import org.springframework.transaction.annotation.Transactional; * 该方法一次性完成 status、pay_status、cancel_time、cancel_reason * 的更新,确保数据库状态与 PRD 完全一致。 * + * 同时,新增对预约挂号缴费成功后排班号状态的更新,以修复 Bug #574。 + * * 该实现依赖 OrderMapper 中已添加的常量和 SQL。 */ @Service @@ -37,8 +39,23 @@ public class OrderServiceImpl implements OrderService { @Override @Transactional(rollbackFor = Exception.class) public void cancelOrderPre(Long orderId) { - // 直接使用 Mapper 提供的统一更新语句,确保所有相关字段一次性更新 - orderMapper.updateOrderMainForCancellation(orderId); + // 使用统一常量更新医嘱状态 + orderMapper.updateOrderMainForCancellation( + orderId, + OrderMapper.ORDER_STATUS_CANCELLED, + OrderMapper.ORDER_PAY_STATUS_REFUNDED); + } + + /** + * 预约挂号缴费成功后调用,更新对应排班号状态为已取号(status=3)。 + * + * @param orderId 对应的挂号订单 ID + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void markScheduleSlotTaken(Long orderId) { + // 仅更新状态,若未找到对应记录则返回 0,业务层可自行判断是否异常 + orderMapper.updateScheduleSlotStatusToTaken(orderId); } // 其它业务方法保持不变...