Fix: 门诊预约挂号→签到→退号 slot/pool 状态流转对齐需求
- 枚举重排: SlotStatus LOCKED=4→2, CANCELLED=2→4,匹配需求编号 - 预约: lockSlotForBooking 写入 LOCKED(2) 替代 BOOKED(1),pool locked_num+1 原子递增 - 签到: LOCKED(2)→BOOKED(1) 替代 CHECKED_IN(3),加前置状态校验 - 退号: 加 BOOKED(1) 前置校验 - 池计数: refreshPoolStats booked_num=COUNT(1), locked_num=COUNT(2) - SQL 状态值全部由 SlotStatus 枚举传入,消除硬编码 - 查询/显示: 加 locked 筛选分支,BOOKED→已取号, LOCKED→已锁定 - 前端常量同步,签到列表查询 book→locked
This commit is contained in:
@@ -10,10 +10,11 @@ import org.springframework.stereotype.Repository;
|
||||
public interface SchedulePoolMapper extends BaseMapper<SchedulePool> {
|
||||
|
||||
/**
|
||||
* 按号源池实时重算统计值,避免并发场景下计数漂移。
|
||||
* 按号源池实时重算统计值。
|
||||
*
|
||||
* 说明:available_num 在当前项目中可能为数据库生成列,因此这里仅维护
|
||||
* booked_num / locked_num,剩余号由数据库或查询逻辑计算。
|
||||
* @param poolId 号源池ID
|
||||
* @param bookedStatus 已约状态值,由 SlotStatus.BOOKED.getValue() 传入
|
||||
* @param lockedStatus 锁定状态值,由 SlotStatus.LOCKED.getValue() 传入
|
||||
*/
|
||||
@Update("""
|
||||
UPDATE adm_schedule_pool p
|
||||
@@ -23,20 +24,22 @@ public interface SchedulePoolMapper extends BaseMapper<SchedulePool> {
|
||||
FROM adm_schedule_slot s
|
||||
WHERE s.pool_id = p.id
|
||||
AND s.delete_flag = '0'
|
||||
AND s.status = 1
|
||||
AND s.status = #{bookedStatus}
|
||||
), 0),
|
||||
locked_num = COALESCE((
|
||||
SELECT COUNT(1)
|
||||
FROM adm_schedule_slot s
|
||||
WHERE s.pool_id = p.id
|
||||
AND s.delete_flag = '0'
|
||||
AND s.status = 3
|
||||
AND s.status = #{lockedStatus}
|
||||
), 0),
|
||||
update_time = now()
|
||||
WHERE p.id = #{poolId}
|
||||
AND p.delete_flag = '0'
|
||||
""")
|
||||
int refreshPoolStats(@Param("poolId") Long poolId);
|
||||
int refreshPoolStats(@Param("poolId") Long poolId,
|
||||
@Param("bookedStatus") Integer bookedStatus,
|
||||
@Param("lockedStatus") Integer lockedStatus);
|
||||
|
||||
/**
|
||||
* 签到时更新号源池统计:锁定数-1,已预约数+1
|
||||
|
||||
@@ -22,9 +22,12 @@ public interface ScheduleSlotMapper extends BaseMapper<ScheduleSlot> {
|
||||
TicketSlotDTO selectTicketSlotById(@Param("id") Long id);
|
||||
|
||||
/**
|
||||
* 原子抢占槽位:仅当当前状态=0(可用)时,更新为1(已预约)。
|
||||
* 原子抢占槽位:仅当当前状态=0(待约)时,更新为目标锁定状态。
|
||||
*
|
||||
* @param slotId 槽位ID
|
||||
* @param lockedStatus 锁定状态值,由 SlotStatus.LOCKED.getValue() 传入
|
||||
*/
|
||||
int lockSlotForBooking(@Param("slotId") Long slotId);
|
||||
int lockSlotForBooking(@Param("slotId") Long slotId, @Param("lockedStatus") Integer lockedStatus);
|
||||
|
||||
/**
|
||||
* 按主键更新槽位状态。
|
||||
@@ -34,12 +37,16 @@ public interface ScheduleSlotMapper extends BaseMapper<ScheduleSlot> {
|
||||
/**
|
||||
* 更新槽位状态并记录签到时间
|
||||
*
|
||||
* @param slotId 槽位ID
|
||||
* @param status 状态
|
||||
* @param checkInTime 签到时间
|
||||
* @param slotId 槽位ID
|
||||
* @param status 目标状态,由 SlotStatus.BOOKED.getValue() 传入
|
||||
* @param checkInTime 签到时间
|
||||
* @param requiredStatus 前置状态,由 SlotStatus.LOCKED.getValue() 传入
|
||||
* @return 结果
|
||||
*/
|
||||
int updateSlotStatusAndCheckInTime(@Param("slotId") Long slotId, @Param("status") Integer status, @Param("checkInTime") Date checkInTime);
|
||||
int updateSlotStatusAndCheckInTime(@Param("slotId") Long slotId,
|
||||
@Param("status") Integer status,
|
||||
@Param("checkInTime") Date checkInTime,
|
||||
@Param("requiredStatus") Integer requiredStatus);
|
||||
|
||||
/**
|
||||
* 根据槽位ID查询所属号源池ID。
|
||||
|
||||
Reference in New Issue
Block a user