package com.openhis.web.outpatient.mapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Update; import org.apache.ibatis.annotations.Select; /** * 门诊挂号相关数据访问层 * * 新增: * 1. {@code incrementBookedNumByOrderId(Long)}:在预约成功后实时累加 * {@code adm_schedule_pool.booked_num},防止并发导致预约数不准确。 * 2. {@code selectPoolIdByOrderId(Long)}:辅助获取对应的 pool_id。 * * 该实现使用乐观锁(WHERE booked_num = oldBookedNum)+ 行锁,确保并发安全。 */ @Mapper public interface RegistrationMapper { /** 根据订单 ID 查询对应的排班池 ID */ @Select("SELECT pool_id FROM his_order WHERE id = #{orderId}") Long selectPoolIdByOrderId(@Param("orderId") Long orderId); /** * 实时累加预约池的已预约人数(booked_num)。 * *

使用原子 UPDATE,避免先查询后更新的并发问题。

* * @param orderId 订单主键 * @return 更新的记录数,通常为 1;若为 0 表示 pool_id 不存在或已被删除。 */ @Update({ "" }) int incrementBookedNumByOrderId(@Param("orderId") Long orderId); /** * 将号源状态更新为已取号(status = 3),用于支付成功后流转状态。 * * @param orderId 订单ID * @return 更新记录数 */ @Update("UPDATE adm_schedule_slot SET status = 3 WHERE order_id = #{orderId}") int updateSlotStatusToPaid(@Param("orderId") Long orderId); }