jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/doctor/DoctorController.java
@@ -38,35 +38,16 @@ @Resource private QueueService queueService; @GetMapping("/finishpatient") @Operation(summary = "下一位患者") @Parameter(name = "roomId", description = "诊室编号", required = true, example = "116") @Parameter(name = "bedNo", description = "工位编号", required = true, example = "B2") @PreAuthorize("@ss.hasPermission('ecg:doctor:finishpatient')") public CommonResult<List<QueueRespVO>> finishPatient( @RequestParam("roomId") Long roomId, @RequestParam("bedNo") String bedNo) { queueService.finishPatient(roomId, bedNo); List<Byte> queueStatusList = new ArrayList<>(); queueStatusList.add(QueueStatusEnum.READY.getStatus()); queueStatusList.add(QueueStatusEnum.ONSTAGE.getStatus()); queueStatusList.add(QueueStatusEnum.PASSED.getStatus()); List<QueueDO> queueDOList = queueService.getDoctorQueueByStatus(roomId, bedNo, queueStatusList); return success(BeanUtils.toBean(queueDOList, QueueRespVO.class)); } @GetMapping("/nextpatient") @Operation(summary = "下一位患者") @GetMapping("/finish-next-patient") @Operation(summary = "完成、下一位患者") @Parameter(name = "roomId", description = "诊室编号", required = true, example = "116") @Parameter(name = "bedNo", description = "工位编号", required = true, example = "B2") @PreAuthorize("@ss.hasPermission('ecg:doctor:nextpatient')") public CommonResult<List<QueueRespVO>> nextPatient( public CommonResult<List<QueueRespVO>> finishNextPatient( @RequestParam("roomId") Long roomId, @RequestParam("bedNo") String bedNo) { queueService.nextPatient(roomId, bedNo); queueService.finishNextPatient(roomId, bedNo); List<Byte> queueStatusList = new ArrayList<>(); queueStatusList.add(QueueStatusEnum.READY.getStatus()); @@ -75,4 +56,41 @@ List<QueueDO> queueDOList = queueService.getDoctorQueueByStatus(roomId, bedNo, queueStatusList); return success(BeanUtils.toBean(queueDOList, QueueRespVO.class)); } @GetMapping("/pass-next-patient") @Operation(summary = "过号、下一位患者") @Parameter(name = "roomId", description = "诊室编号", required = true, example = "116") @Parameter(name = "bedNo", description = "工位编号", required = true, example = "B2") @PreAuthorize("@ss.hasPermission('ecg:doctor:nextpatient')") public CommonResult<List<QueueRespVO>> passNextPatient( @RequestParam("roomId") Long roomId, @RequestParam("bedNo") String bedNo) { queueService.passNextPatient(roomId, bedNo); List<Byte> queueStatusList = new ArrayList<>(); queueStatusList.add(QueueStatusEnum.READY.getStatus()); queueStatusList.add(QueueStatusEnum.ONSTAGE.getStatus()); queueStatusList.add(QueueStatusEnum.PASSED.getStatus()); List<QueueDO> queueDOList = queueService.getDoctorQueueByStatus(roomId, bedNo, queueStatusList); return success(BeanUtils.toBean(queueDOList, QueueRespVO.class)); } @GetMapping("/get-patient-list") @Operation(summary = "取患者列表") @Parameter(name = "roomId", description = "诊室编号", required = true, example = "116") @Parameter(name = "bedNo", description = "工位编号", required = true, example = "B2") @PreAuthorize("@ss.hasPermission('ecg:doctor:patientlist')") public CommonResult<List<QueueRespVO>> getPatientList( @RequestParam("roomId") Long roomId, @RequestParam("bedNo") String bedNo) { List<Byte> queueStatusList = new ArrayList<>(); queueStatusList.add(QueueStatusEnum.READY.getStatus()); queueStatusList.add(QueueStatusEnum.ONSTAGE.getStatus()); queueStatusList.add(QueueStatusEnum.PASSED.getStatus()); List<QueueDO> queueDOList = queueService.getDoctorQueueByStatus(roomId, bedNo, queueStatusList); return success(BeanUtils.toBean(queueDOList, QueueRespVO.class)); } } jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/queue/queueController.java
@@ -97,7 +97,15 @@ @PreAuthorize("@ss.hasPermission('ecg:queue:setting')") public CommonResult<Integer> openingSetting() { queueService.initQueue(); queueService.hurryup(); return success(0); } @GetMapping("/reorder") @Operation(summary = "开诊前一刻,对就诊准备的人员重新排序") @PreAuthorize("@ss.hasPermission('ecg:queue:setting')") public CommonResult<Integer> queueReorder() { queueService.reorderQueue(); return success(0); } } jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/queue/vo/queueRespVO.java
@@ -25,7 +25,7 @@ @Schema(description = "患者性别") @ExcelProperty("患者性别") private Boolean patGender; private Byte patGender; @Schema(description = "预约时间段", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("预约时间段") jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/mysql/queue/queueMapper.java
@@ -51,6 +51,15 @@ +"</script>") List<QueueStatisticDO> queueStatistic(@Param("statusList")List<Byte> statusList); @Select("<script>" + "SELECT * FROM lihu.queue where status in (" + " <foreach collection='statusList' separator=',' item='status'>" + " #{status} " + " </foreach> )" + " order by book_timeslot, create_time " + "</script>") List<QueueDO> getOrderedQueue(@Param("statusList")List<Byte> statusList); //@Update("update lihu.queue set status = #{newStatus} where pat_id = #{patId} ans status = #{curStatus} ") @Update("update lihu.queue set status = #{newStatus} where seq_num = \n" + @@ -67,7 +76,7 @@ " <foreach collection='statusList' separator=',' item='status'>" + " #{status} " + " </foreach> )" + " order by status desc" + " order by seq_num" + "</script>") List<QueueDO> getDoctorQueueByStatus(@Param("roomId")Long roomId, @Param("bedNo")String bedNo, @Param("statusList")List<Byte> statusList); } jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/queueService.java
@@ -68,6 +68,11 @@ void initQueue(); /** * 开诊前一刻,对 就诊准备的 人员 重新排序 */ void reorderQueue(); /** * 把医生候诊的队列塞满 */ void hurryup(); @@ -75,12 +80,12 @@ /** * 医生叫下一位患者 */ void nextPatient(Long roomId, String bedNo); void finishNextPatient(Long roomId, String bedNo); /** * 医生看完患者 */ void finishPatient(Long roomId, String bedNo); void passNextPatient(Long roomId, String bedNo); List<QueueDO> getDoctorQueueByStatus(Long roomId, String bedNo, List<Byte> statusList); } jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/queueServiceImpl.java
@@ -2,11 +2,8 @@ import cn.lihu.jh.module.ecg.dal.dataobject.queue.QueueStatisticDO; import cn.lihu.jh.module.ecg.dal.dataobject.room.RoomDO; import cn.lihu.jh.module.ecg.dal.dataobject.room.RoomStatisticsDO; import cn.lihu.jh.module.ecg.dal.mysql.room.RoomMapper; import cn.lihu.jh.module.ecg.enums.QueueStatusEnum; import lombok.Data; import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -17,13 +14,13 @@ import cn.lihu.jh.module.ecg.dal.mysql.queue.queueMapper; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import static cn.lihu.jh.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.lihu.jh.module.ecg.enums.ErrorCodeConstants.*; @@ -97,34 +94,6 @@ return queueMapper.queueStatistic(statusList); } @Override public void queue(QueueSaveReqVO queueSaveReqVO) { BedQueueBO bedQueueBO = priorityQueue.peek(); if (null == bedQueueBO) return; if (bedQueueBO.queueNum.get() == bedQueueBO.maxQueueNum) { queueSaveReqVO.setStatus(QueueStatusEnum.WAITING.getStatus()); //排队中 QueueDO queue = BeanUtils.toBean(queueSaveReqVO, QueueDO.class); queueMapper.insert(queue); // queue.getId(); } else if (bedQueueBO.queueNum.get() < bedQueueBO.maxQueueNum) { queueSaveReqVO.setStatus(QueueStatusEnum.READY.getStatus()); //候诊准备中 queueSaveReqVO.setRoomId(bedQueueBO.getRoomId()); queueSaveReqVO.setRoomName(bedQueueBO.getRoomName()); queueSaveReqVO.setBedNo(bedQueueBO.getBedNo()); queueSaveReqVO.setSeqNum(curSeqNum.get()); QueueDO queue = BeanUtils.toBean(queueSaveReqVO, QueueDO.class); queueMapper.insert(queue); // queue.getId(); curSeqNum.getAndIncrement(); bedQueueBO.queueNum.getAndIncrement(); BedQueueBO bedQueueBO2 = priorityQueue.poll(); priorityQueue.offer(bedQueueBO2); } } public void initQueue() { priorityQueue.clear(); mapBedVsQueue.clear(); @@ -133,7 +102,7 @@ List<RoomDO> roomDOList = roomMapper.simpleRoomList(); List<BedQueueBO> bedQueueBOList = roomDOList.stream().map(item -> BeanUtils.toBean(item, BedQueueBO.class)).toList(); // 从DB 获取 队列中 就诊准备中人员 列表 // 从DB 获取 队列中 就诊准备中人员统计 列表 List<Byte> queueStatusList = new ArrayList<>(); queueStatusList.add(QueueStatusEnum.READY.getStatus()); List<QueueStatisticDO> queueStatisticDOList = queueMapper.queueStatistic(queueStatusList); @@ -150,6 +119,21 @@ curSeqNum = new AtomicInteger(null == num ? 1 : ++num); hurryup(); } public void reorderQueue() { // 根据预约前后,从DB 获取 队列中 就诊准备中人员 列表 List<Byte> queueStatusList = new ArrayList<>(); queueStatusList.add(QueueStatusEnum.READY.getStatus()); List<QueueDO> queueDOList = queueMapper.getOrderedQueue(queueStatusList); if (queueDOList.isEmpty()) return; AtomicInteger seqNum = new AtomicInteger(1); queueDOList.forEach(item -> {item.setSeqNum(seqNum.getAndIncrement());}); queueMapper.updateBatch(queueDOList); curSeqNum.set( seqNum.get() ); } /** @@ -183,16 +167,16 @@ } } public void finishPatient(Long roomId, String bedNo) { // 从 DB 把 就诊中的人 设置为就诊完成 Integer ret = queueMapper.updateQueueStatus(roomId, bedNo, QueueStatusEnum.ONSTAGE.getStatus(), QueueStatusEnum.FINISH.getStatus()); System.out.println("完成数量: " + ret); @Override public void queue(QueueSaveReqVO queueSaveReqVO) { queueSaveReqVO.setStatus(QueueStatusEnum.WAITING.getStatus()); //排队中 QueueDO queue = BeanUtils.toBean(queueSaveReqVO, QueueDO.class); queueMapper.insert(queue); // queue.getId(); hurryup(); } public void nextPatient(Long roomId, String bedNo) { finishPatient(roomId, bedNo); private void nextPatient(Long roomId, String bedNo) { // 从 DB 把 序号最小的 就诊准备中的人 设置为就诊中 queueMapper.updateQueueStatus(roomId, bedNo, QueueStatusEnum.READY.getStatus(), QueueStatusEnum.ONSTAGE.getStatus()); @@ -206,8 +190,27 @@ hurryup(); } public void finishNextPatient(Long roomId, String bedNo) { // 从 DB 把 就诊中的人 设置为就诊完成 Integer ret = queueMapper.updateQueueStatus(roomId, bedNo, QueueStatusEnum.ONSTAGE.getStatus(), QueueStatusEnum.FINISH.getStatus()); System.out.println("完成数量: " + ret); nextPatient(roomId, bedNo); } public void passNextPatient(Long roomId, String bedNo) { // 从 DB 把 就诊中的人 设置为过号 Integer ret = queueMapper.updateQueueStatus(roomId, bedNo, QueueStatusEnum.ONSTAGE.getStatus(), QueueStatusEnum.PASSED.getStatus()); System.out.println("完成数量: " + ret); nextPatient(roomId, bedNo); } public List<QueueDO> getDoctorQueueByStatus(Long roomId, String bedNo, List<Byte> statusList) { List<QueueDO> queueDOList = queueMapper.getDoctorQueueByStatus(roomId, bedNo, statusList); return queueDOList; } }