feat(分诊队列): 实现分诊队列核心功能与日志记录

新增分诊队列相关服务接口与实现,包括队列管理、叫号操作和日志记录
添加DivLogService和CallRecordService用于记录分诊操作和叫号历史
在CurrentDayEncounterDto和TriageQueueItem中增加seqNo字段用于显示预约序号
实现分诊操作日志记录功能,包括添加队列、移除队列、叫号、完成等操作
新增CallType枚举定义叫号类型,并实现叫号记录功能
优化队列状态映射逻辑,支持更多状态类型显示
This commit is contained in:
wangjian963
2026-04-29 17:05:17 +08:00
parent 2b0acce1db
commit d4d05267ad
19 changed files with 933 additions and 303 deletions

View File

@@ -61,4 +61,9 @@ public interface ScheduleSlotMapper extends BaseMapper<ScheduleSlot> {
*/
List<DoctorAvailabilityDTO> selectDoctorAvailabilitySummary(@Param("query") TicketQueryDTO query);
/**
* 批量查询槽位序号(用于分诊叫号显示)
*/
List<ScheduleSlot> selectSeqNoBySlotIds(@Param("slotIds") List<Long> slotIds);
}

View File

@@ -0,0 +1,42 @@
package com.openhis.triageandqueuemanage.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.time.LocalDateTime;
@Data
@Accessors(chain = true)
@TableName(value = "call_record")
@EqualsAndHashCode(callSuper = false)
public class CallRecord {
@TableId(type = IdType.AUTO)
private Long recordId;
/** 队列ID (FK triage_queue_item.id) */
private Long queueId;
/** 医生ID */
private Long doctorId;
/** 叫号时间 */
private LocalDateTime callTime;
/**
* 叫号类型,使用 {@link com.openhis.common.enums.CallType} 枚举值
* 10-CALL(选呼), 20-NEXT(下一患者), 30-AUTO_CALL(自动叫号),
* 40-SKIP(跳过), 50-COMPLETE(完成), 60-REQUEUE(重排)
*/
private String callType;
/** 诊室(冗余) */
private String room;
/** 创建时间 */
private LocalDateTime createAt;
}

View File

@@ -0,0 +1,41 @@
package com.openhis.triageandqueuemanage.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.time.LocalDateTime;
@Data
@Accessors(chain = true)
@TableName(value = "div_log")
@EqualsAndHashCode(callSuper = false)
public class DivLog {
@TableId(type = IdType.AUTO)
private Long logId;
/** 号源池ID */
private Long poolId;
/** 号源槽位ID */
private Long slotId;
/** 操作人ID */
private Long opUserId;
/** 操作动作ADD_QUEUE/REMOVE_QUEUE/CALL/REFUND/COMPLETE/SKIP/REQUEUE */
private String action;
/** 操作时间 */
private LocalDateTime createTime;
/** 更新时间 */
private LocalDateTime updateAt;
/** 创建时间 */
private LocalDateTime createdAt;
}

View File

@@ -1,6 +1,7 @@
package com.openhis.triageandqueuemanage.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@@ -40,7 +41,10 @@ public class TriageQueueItem {
* 30=COMPLETED(已完成), 40=SKIPPED(已跳过), 50=REFUNDED(已退费), 60=FOLLOW(已随访)
*/
private Integer status;
private Integer queueOrder; //排队序号”,也就是患者在当前科室、当天队列里的 顺序号(从 1 开始递增)。
private Integer queueOrder; //排队序号”,也就是患者在当前科室、当天队列里的 顺序号(从 1 开始递增)。
@TableField(exist = false)
private Integer seqNo; // 预约序号(来自 adm_schedule_slot.seq_no非数据库字段通过 JOIN 查询)
private LocalDateTime createTime;
private LocalDateTime updateTime;

View File

@@ -0,0 +1,9 @@
package com.openhis.triageandqueuemanage.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.openhis.triageandqueuemanage.domain.CallRecord;
import org.springframework.stereotype.Repository;
@Repository
public interface CallRecordMapper extends BaseMapper<CallRecord> {
}

View File

@@ -0,0 +1,9 @@
package com.openhis.triageandqueuemanage.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.openhis.triageandqueuemanage.domain.DivLog;
import org.springframework.stereotype.Repository;
@Repository
public interface DivLogMapper extends BaseMapper<DivLog> {
}

View File

@@ -0,0 +1,7 @@
package com.openhis.triageandqueuemanage.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.openhis.triageandqueuemanage.domain.CallRecord;
public interface CallRecordService extends IService<CallRecord> {
}

View File

@@ -0,0 +1,7 @@
package com.openhis.triageandqueuemanage.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.openhis.triageandqueuemanage.domain.DivLog;
public interface DivLogService extends IService<DivLog> {
}

View File

@@ -0,0 +1,11 @@
package com.openhis.triageandqueuemanage.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.openhis.triageandqueuemanage.domain.CallRecord;
import com.openhis.triageandqueuemanage.mapper.CallRecordMapper;
import com.openhis.triageandqueuemanage.service.CallRecordService;
import org.springframework.stereotype.Service;
@Service
public class CallRecordServiceImpl extends ServiceImpl<CallRecordMapper, CallRecord> implements CallRecordService {
}

View File

@@ -0,0 +1,11 @@
package com.openhis.triageandqueuemanage.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.openhis.triageandqueuemanage.domain.DivLog;
import com.openhis.triageandqueuemanage.mapper.DivLogMapper;
import com.openhis.triageandqueuemanage.service.DivLogService;
import org.springframework.stereotype.Service;
@Service
public class DivLogServiceImpl extends ServiceImpl<DivLogMapper, DivLog> implements DivLogService {
}

View File

@@ -437,5 +437,15 @@
p.doctor_name ASC
</select>
<select id="selectSeqNoBySlotIds" resultType="com.openhis.appointmentmanage.domain.ScheduleSlot">
SELECT id, seq_no
FROM adm_schedule_slot
WHERE id IN
<foreach collection="slotIds" item="slotId" open="(" separator="," close=")">
#{slotId}
</foreach>
AND delete_flag = '0'
</select>
</mapper>