Fix Bug #574: fallback修复

This commit is contained in:
2026-05-27 00:45:22 +08:00
parent 382c89ff9f
commit 5e05b41570
2 changed files with 47 additions and 35 deletions

View File

@@ -3,48 +3,43 @@ 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+ 行锁,确保并发安全
* 1. {@link #updateSlotStatusToPaid(Long)} 在预约签到缴费成功后,将对应的号源
* {@code adm_schedule_slot} 表的 {@code status} 字段更新为 3已取号
* 解决 Bug #574
* 2. {@link #incrementBookedNumByOrderId(Long)} 在预约成功后实时累加
* {@code adm_schedule_pool.booked_num},用于 Bug #575已在其他提交中实现
*/
@Mapper
public interface RegistrationMapper {
/** 根据订单 ID 查询对应的排班池 ID */
@Select("SELECT pool_id FROM his_order WHERE id = #{orderId}")
Long selectPoolIdByOrderId(@Param("orderId") Long orderId);
/**
* 将对应的号源状态更新为已取号status = 3
*
* @param slotId 号源主键 ID
* @return 受影响的行数
*/
@Update("UPDATE adm_schedule_slot SET status = 3 WHERE id = #{slotId}")
int updateSlotStatusToPaid(@Param("slotId") Long slotId);
/**
* 实时累加预约池的已预约人数booked_num
* 预约成功后,累加对应排班池的已预约数量
*
* <p>使用原子 UPDATE避免先查询后更新的并发问题。</p>
*
* @param orderId 订单主键
* @return 更新的记录数,通常为 1若为 0 表示 pool_id 不存在或已被删除。
* @param orderId 订单 ID用于关联到 adm_schedule_pool
* @return 受影响的行数
*/
@Update({
"<script>",
"UPDATE adm_schedule_pool",
"SET booked_num = booked_num + 1",
"WHERE id = (SELECT pool_id FROM his_order WHERE id = #{orderId})",
"</script>"
})
@Update("<script>" +
"UPDATE adm_schedule_pool " +
"SET booked_num = booked_num + 1 " +
"WHERE id = (" +
" SELECT pool_id FROM adm_schedule_slot WHERE id = (" +
" SELECT slot_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);
}