jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/MySpringEventLister.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,21 @@ package cn.lihu.jh.module.ecg; import cn.lihu.jh.module.ecg.service.queue.QueueService; import org.springframework.boot.context.event.ApplicationStartedEvent; import org.springframework.context.ApplicationListener; import org.springframework.stereotype.Component; import javax.annotation.Resource; @Component public class MySpringEventLister implements ApplicationListener<ApplicationStartedEvent> { @Resource private QueueService queueService; @Override public void onApplicationEvent(ApplicationStartedEvent event) { System.out.println("åºç¨å¯å¨å®æï¼éç¥çå¬å¨æ§è¡ç¼åé¢å è½½æä½"); queueService.initQueue(); } } jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/doctor/DoctorController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,76 @@ package cn.lihu.jh.module.ecg.controller.admin.doctor; import cn.lihu.jh.framework.apilog.core.annotation.ApiAccessLog; import cn.lihu.jh.framework.common.pojo.CommonResult; import cn.lihu.jh.framework.common.pojo.PageParam; import cn.lihu.jh.framework.common.pojo.PageResult; import cn.lihu.jh.framework.common.util.object.BeanUtils; import cn.lihu.jh.framework.excel.core.util.ExcelUtils; import cn.lihu.jh.module.ecg.controller.admin.queue.vo.QueuePageReqVO; import cn.lihu.jh.module.ecg.controller.admin.queue.vo.QueueRespVO; import cn.lihu.jh.module.ecg.controller.admin.queue.vo.QueueSaveReqVO; import cn.lihu.jh.module.ecg.dal.dataobject.queue.QueueDO; import cn.lihu.jh.module.ecg.enums.QueueStatusEnum; import cn.lihu.jh.module.ecg.service.queue.QueueService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; import java.util.ArrayList; import java.util.List; import static cn.lihu.jh.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static cn.lihu.jh.framework.common.pojo.CommonResult.success; @Tag(name = "管çåå° - å»çå«å·") @RestController @RequestMapping("/ecg/doctor") @Validated public class DoctorController { @Resource private QueueService queueService; @GetMapping("/nextpatient") @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( @RequestParam("roomId") Long roomId, @RequestParam("bedNo") String bedNo) { queueService.nextPatient(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("/page") @Operation(summary = "è·å¾æéå页") @PreAuthorize("@ss.hasPermission('ecg:queue:query')") public CommonResult<PageResult<QueueRespVO>> getqueuePage(@Valid QueuePageReqVO pageReqVO) { PageResult<QueueDO> pageResult = queueService.getqueuePage(pageReqVO); return success(BeanUtils.toBean(pageResult, QueueRespVO.class)); } @GetMapping("/opening-setting") @Operation(summary = "å¼è¯è®¾ç½®") @PreAuthorize("@ss.hasPermission('ecg:queue:setting')") public CommonResult<Integer> openingSetting() { queueService.initQueue(); queueService.hurryup(); return success(0); } } jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/mysql/queue/queueMapper.java
@@ -10,6 +10,7 @@ import cn.lihu.jh.module.ecg.controller.admin.queue.vo.*; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; import java.util.List; @@ -49,4 +50,24 @@ " group by room_id, bed_no; " +"</script>") List<QueueStatisticDO> queueStatistic(@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" + "(select a.min_seq_num from \n" + " (select min(seq_num) as min_seq_num from lihu.queue where room_id = #{roomId} and bed_no = #{bedNo} and status = #{curStatus}) a )") Integer updateQueueStatus(@Param("roomId")Long roomId, @Param("bedNo")String bedNo, @Param("curStatus")Byte curStatus, @Param("newStatus")Byte newStatus); @Select("select * from lihu.queue where status = #{status} order by book_timeslot, create_time limit 1") QueueDO getFirstInQueueByStatus(Byte status); @Select("<script>" + "SELECT * FROM lihu.queue " + "where room_id = #{roomId} and bed_no = #{bedNo} and status in (" + " <foreach collection='statusList' separator=',' item='status'>" + " #{status} " + " </foreach> )" + " order by status desc" + "</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/BedQueueBO.java
@@ -3,16 +3,18 @@ import lombok.Data; import org.jetbrains.annotations.NotNull; import java.util.concurrent.atomic.AtomicInteger; @Data public class BedQueueBO implements Comparable<BedQueueBO> { String bedNo; Long roomId; String roomName; Integer queueNum; AtomicInteger queueNum = new AtomicInteger(0); Integer maxQueueNum; @Override public int compareTo(@NotNull BedQueueBO o) { return Integer.compare(this.queueNum, o.queueNum); return Integer.compare(this.queueNum.get(), o.queueNum.get()); } } jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/queueService.java
@@ -68,7 +68,14 @@ void initQueue(); /** * * æå»çåè¯çéå塿»¡ */ void hurryup(); /** * å»çå«ä¸ä¸ä½æ£è */ void nextPatient(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
@@ -21,6 +21,9 @@ import javax.annotation.Resource; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.atomic.AtomicInteger; import static cn.lihu.jh.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.lihu.jh.module.ecg.enums.ErrorCodeConstants.*; @@ -36,9 +39,10 @@ final static Integer MAX_QUEUE_NUM = 2; Integer curSeqNum = 0; AtomicInteger curSeqNum = new AtomicInteger(0); PriorityQueue<BedQueueBO> priorityQueue = new PriorityQueue<>(); PriorityBlockingQueue<BedQueueBO> priorityQueue = new PriorityBlockingQueue<>(); ConcurrentHashMap<String, BedQueueBO > mapBedVsQueue = new ConcurrentHashMap<>(); @Resource private queueMapper queueMapper; @@ -99,21 +103,21 @@ if (null == bedQueueBO) return; if (bedQueueBO.queueNum == bedQueueBO.maxQueueNum) { 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 < bedQueueBO.maxQueueNum) { } 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); queueSaveReqVO.setSeqNum(curSeqNum.get()); QueueDO queue = BeanUtils.toBean(queueSaveReqVO, QueueDO.class); queueMapper.insert(queue); // queue.getId(); curSeqNum++; bedQueueBO.queueNum++; curSeqNum.getAndIncrement(); bedQueueBO.queueNum.getAndIncrement(); BedQueueBO bedQueueBO2 = priorityQueue.poll(); priorityQueue.offer(bedQueueBO2); } @@ -121,13 +125,15 @@ } @PostConstruct public void initQueue() { priorityQueue.clear(); mapBedVsQueue.clear(); // ä»DB è·å å·¥ä½å表 List<RoomDO> roomDOList = roomMapper.simpleRoomList(); List<BedQueueBO> bedQueueBOList = roomDOList.stream().map(item -> BeanUtils.toBean(item, BedQueueBO.class)).toList(); // ä»DB è·å éåä¸ å°±è¯åå¤ä¸äººå å表 List<Byte> queueStatusList = new ArrayList<>(); queueStatusList.add(QueueStatusEnum.READY.getStatus()); List<QueueStatisticDO> queueStatisticDOList = queueMapper.queueStatistic(queueStatusList); @@ -135,12 +141,15 @@ bedQueueBOList.forEach(item -> { item.maxQueueNum = MAX_QUEUE_NUM; Optional<QueueStatisticDO> queueStatisticDOOptional = queueStatisticDOList.stream().filter(it->it.getRoomId()==item.roomId && it.getBedNo().equals(item.getBedNo())).findFirst(); item.queueNum = queueStatisticDOOptional.isPresent() ? queueStatisticDOOptional.get().getTotalInStatus() : 0; item.queueNum.set( queueStatisticDOOptional.isPresent() ? queueStatisticDOOptional.get().getTotalInStatus() : 0 ); priorityQueue.offer(item); mapBedVsQueue.put(String.format("%09d%s", item.roomId, item.bedNo), item); }); curSeqNum = queueMapper.getMaxSeqNum(); curSeqNum = null == curSeqNum ? 1 : ++curSeqNum; Integer num = queueMapper.getMaxSeqNum(); curSeqNum = new AtomicInteger(null == num ? 1 : ++num); hurryup(); } /** @@ -148,5 +157,48 @@ * çå°åä¸ä¸ä¸ª æéä¸äººå çé»è¾å®æåï¼å忥ä¸é */ public void hurryup() { while (true) { BedQueueBO bedQueueBO = priorityQueue.peek(); if (null == bedQueueBO) return; if (bedQueueBO.queueNum.get() == bedQueueBO.maxQueueNum) return; QueueDO queue = queueMapper.getFirstInQueueByStatus(QueueStatusEnum.WAITING.getStatus()); if (null == queue) return; queue.setStatus(QueueStatusEnum.READY.getStatus()); //åè¯åå¤ä¸ queue.setRoomId(bedQueueBO.getRoomId()); queue.setRoomName(bedQueueBO.getRoomName()); queue.setBedNo(bedQueueBO.getBedNo()); queue.setSeqNum(curSeqNum.get()); queueMapper.updateById(queue); // queue.getId(); curSeqNum.getAndIncrement(); bedQueueBO.queueNum.getAndIncrement(); BedQueueBO bedQueueBO2 = priorityQueue.poll(); priorityQueue.offer(bedQueueBO2); } } public void nextPatient(Long roomId, String bedNo) { // ä» DB æ åºå·æå°ç å°±è¯åå¤ä¸ç人 设置为就è¯ä¸ queueMapper.updateQueueStatus(roomId, bedNo, QueueStatusEnum.READY.getStatus(), QueueStatusEnum.ONSTAGE.getStatus()); // ä¼å éåä¸ è¯¥å·¥ä½ å°±è¯åå¤ä¸äººçæ°é åä¸ BedQueueBO bo = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo)); boolean breturn = priorityQueue.remove(bo); bo.queueNum.getAndDecrement(); priorityQueue.offer(bo); hurryup(); } public List<QueueDO> getDoctorQueueByStatus(Long roomId, String bedNo, List<Byte> statusList) { List<QueueDO> queueDOList = queueMapper.getDoctorQueueByStatus(roomId, bedNo, statusList); return queueDOList; } }