From 20d1b6b5d9955faeed1689d656e1f6bab0097d1e Mon Sep 17 00:00:00 2001 From: eight <641137800@qq.com> Date: 星期四, 10 十月 2024 15:08:30 +0800 Subject: [PATCH] 根据检查类型 安排医生工位 step 1 --- jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/room/vo/RoomPageReqVO.java | 3 jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedQueueBO.java | 2 jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/room/vo/MonitorInfoVO.java | 2 jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorNextPatientCallable.java | 2 jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/mysql/queue/queueMapper.java | 8 + jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceTxFunctions.java | 202 ++++++++++++++++++++++++++++----------- jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/room/vo/RoomSaveReqVO.java | 3 jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceImpl.java | 21 +++- jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/mysql/room/RoomMapper.java | 5 jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueService.java | 4 jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/room/vo/RoomRespVO.java | 4 jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/dataobject/room/RoomDO.java | 2 jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorResumeCallable.java | 2 jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedOpenCallable.java | 2 14 files changed, 191 insertions(+), 71 deletions(-) diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/room/vo/MonitorInfoVO.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/room/vo/MonitorInfoVO.java index b2027b4..d244fc7 100644 --- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/room/vo/MonitorInfoVO.java +++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/room/vo/MonitorInfoVO.java @@ -7,4 +7,6 @@ private Integer queueNum; private Integer activeQueueNum; private Integer openingFlag; + private String openingInfo; + private String operatingInfo; } diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/room/vo/RoomPageReqVO.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/room/vo/RoomPageReqVO.java index 14691f3..583ffa7 100644 --- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/room/vo/RoomPageReqVO.java +++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/room/vo/RoomPageReqVO.java @@ -31,6 +31,9 @@ @Schema(description = "妫�鏌ョ被鍨�") private Integer[] checkTypes; + @Schema(description = "鎿嶄綔绫诲瀷") + private Integer opType; + @Schema(description = "寮�璇婄姸鎬�") private Integer status; diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/room/vo/RoomRespVO.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/room/vo/RoomRespVO.java index dacce50..07e4214 100644 --- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/room/vo/RoomRespVO.java +++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/room/vo/RoomRespVO.java @@ -36,6 +36,10 @@ @ExcelProperty("妫�鏌ョ被鍨�") private Integer[] checkTypes; + @Schema(description = "鎿嶄綔绫诲瀷") + @ExcelProperty("鎿嶄綔绫诲瀷") + private Integer opType; + @Schema(description = "寮�璇婄姸鎬�", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("寮�璇婄姸鎬�") private Integer status; diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/room/vo/RoomSaveReqVO.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/room/vo/RoomSaveReqVO.java index 5f372c0..71ba7b4 100644 --- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/room/vo/RoomSaveReqVO.java +++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/room/vo/RoomSaveReqVO.java @@ -39,4 +39,7 @@ @Schema(description = "妫�鏌ョ被鍨�") private Integer[] checkTypes; + + @Schema(description = "鎿嶄綔绫诲瀷") + private Integer opType; } \ No newline at end of file diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/dataobject/room/RoomDO.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/dataobject/room/RoomDO.java index c49e936..446d754 100644 --- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/dataobject/room/RoomDO.java +++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/dataobject/room/RoomDO.java @@ -63,4 +63,6 @@ @TableField(typeHandler = JacksonTypeHandler.class) private Integer[] checkTypes; + + private Integer opType; } diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/mysql/queue/queueMapper.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/mysql/queue/queueMapper.java index 0f917c6..3daeeed 100644 --- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/mysql/queue/queueMapper.java +++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/mysql/queue/queueMapper.java @@ -39,6 +39,9 @@ @Select("SELECT max(seq_num) FROM lihu.queue") Integer getMaxSeqNum(); + @Select("SELECT * FROM lihu.queue where pat_id = #{patId}") + QueueDO getQueueByPatId(@Param("patId")String patId); + @Select("<script>" + "SELECT * FROM lihu.queue " + "where room_id = #{roomId} and status in (" + @@ -112,9 +115,10 @@ @Update("update lihu.queue set status = #{newStatus}, room_id = #{roomId}, room_name = #{roomName}, \n" + " bed_no = #{bedNo}, seq_num = #{seqNum} where id = \n" + " (select a.id from \n" + - " (select id from lihu.queue where status = #{curStatus} order by jump_flag desc, book_timeslot, create_time limit 1) a)") + " (select id from lihu.queue where status = #{curStatus} and book_check_type= #{checkType} order by jump_flag desc, book_timeslot, create_time limit 1) a)") Integer preemptPatient(@Param("roomId")Long roomId, @Param("roomName")String roomName, @Param("bedNo")String bedNo, - @Param("seqNum")Integer seqNum, @Param("curStatus")Byte curStatus, @Param("newStatus")Byte newStatus); + @Param("seqNum")Integer seqNum, @Param("curStatus")Byte curStatus, @Param("newStatus")Byte newStatus, + @Param("checkType")Integer checkType); @Update("update lihu.queue set status = #{newStatus}, seq_num = #{seqNum}, passed = 1 " + " where id = " + diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/mysql/room/RoomMapper.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/mysql/room/RoomMapper.java index acf2165..f352a2f 100644 --- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/mysql/room/RoomMapper.java +++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/mysql/room/RoomMapper.java @@ -41,13 +41,16 @@ List<RoomStatisticsDO> roomStatistic(); @Select("<script> " + - "SELECT id, room_id, room_name, bed_no, status, doc_id, doc_name FROM lihu.clinic_room " + + "SELECT * FROM lihu.clinic_room " + "where status in ( " + " <foreach collection='curStatusList' separator=',' item='curStatus'>" + " #{curStatus.status} " + " </foreach> )" + " and deleted = 0;" + "</script>") + @Results({ + @Result(property = "checkTypes", column = "check_types", typeHandler=com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler.class) + }) List<RoomDO> simpleRoomList(@Param("curStatusList") List<BedStatusEnum> curStatusList); @Select("SELECT * FROM lihu.clinic_room where room_id=#{roomId} and bed_no=#{bedNo}") diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorNextPatientCallable.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorNextPatientCallable.java index ab983a4..18db62b 100644 --- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorNextPatientCallable.java +++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorNextPatientCallable.java @@ -22,7 +22,7 @@ public ErrorCode call() throws Exception { ErrorCode ec = queueService.nextPatient(roomId, bedNo); if (GlobalErrorCodeConstants.SUCCESS.equals(ec)) { - queueService.hurryup(); + queueService.hurryupOneBed(roomId, bedNo); } queueService.monitorInfo(); diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorResumeCallable.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorResumeCallable.java index 8cafece..8d5198b 100644 --- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorResumeCallable.java +++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorResumeCallable.java @@ -26,7 +26,7 @@ public ErrorCode call() throws Exception { ErrorCode ec = queueService.bedDoctorResume(roomId, bedNo, docId, docName); if (GlobalErrorCodeConstants.SUCCESS.equals(ec)) { - queueService.hurryup(); + queueService.hurryupOneBed(roomId, bedNo); } queueService.monitorInfo(); diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedOpenCallable.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedOpenCallable.java index 4b2a2ed..d299f27 100644 --- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedOpenCallable.java +++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedOpenCallable.java @@ -24,7 +24,7 @@ public ErrorCode call() throws Exception { ErrorCode ec = queueService.bedOpen(roomId, roomName, bedNo); if (GlobalErrorCodeConstants.SUCCESS.equals(ec)) { - queueService.hurryup(); + queueService.hurryupOneBed(roomId, bedNo); } queueService.monitorInfo(); diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedQueueBO.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedQueueBO.java index 011c81b..7431881 100644 --- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedQueueBO.java +++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedQueueBO.java @@ -13,6 +13,8 @@ AtomicInteger queueNum = new AtomicInteger(0); Integer maxQueueNum; Integer status; + Integer[] checkTypes; + Integer opType; @Override public int compareTo(@NotNull BedQueueBO o) { diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueService.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueService.java index d0e9913..ec540b2 100644 --- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueService.java +++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueService.java @@ -50,7 +50,9 @@ /** * */ - void startHurryUp(); + void startHurryUpOneBed(Long roomId, String bedNo); + void startHurryUpOneCheckType(Integer checkType); + void startBedReload(); void startResetRoom(Boolean needCloseBed); MonitorInfoVO getMonitorInfo(); diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceImpl.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceImpl.java index f9bd92d..bc007a9 100644 --- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceImpl.java +++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceImpl.java @@ -218,9 +218,16 @@ } @Override - public void startHurryUp() { + public void startHurryUpOneBed(Long roomId, String bedNo) { singleThreadExecutor.execute( () -> { - queueServiceTxFunctions.hurryup(); + queueServiceTxFunctions.hurryupOneBed(roomId, bedNo); + }); + } + + @Override + public void startHurryUpOneCheckType(Integer checkType) { + singleThreadExecutor.execute( () -> { + queueServiceTxFunctions.hurryupOneCheckType( checkType ); }); } @@ -228,7 +235,7 @@ public void startBedReload() { singleThreadExecutor.execute( () -> { queueServiceTxFunctions.bedReload(); - queueServiceTxFunctions.hurryup(); + queueServiceTxFunctions.hurryupAllBed(); queueServiceTxFunctions.monitorInfo(); }); } @@ -296,7 +303,7 @@ devRent.setState( DevRentStateEnum.FREE.getState() ); devRentMapper.insert(devRent); - startHurryUp(); + startHurryUpOneCheckType(Integer.valueOf(queue.getBookCheckType())); } public void finishNextPatient(Long roomId, String bedNo) { @@ -362,14 +369,16 @@ public Integer recallPatient(Long roomId, String bedNo, String patId) { Integer updateNum = queueMapper.recallPassedPatient(roomId, bedNo, patId, QueueStatusEnum.PASSED.getStatus(), QueueStatusEnum.RECALLED.getStatus()); - startHurryUp(); + startHurryUpOneBed(roomId, bedNo); return updateNum; } @Override public Integer patientJump(String patId, Byte jumped) { Integer updateNum = queueMapper.queueJump(patId, QueueStatusEnum.WAITING.getStatus(), jumped); - startHurryUp(); + + QueueDO queueDO = queueMapper.getQueueByPatId(patId); + startHurryUpOneCheckType(Integer.valueOf(queueDO.getBookCheckType())); return updateNum; } diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceTxFunctions.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceTxFunctions.java index 15bfd80..2c13a09 100644 --- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceTxFunctions.java +++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceTxFunctions.java @@ -15,14 +15,12 @@ import cn.lihu.jh.module.ecg.enums.QueueStatusEnum; import cn.lihu.jh.module.system.api.oauth2.OAuth2TokenApi; import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; @@ -58,8 +56,10 @@ AtomicInteger openingFlag = new AtomicInteger(0); AtomicInteger curSeqNum = new AtomicInteger(0); - PriorityBlockingQueue<BedQueueBO> priorityQueue = new PriorityBlockingQueue<>(); ConcurrentHashMap<String, BedQueueBO > mapBedVsQueue = new ConcurrentHashMap<>(); + + //PriorityBlockingQueue<BedQueueBO> priorityQueue = new PriorityBlockingQueue<>(); + Map<Integer, PriorityBlockingQueue<BedQueueBO>> mapCheckTypeVsPriorityQueue = new HashMap(); Map<Integer, Integer> mapCheckTypeVsReadyMax = null; @@ -89,7 +89,9 @@ queueStatusList.add(QueueStatusEnum.READY.getStatus()); List<QueueDO> queueDOList = queueMapper.getDoctorQueueByStatus(roomId, bedNo, queueStatusList); - // 鏂板宸ヤ綅 浼樺厛闃熷垪 + RoomDO roomDO = roomMapper.getRoom(roomId, bedNo); + + // 鏂板..宸ヤ綅闃熷垪 BedQueueBO bedQueueBO = new BedQueueBO(); bedQueueBO.setRoomId(roomId); bedQueueBO.setRoomName(roomName); @@ -97,6 +99,8 @@ bedQueueBO.setMaxQueueNum(getBedReadyMax(roomId, bedNo)); bedQueueBO.setQueueNum(new AtomicInteger(queueDOList.size())); bedQueueBO.setStatus(BedStatusEnum.OPENING.getStatus()); + bedQueueBO.setCheckTypes( roomDO.getCheckTypes() ); + bedQueueBO.setOpType( roomDO.getOpType() ); mapBedVsQueue.put(String.format("%09d%s", roomId, bedNo), bedQueueBO); return GlobalErrorCodeConstants.SUCCESS; @@ -133,7 +137,7 @@ } mapBedVsQueue.remove(String.format("%09d%s", roomId, bedNo)); - priorityQueue.remove(bedQueueBO); + removePriorityQueue(bedQueueBO); return GlobalErrorCodeConstants.SUCCESS; } @@ -154,7 +158,7 @@ } bedQueueBO.setStatus(BedStatusEnum.PAUSE.getStatus()); - priorityQueue.remove(bedQueueBO); + removePriorityQueue(bedQueueBO); return GlobalErrorCodeConstants.SUCCESS; } @@ -176,13 +180,7 @@ } bedQueueBO.setStatus(BedStatusEnum.DOCTOR_ON.getStatus()); - if (!priorityQueue.contains(bedQueueBO)) { - priorityQueue.offer(bedQueueBO); - } else { - log.error("bedDoctorResume priorityQueue still exist!. " + roomId + " " + bedNo); - return ECG_INNER_ERROR; - } - + addPriorityQueue(bedQueueBO); return GlobalErrorCodeConstants.SUCCESS; } @@ -203,13 +201,7 @@ } bedQueueBO.setStatus(BedStatusEnum.DOCTOR_ON.getStatus()); - if (!priorityQueue.contains(bedQueueBO)) { - priorityQueue.offer(bedQueueBO); - } else { - log.error("bedDoctorOn priorityQueue still exist!. " + roomId + " " + bedNo); - return ECG_INNER_ERROR; - } - + addPriorityQueue(bedQueueBO); return GlobalErrorCodeConstants.SUCCESS; } @@ -230,7 +222,7 @@ return ROOM_INVALID_STATUS; } - priorityQueue.remove(bedQueueBO); + removePriorityQueue(bedQueueBO); bedQueueBO.setStatus(BedStatusEnum.OPENING.getStatus()); return GlobalErrorCodeConstants.SUCCESS; @@ -248,9 +240,8 @@ // 浼樺厛闃熷垪涓� 璇ュ伐浣� 灏辫瘖鍑嗗涓汉鐨勬暟閲� 鍑忎竴 BedQueueBO bo = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo)); bo.queueNum.getAndDecrement(); // 鍙兘宸茬粡銆愬苟鍙戠殑銆戝湪 hurry-up 涓敼鍙樹簡鍊� - priorityQueue.remove(bo); - priorityQueue.offer(bo); + removePriorityQueue(bo); return GlobalErrorCodeConstants.SUCCESS; } @@ -259,7 +250,7 @@ * 2. 鏈嶅姟杩愮淮閲嶅惎鏃� */ public ErrorCode bedReload() { - priorityQueue.clear(); + mapCheckTypeVsPriorityQueue.clear(); mapBedVsQueue.clear(); // 娓呴櫎闈炲綋澶╃殑鎺掗槦浜哄憳 @@ -290,7 +281,7 @@ item.queueNum.set( queueNum ); mapBedVsQueue.put(String.format("%09d%s", item.roomId, item.bedNo), item); if (BedStatusEnum.DOCTOR_ON.getStatus() == item.getStatus()) { - priorityQueue.offer(item); + addPriorityQueue(item); } }); @@ -315,39 +306,55 @@ } } - /** - * 鎶婂尰鐢熷�欒瘖鐨勯槦鍒楀婊� - */ - public void hurryup() { + public void hurryupAllBed() { if (0 == openingFlag.get()) return; + mapBedVsQueue.values().forEach(bedQueueBO -> hurryupOneBed(bedQueueBO.roomId, bedQueueBO.bedNo)); + } + + /** + * 鎶婂尰鐢熷�欒瘖鐨勯槦鍒楀婊� + */ + public void hurryupOneBed(Long roomId, String bedNo) { + if (0 == openingFlag.get()) + return; + + BedQueueBO bedQueueBO = getBedQueueBO(roomId, bedNo); + // 澶勭悊 杩囧彿-鍥炴潵 鐨勪汉 - for (BedQueueBO bedQueueBO : mapBedVsQueue.values()) { - while (bedQueueBO.queueNum.get() < bedQueueBO.maxQueueNum) { - // 鏌ョ湅 褰撳墠宸ヤ綅 鏄惁鏈夎繃鍙�-鍥炴潵鐨勬偅鑰� - Integer updateNum = queueMapper.queueRecalledPatient( - bedQueueBO.getRoomId(), - bedQueueBO.getRoomName(), - bedQueueBO.getBedNo(), - curSeqNum.get() + 1, - QueueStatusEnum.RECALLED.getStatus(), - QueueStatusEnum.READY.getStatus()); - if (null == updateNum || 0 == updateNum) - break; + while (bedQueueBO.queueNum.get() < bedQueueBO.maxQueueNum) { + // 鏌ョ湅 褰撳墠宸ヤ綅 鏄惁鏈夎繃鍙�-鍥炴潵鐨勬偅鑰� + Integer updateNum = queueMapper.queueRecalledPatient( + bedQueueBO.getRoomId(), + bedQueueBO.getRoomName(), + bedQueueBO.getBedNo(), + curSeqNum.get() + 1, + QueueStatusEnum.RECALLED.getStatus(), + QueueStatusEnum.READY.getStatus()); + if (null == updateNum || 0 == updateNum) + break; - curSeqNum.getAndIncrement(); + curSeqNum.getAndIncrement(); - // 鍙兘宸茬粡銆愬苟鍙戠殑銆戝湪 nextPatient 涓敼鍙樹簡鍊� - bedQueueBO.queueNum.incrementAndGet(); + // 鍙兘宸茬粡銆愬苟鍙戠殑銆戝湪 nextPatient 涓敼鍙樹簡鍊� + bedQueueBO.queueNum.incrementAndGet(); - // 鍙兘宸茬粡銆愬苟鍙戠殑銆戝湪 nextPatient 涓敼鍙樹簡浼樺厛闃熷垪椤哄簭 - priorityQueue.remove(bedQueueBO); - priorityQueue.offer(bedQueueBO); - } + // 鍙兘宸茬粡銆愬苟鍙戠殑銆戝湪 nextPatient 涓敼鍙樹簡浼樺厛闃熷垪椤哄簭 + refreshPriorityQueue(bedQueueBO); } // 澶勭悊 鎺掗槦涓� 鎮h�� + Integer[] checkTypes = bedQueueBO.getCheckTypes(); + Arrays.stream(checkTypes).forEach(checkType -> hurryupOneCheckType(checkType)); + } + + public void hurryupOneCheckType(Integer checkType) { + + PriorityBlockingQueue<BedQueueBO> priorityQueue = mapCheckTypeVsPriorityQueue.get(checkType); + if (null == priorityQueue) + return; + while (true) { BedQueueBO bedQueueBO = priorityQueue.peek(); if (null == bedQueueBO) @@ -355,7 +362,7 @@ int curQueueNum = bedQueueBO.queueNum.get(); if (curQueueNum > bedQueueBO.maxQueueNum) - throw new RuntimeException("hurryup: exceed max queue number!"); + throw new RuntimeException("hurryupOneCheckType: exceed max queue number!"); if (curQueueNum == bedQueueBO.maxQueueNum) return; @@ -367,7 +374,8 @@ bedQueueBO.getBedNo(), curSeqNum.get() + 1, QueueStatusEnum.WAITING.getStatus(), - QueueStatusEnum.READY.getStatus()); + QueueStatusEnum.READY.getStatus(), + checkType); // 娌℃湁鎶㈠埌鎺掗槦鎮h�� if (null == updateNum || 0 == updateNum) { @@ -380,8 +388,7 @@ bedQueueBO.queueNum.incrementAndGet(); // 鍙兘宸茬粡銆愬苟鍙戠殑銆戝湪 nextPatient 涓敼鍙樹簡浼樺厛闃熷垪椤哄簭 - priorityQueue.remove(bedQueueBO); - priorityQueue.offer(bedQueueBO); + refreshPriorityQueue(bedQueueBO); } } @@ -404,14 +411,16 @@ public MonitorInfoVO getMonitorInfo() { MonitorInfoVO monitorInfoVO = new MonitorInfoVO(); monitorInfoVO.setOpeningFlag( openingFlag.get() ); - monitorInfoVO.setQueueNum( mapBedVsQueue.size() ); - monitorInfoVO.setActiveQueueNum( priorityQueue.size() ); + String[] arrStatInfo = roomBedStatistic(); + monitorInfoVO.setOpeningInfo(arrStatInfo[0]); + monitorInfoVO.setOperatingInfo(arrStatInfo[1]); + return monitorInfoVO; } public void monitorInfo() { - log.info("map " + mapBedVsQueue.size() + " priority " + priorityQueue.size() - + " opening " + openingFlag.get()); + String[] arrStatInfo = roomBedStatistic(); + log.info(" opening " + openingFlag.get() + " openingInfo " + arrStatInfo[0] + " operatingInfo " + arrStatInfo[1] ); } private Integer getBedReadyMax(Long roomId, String bedNo) { @@ -424,4 +433,81 @@ } return ret; } + + private void addPriorityQueue(BedQueueBO bedQueueBO) { + Integer[] checkTypes = bedQueueBO.getCheckTypes(); + Arrays.stream(checkTypes).forEach(checkType -> { + PriorityBlockingQueue<BedQueueBO> priorityQueue = mapCheckTypeVsPriorityQueue.get(checkType); + if (!priorityQueue.contains(bedQueueBO)) { + priorityQueue.offer(bedQueueBO); + } else { + log.error("bedDoctorResume priorityQueue still exist!. " + bedQueueBO.getRoomId() + " " + bedQueueBO.getBedNo()); + } + }); + } + + private void removePriorityQueue(BedQueueBO bedQueueBO) { + Integer[] checkTypes = bedQueueBO.getCheckTypes(); + Arrays.stream(checkTypes).forEach(checkType -> { + PriorityBlockingQueue<BedQueueBO> priorityBlockingQueue = mapCheckTypeVsPriorityQueue.get(checkType); + if (null != priorityBlockingQueue) + priorityBlockingQueue.remove(bedQueueBO); + }); + } + + private void refreshPriorityQueue(BedQueueBO bedQueueBO) { + Integer[] checkTypes = bedQueueBO.getCheckTypes(); + Arrays.stream(checkTypes).forEach(checkType -> { + PriorityBlockingQueue<BedQueueBO> priorityQueue = mapCheckTypeVsPriorityQueue.get(checkType); + priorityQueue.remove(bedQueueBO); + priorityQueue.offer(bedQueueBO); + }); + } + + private String[] roomBedStatistic() { + Map<Integer, Integer> mapOpeningCheckBedStatInfo = new HashMap<>(); + Map<Integer, Integer> mapOpeningReadyBedStatInfo = new HashMap<>(); + Map<Integer, Integer> mapOperatingCheckBedStatInfo = new HashMap<>(); + Map<Integer, Integer> mapOperatingReadyBedStatInfo = new HashMap<>(); + mapCheckTypeVsReadyMax.keySet().forEach( checkType -> { + mapOpeningCheckBedStatInfo.put(checkType, 0); + mapOpeningReadyBedStatInfo.put(checkType, 0); + mapOperatingCheckBedStatInfo.put(checkType, 0); + mapOperatingReadyBedStatInfo.put(checkType, 0); + }); + + //寮�閫氱殑宸ヤ綅缁熻 + mapBedVsQueue.values().forEach( bedQueueBO -> { + Integer[] checkTypes = bedQueueBO.getCheckTypes(); + Arrays.stream(checkTypes).forEach(checkType -> { + if (bedQueueBO.opType == 0) + mapOpeningCheckBedStatInfo.put(checkType, mapOpeningCheckBedStatInfo.get(checkType) + 1 ); + else + mapOpeningReadyBedStatInfo.put(checkType, mapOpeningReadyBedStatInfo.get(checkType) + 1 ); + }); + }); + + String openingBedInfo = "鎬绘暟锛�" + mapBedVsQueue.size() + " 妫�鏌ュ伐浣嶆暟: " + mapOpeningCheckBedStatInfo.toString() + " 棰嗙敤宸ヤ綅鏁�: " + mapOpeningReadyBedStatInfo.toString(); + + //杩愯惀涓伐浣嶇粺璁� + HashSet<BedQueueBO> hashSetOperatingBedQueue = new HashSet<>(); + mapCheckTypeVsPriorityQueue.values().forEach(priorityQueue->{ + priorityQueue.stream().forEach(bedQueueBO -> hashSetOperatingBedQueue.add(bedQueueBO)); + }); + + hashSetOperatingBedQueue.stream().forEach( bedQueueBO -> { + Integer[] checkTypes = bedQueueBO.getCheckTypes(); + Arrays.stream(checkTypes).forEach(checkType -> { + if (bedQueueBO.opType == 0) + mapOperatingCheckBedStatInfo.put(checkType, mapOperatingCheckBedStatInfo.get(checkType) + 1 ); + else + mapOperatingReadyBedStatInfo.put(checkType, mapOperatingReadyBedStatInfo.get(checkType) + 1 ); + }); + }); + + String operatingBedInfo = "鎬绘暟锛�" + hashSetOperatingBedQueue.size() + " 妫�鏌ュ伐浣嶆暟: " + mapOperatingCheckBedStatInfo.toString() + " 棰嗙敤宸ヤ綅鏁�: " + mapOperatingReadyBedStatInfo.toString(); + + return new String[]{openingBedInfo, operatingBedInfo}; + } + } -- Gitblit v1.9.3