51 lines
1.8 KiB
Java
51 lines
1.8 KiB
Java
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)。
|
||
*
|
||
* <p>使用原子 UPDATE,避免先查询后更新的并发问题。</p>
|
||
*
|
||
* @param orderId 订单主键
|
||
* @return 更新的记录数,通常为 1;若为 0 表示 pool_id 不存在或已被删除。
|
||
*/
|
||
@Update({
|
||
"<script>",
|
||
"UPDATE adm_schedule_pool",
|
||
"SET booked_num = booked_num + 1",
|
||
"WHERE id = (SELECT pool_id FROM his_order WHERE id = #{orderId})",
|
||
"</script>"
|
||
})
|
||
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);
|
||
}
|