232 预约管理-》门诊预约挂号:打开界面报错且无医生排班预约号源数据

This commit is contained in:
HuangXinQuan
2026-03-26 17:09:08 +08:00
parent 3f0fa3bbb3
commit 11cf88fd49
22 changed files with 1411 additions and 764 deletions

View File

@@ -2,8 +2,39 @@ package com.openhis.appointmentmanage.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.openhis.appointmentmanage.domain.SchedulePool;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;
import org.springframework.stereotype.Repository;
@Repository
public interface SchedulePoolMapper extends BaseMapper<SchedulePool> {
/**
* 按号源池实时重算统计值,避免并发场景下计数漂移。
*
* 说明available_num 在当前项目中可能为数据库生成列,因此这里仅维护
* booked_num / locked_num剩余号由数据库或查询逻辑计算。
*/
@Update("""
UPDATE adm_schedule_pool p
SET
booked_num = COALESCE((
SELECT COUNT(1)
FROM adm_schedule_slot s
WHERE s.pool_id = p.id
AND s.delete_flag = '0'
AND s.status = 1
), 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
), 0),
update_time = now()
WHERE p.id = #{poolId}
AND p.delete_flag = '0'
""")
int refreshPoolStats(@Param("poolId") Long poolId);
}

View File

@@ -1,10 +1,53 @@
package com.openhis.appointmentmanage.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.openhis.appointmentmanage.domain.DoctorAvailabilityDTO;
import com.openhis.appointmentmanage.domain.ScheduleSlot;
import com.openhis.appointmentmanage.domain.TicketSlotDTO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.openhis.appointmentmanage.dto.TicketQueryDTO;
import java.util.List;
import org.springframework.stereotype.Repository;
import org.apache.ibatis.annotations.Param;
@Repository
public interface ScheduleSlotMapper extends BaseMapper<ScheduleSlot> {
//
// 多表查询排班信息展示来预约挂号
List<TicketSlotDTO> selectAllTicketSlots();
/**
* 根据槽位ID精确查出完整的聚合信息
*/
TicketSlotDTO selectTicketSlotById(@Param("id") Long id);
/**
* 原子抢占槽位:仅当当前状态=0(可用)时更新为1(已预约)。
*/
int lockSlotForBooking(@Param("slotId") Long slotId);
/**
* 按主键更新槽位状态。
*/
int updateSlotStatus(@Param("slotId") Long slotId, @Param("status") Integer status);
/**
* 根据槽位ID查询所属号源池ID。
*/
Long selectPoolIdBySlotId(@Param("slotId") Long slotId);
/**
* 预约成功后回填对应订单ID到号源槽位。
*/
int bindOrderToSlot(@Param("slotId") Long slotId, @Param("orderId") Long orderId);
/**
* 带分页和动态条件过滤的真实查询接口
*/
Page<TicketSlotDTO> selectTicketSlotsPage(Page<TicketSlotDTO> page, @Param("query") TicketQueryDTO query);
/**
* 按号源池聚合医生余号(不受分页影响)。
*/
List<DoctorAvailabilityDTO> selectDoctorAvailabilitySummary(@Param("query") TicketQueryDTO query);
}