From e8f1b8e0380d7c868f4e3218688796f595151724 Mon Sep 17 00:00:00 2001 From: eight <641137800@qq.com> Date: 星期五, 27 九月 2024 16:24:18 +0800 Subject: [PATCH] refactor: 用以支持springboot 事务注解 --- jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorPauseCallable.java | 4 jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceImpl.java | 395 +------------------------ jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorOnCallable.java | 4 jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueService.java | 17 - jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/api/doctor/DoctorApiImpl.java | 2 jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorNextPatientCallable.java | 4 jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorOffCallable.java | 4 jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedReloadCallable.java | 4 jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorResumeCallable.java | 4 jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceTxFunctions.java | 428 ++++++++++++++++++++++++++++ jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedOpenCallable.java | 4 jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedCloseCallable.java | 4 12 files changed, 468 insertions(+), 406 deletions(-) diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/api/doctor/DoctorApiImpl.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/api/doctor/DoctorApiImpl.java index e7ed3fd..4bb24db 100644 --- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/api/doctor/DoctorApiImpl.java +++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/api/doctor/DoctorApiImpl.java @@ -22,7 +22,7 @@ return GlobalErrorCodeConstants.SUCCESS; } - return queueService.bedDoctorOff(roomDO.getRoomId(), roomDO.getBedNo(), userId, userName); + return queueService.startBedDoctorOff(roomDO.getRoomId(), roomDO.getBedNo(), userId, userName); } } diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedCloseCallable.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedCloseCallable.java index b99ba68..8ab203c 100644 --- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedCloseCallable.java +++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedCloseCallable.java @@ -6,11 +6,11 @@ public class BedCloseCallable implements Callable<ErrorCode> { - QueueService queueService; + QueueServiceTxFunctions queueService; private Long roomId; private String bedNo; - public BedCloseCallable(QueueService queueService, Long roomId, String bedNo) + public BedCloseCallable(QueueServiceTxFunctions queueService, Long roomId, String bedNo) { super(); this.roomId = roomId; 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 a727750..ab983a4 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 @@ -7,11 +7,11 @@ public class BedDoctorNextPatientCallable implements Callable<ErrorCode> { - QueueService queueService; + QueueServiceTxFunctions queueService; private Long roomId; private String bedNo; - public BedDoctorNextPatientCallable(QueueService queueService, Long roomId, String bedNo) + public BedDoctorNextPatientCallable(QueueServiceTxFunctions queueService, Long roomId, String bedNo) { super(); this.roomId = roomId; diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorOffCallable.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorOffCallable.java index 20c1815..08eed0a 100644 --- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorOffCallable.java +++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorOffCallable.java @@ -6,13 +6,13 @@ public class BedDoctorOffCallable implements Callable<ErrorCode> { - QueueService queueService; + QueueServiceTxFunctions queueService; private Long roomId; private String bedNo; private Long docId; private String docName; - public BedDoctorOffCallable(QueueService queueService, Long roomId, String bedNo, Long docId, String docName) + public BedDoctorOffCallable(QueueServiceTxFunctions queueService, Long roomId, String bedNo, Long docId, String docName) { super(); this.queueService = queueService; diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorOnCallable.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorOnCallable.java index 41d8d4b..8521d5f 100644 --- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorOnCallable.java +++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorOnCallable.java @@ -6,13 +6,13 @@ public class BedDoctorOnCallable implements Callable<ErrorCode> { - QueueService queueService; + QueueServiceTxFunctions queueService; private Long roomId; private String bedNo; private Long docId; private String docName; - public BedDoctorOnCallable(QueueService queueService, Long roomId, String bedNo, Long docId, String docName) + public BedDoctorOnCallable(QueueServiceTxFunctions queueService, Long roomId, String bedNo, Long docId, String docName) { super(); this.queueService = queueService; diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorPauseCallable.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorPauseCallable.java index b957ab8..86d8f07 100644 --- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorPauseCallable.java +++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorPauseCallable.java @@ -6,13 +6,13 @@ public class BedDoctorPauseCallable implements Callable<ErrorCode> { - QueueService queueService; + QueueServiceTxFunctions queueService; private Long roomId; private String bedNo; private Long docId; private String docName; - public BedDoctorPauseCallable(QueueService queueService, Long roomId, String bedNo, Long docId, String docName) + public BedDoctorPauseCallable(QueueServiceTxFunctions queueService, Long roomId, String bedNo, Long docId, String docName) { super(); this.queueService = queueService; 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 1d4982d..8cafece 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 @@ -7,13 +7,13 @@ public class BedDoctorResumeCallable implements Callable<ErrorCode> { - QueueService queueService; + QueueServiceTxFunctions queueService; private Long roomId; private String bedNo; private Long docId; private String docName; - public BedDoctorResumeCallable(QueueService queueService, Long roomId, String bedNo, Long docId, String docName) + public BedDoctorResumeCallable(QueueServiceTxFunctions queueService, Long roomId, String bedNo, Long docId, String docName) { super(); this.queueService = queueService; 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 1fa9ac0..4b2a2ed 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 @@ -7,12 +7,12 @@ public class BedOpenCallable implements Callable<ErrorCode> { - QueueService queueService; + QueueServiceTxFunctions queueService; private Long roomId; private String roomName; private String bedNo; - public BedOpenCallable(QueueService queueService, Long roomId, String roomName, String bedNo) + public BedOpenCallable(QueueServiceTxFunctions queueService, Long roomId, String roomName, String bedNo) { super(); this.roomId = roomId; diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedReloadCallable.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedReloadCallable.java index 4080469..a46879c 100644 --- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedReloadCallable.java +++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedReloadCallable.java @@ -6,9 +6,9 @@ public class BedReloadCallable implements Callable<ErrorCode> { - QueueService queueService; + QueueServiceTxFunctions queueService; - public BedReloadCallable(QueueService queueService) + public BedReloadCallable(QueueServiceTxFunctions queueService) { super(); this.queueService = queueService; 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 66ed14d..0a34b8d 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 @@ -62,15 +62,6 @@ ErrorCode startBedDoctorOff(Long roomId, String bedNo, Long docId, String docName); ErrorCode startNextPatient(Long roomId, String bedNo); - ErrorCode bedOpen(Long roomId, String roomName, String bedNo); - ErrorCode bedClose(Long roomId, String bedNo); - ErrorCode bedDoctorPause(Long roomId, String bedNo, Long docId, String docName); - ErrorCode bedDoctorResume(Long roomId, String bedNo, Long docId, String docName); - ErrorCode bedDoctorOn(Long roomId, String bedNo, Long docId, String docName); - ErrorCode bedDoctorOff(Long roomId, String bedNo, Long docId, String docName); - ErrorCode nextPatient(Long roomId, String bedNo); - - ErrorCode bedReload(); CommonResult<RoomRespVO> getRoom(Long roomId, String bedNo, Long docId); /** @@ -95,12 +86,6 @@ */ void queue(QueueSaveReqVO queueSaveReqVO); - - /** - * 鎶婂尰鐢熷�欒瘖鐨勯槦鍒楀婊� - */ - void hurryup(); - /** * 鍖荤敓鍙笅涓�浣嶆偅鑰� */ @@ -118,8 +103,6 @@ Integer recallPatient(Long roomId, String bedNo, String patId); Integer patientJump(String patId, Byte jumped ); - - void monitorInfo(); RoomDO getDocRoomInfo(Long docId); } 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 697126a..f5224de 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 @@ -48,6 +48,9 @@ public class QueueServiceImpl implements QueueService { @Resource + QueueServiceTxFunctions queueServiceTxFunctions; + + @Resource private OAuth2TokenApi oAuth2TokenApi; @Resource @@ -62,20 +65,7 @@ @Resource private DevRentMapper devRentMapper; - AtomicInteger openingFlag = new AtomicInteger(0); - AtomicInteger curSeqNum = new AtomicInteger(0); - - PriorityBlockingQueue<BedQueueBO> priorityQueue = new PriorityBlockingQueue<>(); - ConcurrentHashMap<String, BedQueueBO > mapBedVsQueue = new ConcurrentHashMap<>(); - ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); - - Integer queueReadyMax = 0; - - Integer bigScrenWaitingSize = 5; - Integer bigScrenPassedSize = 5; - Integer bigScrenWaitingFrom = 0; - Integer bigScrenPassedFrom = 0; @Override public Integer createqueue(QueueSaveReqVO createReqVO) { @@ -105,7 +95,7 @@ @Override public ErrorCode startBedOpen(Long roomId, String roomName, String bedNo) { - Future<ErrorCode> future = singleThreadExecutor.submit( new BedOpenCallable(this, roomId, roomName, bedNo)); + Future<ErrorCode> future = singleThreadExecutor.submit( new BedOpenCallable(queueServiceTxFunctions, roomId, roomName, bedNo)); try { ErrorCode ret = future.get(); @@ -122,7 +112,7 @@ @Override public ErrorCode startBedClose(Long roomId, String bedNo) { - Future<ErrorCode> future = singleThreadExecutor.submit( new BedCloseCallable(this, roomId, bedNo)); + Future<ErrorCode> future = singleThreadExecutor.submit( new BedCloseCallable(queueServiceTxFunctions, roomId, bedNo)); try { ErrorCode ret = future.get(); @@ -140,7 +130,7 @@ @Override public ErrorCode startBedDoctorPause(Long roomId, String bedNo, Long docId, String docName) { Future<ErrorCode> future = singleThreadExecutor.submit( - new BedDoctorPauseCallable(this, roomId, bedNo, docId, docName) + new BedDoctorPauseCallable(queueServiceTxFunctions, roomId, bedNo, docId, docName) ); try { @@ -159,7 +149,7 @@ @Override public ErrorCode startBedDoctorResume(Long roomId, String bedNo, Long docId, String docName) { Future<ErrorCode> future = singleThreadExecutor.submit( - new BedDoctorResumeCallable(this, roomId, bedNo, docId, docName) + new BedDoctorResumeCallable(queueServiceTxFunctions, roomId, bedNo, docId, docName) ); try { @@ -178,7 +168,7 @@ @Override public ErrorCode startBedDoctorOn(Long roomId, String bedNo, Long docId, String docName) { Future<ErrorCode> future = singleThreadExecutor.submit( - new BedDoctorOnCallable(this, roomId, bedNo, docId, docName) + new BedDoctorOnCallable(queueServiceTxFunctions, roomId, bedNo, docId, docName) ); try { @@ -197,7 +187,7 @@ @Override public ErrorCode startBedDoctorOff(Long roomId, String bedNo, Long docId, String docName) { Future<ErrorCode> future = singleThreadExecutor.submit( - new BedDoctorOffCallable(this, roomId, bedNo, docId, docName) + new BedDoctorOffCallable(queueServiceTxFunctions, roomId, bedNo, docId, docName) ); try { @@ -216,7 +206,7 @@ @Override public ErrorCode startNextPatient(Long roomId, String bedNo) { Future<ErrorCode> future = singleThreadExecutor.submit( - new BedDoctorNextPatientCallable(this, roomId, bedNo) + new BedDoctorNextPatientCallable(queueServiceTxFunctions, roomId, bedNo) ); try { @@ -235,112 +225,31 @@ @Override public void startHurryUp() { singleThreadExecutor.execute( () -> { - hurryup(); + queueServiceTxFunctions.hurryup(); }); } @Override public void startBedReload() { singleThreadExecutor.execute( () -> { - bedReload(); - hurryup(); - monitorInfo(); + queueServiceTxFunctions.bedReload(); + queueServiceTxFunctions.hurryup(); + queueServiceTxFunctions.monitorInfo(); }); } @Override public void startResetRoom() { singleThreadExecutor.execute( () -> { - resetRoom(); - bedReload(); - monitorInfo(); + queueServiceTxFunctions.resetRoom(); + queueServiceTxFunctions.bedReload(); + queueServiceTxFunctions.monitorInfo(); }); } @Override public MonitorInfoVO getMonitorInfo() { - MonitorInfoVO monitorInfoVO = new MonitorInfoVO(); - monitorInfoVO.setOpeningFlag( openingFlag.get() ); - monitorInfoVO.setQueueNum( mapBedVsQueue.size() ); - monitorInfoVO.setActiveQueueNum( priorityQueue.size() ); - return monitorInfoVO; - } - - /** - * 宸插叧闂� 鎴栬�� 鍏抽棴涓紝鍙互寮�閫氬伐浣� - * @param roomId - * @param bedNo - * @return - */ - @Override - public ErrorCode bedOpen(Long roomId, String roomName, String bedNo) { - BedQueueBO bedQueueBO2 = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo)); - if (null != bedQueueBO2) { - log.error("bedOpen mapBedVsQueue has existed. " + roomId + " " + bedNo); - return QUEUE_BED_EXIST; - } - - // DB update - List statusList = new ArrayList<BedStatusEnum>(); - statusList.add(BedStatusEnum.CLOSED); - Integer updateNum = roomMapper.setBedOpeningOpening(roomId, bedNo, BedStatusEnum.OPENING, statusList); - if ( null==updateNum || 0 == updateNum ) { - log.error("bedOpen DB invalid status. " + roomId + " " + bedNo); - return ROOM_INVALID_STATUS; - } - - List<Byte> queueStatusList = new ArrayList<>(); - queueStatusList.add(QueueStatusEnum.READY.getStatus()); - List<QueueDO> queueDOList = queueMapper.getDoctorQueueByStatus(roomId, bedNo, queueStatusList); - - // 鏂板宸ヤ綅 浼樺厛闃熷垪 - BedQueueBO bedQueueBO = new BedQueueBO(); - bedQueueBO.setRoomId(roomId); - bedQueueBO.setRoomName(roomName); - bedQueueBO.setBedNo(bedNo); - bedQueueBO.setMaxQueueNum(queueReadyMax); - bedQueueBO.setQueueNum(new AtomicInteger(queueDOList.size())); - bedQueueBO.setStatus(BedStatusEnum.OPENING.getStatus()); - priorityQueue.offer(bedQueueBO); - mapBedVsQueue.put(String.format("%09d%s", roomId, bedNo), bedQueueBO); - - return GlobalErrorCodeConstants.SUCCESS; - } - - @Override - public ErrorCode bedClose(Long roomId, String bedNo) { - BedQueueBO bedQueueBO = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo)); - if (null == bedQueueBO) { - log.error("bedClose mapBedVsQueue DONOT existed. " + roomId + " " + bedNo); - return QUEUE_BED_NOT_EXIST; - } - - // 闄や簡鍒ゆ柇 鍑嗗鍊欒瘖涓� 鐨勪汉鏁帮紝杩橀渶瑕� 鍒ゆ柇 杩囧彿鐨勪汉鏁� - //if (bedQueueBO.getQueueNum().get() >0) - // return QUEUE_HAVE_PATIENT; - List<Byte> queueStatusList = new ArrayList<>(); - queueStatusList.add(QueueStatusEnum.READY.getStatus()); - queueStatusList.add(QueueStatusEnum.PASSED.getStatus()); - queueStatusList.add(QueueStatusEnum.RECALLED.getStatus()); - List<QueueDO> queueDOList = queueMapper.getDoctorQueueByStatus(roomId, bedNo, queueStatusList); - if (queueDOList.size() > 0) - return QUEUE_HAVE_PATIENT; - - // DB update - List statusList = new ArrayList<BedStatusEnum>(); - statusList.add(BedStatusEnum.OPENING); - statusList.add(BedStatusEnum.DOCTOR_ON); - statusList.add(BedStatusEnum.PAUSE); - Integer updateNum = roomMapper.setBedOpeningClosed(roomId, bedNo, - BedStatusEnum.CLOSED, statusList); - if ( null==updateNum || 0 == updateNum ) { - log.error("bedClose DB invalid status. " + roomId + " " + bedNo); - return ROOM_INVALID_STATUS; - } - - mapBedVsQueue.remove(String.format("%09d%s", roomId, bedNo)); - priorityQueue.remove(bedQueueBO); - return GlobalErrorCodeConstants.SUCCESS; + return queueServiceTxFunctions.getMonitorInfo(); } @Override @@ -350,7 +259,7 @@ return error(ROOM_NOT_SIT); } - BedQueueBO bedQueueBO = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo)); + BedQueueBO bedQueueBO = queueServiceTxFunctions.getBedQueueBO(roomId, bedNo); if (null == bedQueueBO) { log.error("getRoom mapBedVsQueue DONOT existed. " + roomId + " " + bedNo); return error(QUEUE_BED_NOT_EXIST); @@ -358,110 +267,6 @@ RoomRespVO roomRespVO = BeanUtils.toBean(roomDO, RoomRespVO.class); return success(roomRespVO); - } - - @Override - public ErrorCode bedDoctorPause(Long roomId, String bedNo, Long docId, String docName) { - BedQueueBO bedQueueBO = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo)); - if (null == bedQueueBO) { - log.error("bedDoctorPause mapBedVsQueue DONOT existed. " + roomId + " " + bedNo); - return QUEUE_BED_NOT_EXIST; - } - - // DB update - List statusList = new ArrayList<BedStatusEnum>(); - statusList.add(BedStatusEnum.DOCTOR_ON); - Integer updateNum = roomMapper.setBedDoctorStatus(roomId, bedNo, docId, BedStatusEnum.PAUSE, statusList); - if ( null==updateNum || 0 == updateNum ) { - log.error("bedDoctorPause DB invalid status. " + roomId + " " + bedNo); - return ROOM_INVALID_STATUS; - } - - bedQueueBO.setStatus(BedStatusEnum.PAUSE.getStatus()); - priorityQueue.remove(bedQueueBO); - return GlobalErrorCodeConstants.SUCCESS; - } - - @Override - public ErrorCode bedDoctorResume(Long roomId, String bedNo, Long docId, String docName) { - BedQueueBO bedQueueBO = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo)); - if (null == bedQueueBO || !bedQueueBO.getStatus().equals(BedStatusEnum.PAUSE.getStatus())) { - log.error("bedDoctorResume mapBedVsQueue DONOT existed OR NOT Paused. " + roomId + " " + bedNo); - return QUEUE_BED_NOT_EXIST; - } - - // DB update - List statusList = new ArrayList<BedStatusEnum>(); - statusList.add(BedStatusEnum.PAUSE); - Integer updateNum = roomMapper.setBedDoctorStatus(roomId, bedNo, docId, - BedStatusEnum.DOCTOR_ON, statusList); - if ( null==updateNum || 0 == updateNum ) { - log.error("bedDoctorResume DB invalid status. " + roomId + " " + bedNo); - return ROOM_INVALID_STATUS; - } - - 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; - } - - return GlobalErrorCodeConstants.SUCCESS; - } - - @Override - public ErrorCode bedDoctorOn(Long roomId, String bedNo, Long docId, String docName) { - BedQueueBO bedQueueBO = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo)); - if (null == bedQueueBO) { - log.error("bedDoctorOn mapBedVsQueue DONOT existed. " + roomId + " " + bedNo); - return QUEUE_BED_NOT_EXIST; - } - - // DB update - List statusList = new ArrayList<BedStatusEnum>(); - statusList.add(BedStatusEnum.OPENING); - Integer updateNum = roomMapper.setBedDoctorOn(roomId, bedNo, docId, docName, BedStatusEnum.DOCTOR_ON, statusList); - if ( null==updateNum || 0 == updateNum ) { - log.error("bedDoctorOn DB invalid status. " + roomId + " " + bedNo); - return ROOM_INVALID_STATUS; - } - - bedQueueBO.setStatus(BedStatusEnum.DOCTOR_ON.getStatus()); - return GlobalErrorCodeConstants.SUCCESS; - } - - @Override - public ErrorCode bedDoctorOff(Long roomId, String bedNo, Long docId, String docName) { - BedQueueBO bedQueueBO = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo)); - if (null == bedQueueBO) { - log.error("bedDoctorOff mapBedVsQueue DONOT existed. " + roomId + " " + bedNo); - return QUEUE_BED_NOT_EXIST; - } - - // DB update - List statusList = new ArrayList<BedStatusEnum>(); - statusList.add(BedStatusEnum.DOCTOR_ON); - statusList.add(BedStatusEnum.PAUSE); - Integer updateNum = roomMapper.setBedDoctorOff(roomId, bedNo, docId, BedStatusEnum.OPENING, statusList); - if ( null==updateNum || 0 == updateNum ) { - log.error("bedDoctorOff DB invalid status. " + roomId + " " + bedNo); - return ROOM_INVALID_STATUS; - } - - // 濡傛灉鏄湪 PAUSE 鐘舵�佺搴х殑锛岄渶瑕侀噸鏂板姞鍥� 浼樺厛闃熷垪 - if (bedQueueBO.getStatus().equals(BedStatusEnum.PAUSE.getStatus())) { - if (!priorityQueue.contains(bedQueueBO)) { - priorityQueue.offer(bedQueueBO); - } else { - log.error("bedDoctorResume priorityQueue still exist!. " + roomId + " " + bedNo); - return ECG_INNER_ERROR; - } - } - - bedQueueBO.setStatus(BedStatusEnum.OPENING.getStatus()); - return GlobalErrorCodeConstants.SUCCESS; } private void validatequeueExists(Integer id) { @@ -480,122 +285,6 @@ return queueMapper.selectPage(pageReqVO); } - /** - * 1. 姣忓ぉ寮�璇婂墠 浠嶥B鍚屾宸ヤ綅鐨勬偅鑰呴槦鍒楁暟鎹埌 宸ヤ綅浼樺厛闃熷垪 - * 2. 鏈嶅姟杩愮淮閲嶅惎鏃� - */ - @Override - public ErrorCode bedReload() { - priorityQueue.clear(); - mapBedVsQueue.clear(); - - // 娓呴櫎闈炲綋澶╃殑鎺掗槦浜哄憳 - queueMapper.clearQueue(); - // 娓呴櫎闈炲綋澶╃殑璇煶鍙彿璁板綍 - callMapper.clearCall(); - - // 浠嶥B 鑾峰彇 宸ヤ綅鍒楄〃 - List<BedStatusEnum> bedStatusEnumList = new ArrayList<BedStatusEnum>(); - bedStatusEnumList.add(BedStatusEnum.OPENING); - bedStatusEnumList.add(BedStatusEnum.DOCTOR_ON); - bedStatusEnumList.add(BedStatusEnum.PAUSE); - List<RoomDO> roomDOList = roomMapper.simpleRoomList(bedStatusEnumList); - List<BedQueueBO> bedQueueBOList = roomDOList.stream().map(item -> BeanUtils.toBean(item, BedQueueBO.class)).toList(); - - // 浠嶥B 鑾峰彇 闃熷垪涓� 灏辫瘖鍑嗗涓汉鍛樼粺璁� 鍒楄〃 - List<Byte> queueStatusList = new ArrayList<>(); - queueStatusList.add(QueueStatusEnum.READY.getStatus()); - List<QueueStatisticDO> queueStatisticDOList = queueMapper.queueStatistic(queueStatusList); - - bedQueueBOList.forEach(item -> { - item.maxQueueNum = queueReadyMax; - Optional<QueueStatisticDO> queueStatisticDOOptional = queueStatisticDOList.stream().filter(it->it.getRoomId()==item.roomId && it.getBedNo().equals(item.getBedNo())).findFirst(); - int queueNum = queueStatisticDOOptional.isPresent() ? queueStatisticDOOptional.get().getTotalInStatus() : 0; - if ( queueReadyMax < queueNum ) - throw new RuntimeException("init: exceed max queue number!"); - - item.queueNum.set( queueNum ); - mapBedVsQueue.put(String.format("%09d%s", item.roomId, item.bedNo), item); - if (BedStatusEnum.PAUSE.getStatus() != item.getStatus()) { - priorityQueue.offer(item); - } - }); - - Integer num = queueMapper.getMaxSeqNum(); - curSeqNum = new AtomicInteger(null == num ? 0 : num); - - return GlobalErrorCodeConstants.SUCCESS; - } - - /** - * - */ - public void hurryup() { - if (0 == openingFlag.get()) - return; - - // 澶勭悊 杩囧彿-鍥炴潵 鐨勪汉 - 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; - - curSeqNum.getAndIncrement(); - - // 鍙兘宸茬粡銆愬苟鍙戠殑銆戝湪 nextPatient 涓敼鍙樹簡鍊� - bedQueueBO.queueNum.incrementAndGet(); - - // 鍙兘宸茬粡銆愬苟鍙戠殑銆戝湪 nextPatient 涓敼鍙樹簡浼樺厛闃熷垪椤哄簭 - priorityQueue.remove(bedQueueBO); - priorityQueue.offer(bedQueueBO); - } - } - - // 澶勭悊 鎺掗槦涓� 鎮h�� - while (true) { - BedQueueBO bedQueueBO = priorityQueue.peek(); - if (null == bedQueueBO) - return; - - int curQueueNum = bedQueueBO.queueNum.get(); - if (curQueueNum > bedQueueBO.maxQueueNum) - throw new RuntimeException("hurryup: exceed max queue number!"); - - if (curQueueNum == bedQueueBO.maxQueueNum) - return; - - // 鏌ョ湅 鏄惁鏈夋帓闃熶腑鐨勬偅鑰� - Integer updateNum = queueMapper.preemptPatient( - bedQueueBO.getRoomId(), - bedQueueBO.getRoomName(), - bedQueueBO.getBedNo(), - curSeqNum.get() + 1, - QueueStatusEnum.WAITING.getStatus(), - QueueStatusEnum.READY.getStatus()); - - // 娌℃湁鎶㈠埌鎺掗槦鎮h�� - if (null == updateNum || 0 == updateNum) { - return; - } - - curSeqNum.getAndIncrement(); - - // 鍙兘宸茬粡銆愬苟鍙戠殑銆戝湪 nextPatient 涓敼鍙樹簡鍊� - bedQueueBO.queueNum.incrementAndGet(); - - // 鍙兘宸茬粡銆愬苟鍙戠殑銆戝湪 nextPatient 涓敼鍙樹簡浼樺厛闃熷垪椤哄簭 - priorityQueue.remove(bedQueueBO); - priorityQueue.offer(bedQueueBO); - } - } /** * 棰勭害纭鍚庣殑鎺掗槦 @@ -613,25 +302,6 @@ devRentMapper.insert(devRent); startHurryUp(); - } - - @Override - public ErrorCode nextPatient(Long roomId, String bedNo) { - // 浠� DB 鎶� 搴忓彿鏈�灏忕殑 灏辫瘖鍑嗗涓殑浜� 璁剧疆涓哄氨璇婁腑 - Integer updateNum = queueMapper.updateQueueStatus(roomId, bedNo, - QueueStatusEnum.READY.getStatus(), QueueStatusEnum.ONSTAGE.getStatus()); - // 璇ュ伐浣� 娌℃湁 灏辫瘖鍑嗗涓� 浜哄憳 - if (null == updateNum || 0 == updateNum) { - return QUEUE_NOT_READY_PATIENT; - } - - // 浼樺厛闃熷垪涓� 璇ュ伐浣� 灏辫瘖鍑嗗涓汉鐨勬暟閲� 鍑忎竴 - BedQueueBO bo = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo)); - bo.queueNum.getAndDecrement(); // 鍙兘宸茬粡銆愬苟鍙戠殑銆戝湪 hurry-up 涓敼鍙樹簡鍊� - priorityQueue.remove(bo); - priorityQueue.offer(bo); - - return GlobalErrorCodeConstants.SUCCESS; } public void finishNextPatient(Long roomId, String bedNo) { @@ -678,19 +348,19 @@ @Override public void setQueueReadyMax(Integer max) { - queueReadyMax = max; + queueServiceTxFunctions.setQueueReadyMax( max ); } public void startBiz() { - if (1 == openingFlag.get()) + if (1 == queueServiceTxFunctions.getOpeningFlag()) return; - openingFlag.set(1); + queueServiceTxFunctions.setOpeningFlag(1); startBedReload(); } public void closeBiz() { - openingFlag.set(0); + queueServiceTxFunctions.setOpeningFlag(0); startBedReload(); } @@ -710,27 +380,8 @@ } @Override - public void monitorInfo() { - log.info("map " + mapBedVsQueue.size() + " priority " + priorityQueue.size() - + " opening " + openingFlag.get()); - } - - @Override public RoomDO getDocRoomInfo(Long docId) { return roomMapper.getRoomByDocId(docId); - } - - public void resetRoom() { - // 韪㈠嚭鍦ㄥ骇鐨勫尰鐢� - List<BedStatusEnum> bedStatusEnumList = new ArrayList<BedStatusEnum>(); - bedStatusEnumList.add(BedStatusEnum.DOCTOR_ON); - bedStatusEnumList.add(BedStatusEnum.PAUSE); - List<RoomDO> roomDOList = roomMapper.simpleRoomList(bedStatusEnumList); - List<Long> userIdList = roomDOList.stream().map(roomDO -> roomDO.getDocId()).toList(); - oAuth2TokenApi.tick(userIdList); - - // 鍏抽棴鎵�鏈夊伐浣� - Integer ret = roomMapper.resetRoom(BedStatusEnum.CLOSED.getStatus()); } } 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 new file mode 100644 index 0000000..93ed504 --- /dev/null +++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceTxFunctions.java @@ -0,0 +1,428 @@ +package cn.lihu.jh.module.ecg.service.queue; + +import cn.lihu.jh.framework.common.exception.ErrorCode; +import cn.lihu.jh.framework.common.exception.enums.GlobalErrorCodeConstants; +import cn.lihu.jh.framework.common.pojo.CommonResult; +import cn.lihu.jh.framework.common.pojo.PageResult; +import cn.lihu.jh.framework.common.util.object.BeanUtils; +import cn.lihu.jh.module.ecg.controller.admin.queue.vo.PatientStatisticVO; +import cn.lihu.jh.module.ecg.controller.admin.queue.vo.QueuePageReqVO; +import cn.lihu.jh.module.ecg.controller.admin.queue.vo.QueueSaveReqVO; +import cn.lihu.jh.module.ecg.controller.admin.room.vo.MonitorInfoVO; +import cn.lihu.jh.module.ecg.controller.admin.room.vo.RoomRespVO; +import cn.lihu.jh.module.ecg.dal.dataobject.devrent.DevRentDO; +import cn.lihu.jh.module.ecg.dal.dataobject.queue.BedQueueStatisticDO; +import cn.lihu.jh.module.ecg.dal.dataobject.queue.QueueDO; +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.mysql.call.CallMapper; +import cn.lihu.jh.module.ecg.dal.mysql.devrent.DevRentMapper; +import cn.lihu.jh.module.ecg.dal.mysql.queue.queueMapper; +import cn.lihu.jh.module.ecg.dal.mysql.room.RoomMapper; +import cn.lihu.jh.module.ecg.enums.BedStatusEnum; +import cn.lihu.jh.module.ecg.enums.DevRentStateEnum; +import cn.lihu.jh.module.ecg.enums.QueueStatusEnum; +import cn.lihu.jh.module.system.api.oauth2.OAuth2TokenApi; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; + +import static cn.lihu.jh.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.lihu.jh.framework.common.pojo.CommonResult.error; +import static cn.lihu.jh.framework.common.pojo.CommonResult.success; +import static cn.lihu.jh.module.ecg.enums.ErrorCodeConstants.*; + +/** + * 鎺掗槦 Service 鏁版嵁搴撲簨鍔$浉鍏崇殑鏂规硶 + * + * @author 鑺嬮亾婧愮爜 + */ +@Component +@Validated +@Slf4j +public class QueueServiceTxFunctions { + + @Resource + private OAuth2TokenApi oAuth2TokenApi; + + @Resource + private queueMapper queueMapper; + + @Resource + private RoomMapper roomMapper; + + @Resource + private CallMapper callMapper; + + @Resource + private DevRentMapper devRentMapper; + + AtomicInteger openingFlag = new AtomicInteger(0); + AtomicInteger curSeqNum = new AtomicInteger(0); + + PriorityBlockingQueue<BedQueueBO> priorityQueue = new PriorityBlockingQueue<>(); + ConcurrentHashMap<String, BedQueueBO > mapBedVsQueue = new ConcurrentHashMap<>(); + + Integer queueReadyMax = 0; + + /** + * 宸插叧闂� 鎴栬�� 鍏抽棴涓紝鍙互寮�閫氬伐浣� + * @param roomId + * @param bedNo + * @return + */ + public ErrorCode bedOpen(Long roomId, String roomName, String bedNo) { + BedQueueBO bedQueueBO2 = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo)); + if (null != bedQueueBO2) { + log.error("bedOpen mapBedVsQueue has existed. " + roomId + " " + bedNo); + return QUEUE_BED_EXIST; + } + + // DB update + List statusList = new ArrayList<BedStatusEnum>(); + statusList.add(BedStatusEnum.CLOSED); + Integer updateNum = roomMapper.setBedOpeningOpening(roomId, bedNo, BedStatusEnum.OPENING, statusList); + if ( null==updateNum || 0 == updateNum ) { + log.error("bedOpen DB invalid status. " + roomId + " " + bedNo); + return ROOM_INVALID_STATUS; + } + + List<Byte> queueStatusList = new ArrayList<>(); + queueStatusList.add(QueueStatusEnum.READY.getStatus()); + List<QueueDO> queueDOList = queueMapper.getDoctorQueueByStatus(roomId, bedNo, queueStatusList); + + // 鏂板宸ヤ綅 浼樺厛闃熷垪 + BedQueueBO bedQueueBO = new BedQueueBO(); + bedQueueBO.setRoomId(roomId); + bedQueueBO.setRoomName(roomName); + bedQueueBO.setBedNo(bedNo); + bedQueueBO.setMaxQueueNum(queueReadyMax); + bedQueueBO.setQueueNum(new AtomicInteger(queueDOList.size())); + bedQueueBO.setStatus(BedStatusEnum.OPENING.getStatus()); + priorityQueue.offer(bedQueueBO); + mapBedVsQueue.put(String.format("%09d%s", roomId, bedNo), bedQueueBO); + + return GlobalErrorCodeConstants.SUCCESS; + } + + public ErrorCode bedClose(Long roomId, String bedNo) { + BedQueueBO bedQueueBO = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo)); + if (null == bedQueueBO) { + log.error("bedClose mapBedVsQueue DONOT existed. " + roomId + " " + bedNo); + return QUEUE_BED_NOT_EXIST; + } + + // 闄や簡鍒ゆ柇 鍑嗗鍊欒瘖涓� 鐨勪汉鏁帮紝杩橀渶瑕� 鍒ゆ柇 杩囧彿鐨勪汉鏁� + //if (bedQueueBO.getQueueNum().get() >0) + // return QUEUE_HAVE_PATIENT; + List<Byte> queueStatusList = new ArrayList<>(); + queueStatusList.add(QueueStatusEnum.READY.getStatus()); + queueStatusList.add(QueueStatusEnum.PASSED.getStatus()); + queueStatusList.add(QueueStatusEnum.RECALLED.getStatus()); + List<QueueDO> queueDOList = queueMapper.getDoctorQueueByStatus(roomId, bedNo, queueStatusList); + if (queueDOList.size() > 0) + return QUEUE_HAVE_PATIENT; + + // DB update + List statusList = new ArrayList<BedStatusEnum>(); + statusList.add(BedStatusEnum.OPENING); + statusList.add(BedStatusEnum.DOCTOR_ON); + statusList.add(BedStatusEnum.PAUSE); + Integer updateNum = roomMapper.setBedOpeningClosed(roomId, bedNo, + BedStatusEnum.CLOSED, statusList); + if ( null==updateNum || 0 == updateNum ) { + log.error("bedClose DB invalid status. " + roomId + " " + bedNo); + return ROOM_INVALID_STATUS; + } + + mapBedVsQueue.remove(String.format("%09d%s", roomId, bedNo)); + priorityQueue.remove(bedQueueBO); + return GlobalErrorCodeConstants.SUCCESS; + } + + public ErrorCode bedDoctorPause(Long roomId, String bedNo, Long docId, String docName) { + BedQueueBO bedQueueBO = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo)); + if (null == bedQueueBO) { + log.error("bedDoctorPause mapBedVsQueue DONOT existed. " + roomId + " " + bedNo); + return QUEUE_BED_NOT_EXIST; + } + + // DB update + List statusList = new ArrayList<BedStatusEnum>(); + statusList.add(BedStatusEnum.DOCTOR_ON); + Integer updateNum = roomMapper.setBedDoctorStatus(roomId, bedNo, docId, BedStatusEnum.PAUSE, statusList); + if ( null==updateNum || 0 == updateNum ) { + log.error("bedDoctorPause DB invalid status. " + roomId + " " + bedNo); + return ROOM_INVALID_STATUS; + } + + bedQueueBO.setStatus(BedStatusEnum.PAUSE.getStatus()); + priorityQueue.remove(bedQueueBO); + return GlobalErrorCodeConstants.SUCCESS; + } + + public ErrorCode bedDoctorResume(Long roomId, String bedNo, Long docId, String docName) { + BedQueueBO bedQueueBO = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo)); + if (null == bedQueueBO || !bedQueueBO.getStatus().equals(BedStatusEnum.PAUSE.getStatus())) { + log.error("bedDoctorResume mapBedVsQueue DONOT existed OR NOT Paused. " + roomId + " " + bedNo); + return QUEUE_BED_NOT_EXIST; + } + + // DB update + List statusList = new ArrayList<BedStatusEnum>(); + statusList.add(BedStatusEnum.PAUSE); + Integer updateNum = roomMapper.setBedDoctorStatus(roomId, bedNo, docId, + BedStatusEnum.DOCTOR_ON, statusList); + if ( null==updateNum || 0 == updateNum ) { + log.error("bedDoctorResume DB invalid status. " + roomId + " " + bedNo); + return ROOM_INVALID_STATUS; + } + + 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; + } + + return GlobalErrorCodeConstants.SUCCESS; + } + + public ErrorCode bedDoctorOn(Long roomId, String bedNo, Long docId, String docName) { + BedQueueBO bedQueueBO = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo)); + if (null == bedQueueBO) { + log.error("bedDoctorOn mapBedVsQueue DONOT existed. " + roomId + " " + bedNo); + return QUEUE_BED_NOT_EXIST; + } + + // DB update + List statusList = new ArrayList<BedStatusEnum>(); + statusList.add(BedStatusEnum.OPENING); + Integer updateNum = roomMapper.setBedDoctorOn(roomId, bedNo, docId, docName, BedStatusEnum.DOCTOR_ON, statusList); + if ( null==updateNum || 0 == updateNum ) { + log.error("bedDoctorOn DB invalid status. " + roomId + " " + bedNo); + return ROOM_INVALID_STATUS; + } + + bedQueueBO.setStatus(BedStatusEnum.DOCTOR_ON.getStatus()); + return GlobalErrorCodeConstants.SUCCESS; + } + + public ErrorCode bedDoctorOff(Long roomId, String bedNo, Long docId, String docName) { + BedQueueBO bedQueueBO = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo)); + if (null == bedQueueBO) { + log.error("bedDoctorOff mapBedVsQueue DONOT existed. " + roomId + " " + bedNo); + return QUEUE_BED_NOT_EXIST; + } + + // DB update + List statusList = new ArrayList<BedStatusEnum>(); + statusList.add(BedStatusEnum.DOCTOR_ON); + statusList.add(BedStatusEnum.PAUSE); + Integer updateNum = roomMapper.setBedDoctorOff(roomId, bedNo, docId, BedStatusEnum.OPENING, statusList); + if ( null==updateNum || 0 == updateNum ) { + log.error("bedDoctorOff DB invalid status. " + roomId + " " + bedNo); + return ROOM_INVALID_STATUS; + } + + // 濡傛灉鏄湪 PAUSE 鐘舵�佺搴х殑锛岄渶瑕侀噸鏂板姞鍥� 浼樺厛闃熷垪 + if (bedQueueBO.getStatus().equals(BedStatusEnum.PAUSE.getStatus())) { + if (!priorityQueue.contains(bedQueueBO)) { + priorityQueue.offer(bedQueueBO); + } else { + log.error("bedDoctorResume priorityQueue still exist!. " + roomId + " " + bedNo); + return ECG_INNER_ERROR; + } + } + + bedQueueBO.setStatus(BedStatusEnum.OPENING.getStatus()); + return GlobalErrorCodeConstants.SUCCESS; + } + + public ErrorCode nextPatient(Long roomId, String bedNo) { + // 浠� DB 鎶� 搴忓彿鏈�灏忕殑 灏辫瘖鍑嗗涓殑浜� 璁剧疆涓哄氨璇婁腑 + Integer updateNum = queueMapper.updateQueueStatus(roomId, bedNo, + QueueStatusEnum.READY.getStatus(), QueueStatusEnum.ONSTAGE.getStatus()); + // 璇ュ伐浣� 娌℃湁 灏辫瘖鍑嗗涓� 浜哄憳 + if (null == updateNum || 0 == updateNum) { + return QUEUE_NOT_READY_PATIENT; + } + + // 浼樺厛闃熷垪涓� 璇ュ伐浣� 灏辫瘖鍑嗗涓汉鐨勬暟閲� 鍑忎竴 + BedQueueBO bo = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo)); + bo.queueNum.getAndDecrement(); // 鍙兘宸茬粡銆愬苟鍙戠殑銆戝湪 hurry-up 涓敼鍙樹簡鍊� + priorityQueue.remove(bo); + priorityQueue.offer(bo); + + return GlobalErrorCodeConstants.SUCCESS; + } + + /** + * 1. 姣忓ぉ寮�璇婂墠 浠嶥B鍚屾宸ヤ綅鐨勬偅鑰呴槦鍒楁暟鎹埌 宸ヤ綅浼樺厛闃熷垪 + * 2. 鏈嶅姟杩愮淮閲嶅惎鏃� + */ + public ErrorCode bedReload() { + priorityQueue.clear(); + mapBedVsQueue.clear(); + + // 娓呴櫎闈炲綋澶╃殑鎺掗槦浜哄憳 + queueMapper.clearQueue(); + // 娓呴櫎闈炲綋澶╃殑璇煶鍙彿璁板綍 + callMapper.clearCall(); + + // 浠嶥B 鑾峰彇 宸ヤ綅鍒楄〃 + List<BedStatusEnum> bedStatusEnumList = new ArrayList<BedStatusEnum>(); + bedStatusEnumList.add(BedStatusEnum.OPENING); + bedStatusEnumList.add(BedStatusEnum.DOCTOR_ON); + bedStatusEnumList.add(BedStatusEnum.PAUSE); + List<RoomDO> roomDOList = roomMapper.simpleRoomList(bedStatusEnumList); + List<BedQueueBO> bedQueueBOList = roomDOList.stream().map(item -> BeanUtils.toBean(item, BedQueueBO.class)).toList(); + + // 浠嶥B 鑾峰彇 闃熷垪涓� 灏辫瘖鍑嗗涓汉鍛樼粺璁� 鍒楄〃 + List<Byte> queueStatusList = new ArrayList<>(); + queueStatusList.add(QueueStatusEnum.READY.getStatus()); + List<QueueStatisticDO> queueStatisticDOList = queueMapper.queueStatistic(queueStatusList); + + bedQueueBOList.forEach(item -> { + item.maxQueueNum = queueReadyMax; + Optional<QueueStatisticDO> queueStatisticDOOptional = queueStatisticDOList.stream().filter(it->it.getRoomId()==item.roomId && it.getBedNo().equals(item.getBedNo())).findFirst(); + int queueNum = queueStatisticDOOptional.isPresent() ? queueStatisticDOOptional.get().getTotalInStatus() : 0; + if ( queueReadyMax < queueNum ) + throw new RuntimeException("init: exceed max queue number!"); + + item.queueNum.set( queueNum ); + mapBedVsQueue.put(String.format("%09d%s", item.roomId, item.bedNo), item); + if (BedStatusEnum.PAUSE.getStatus() != item.getStatus()) { + priorityQueue.offer(item); + } + }); + + Integer num = queueMapper.getMaxSeqNum(); + curSeqNum = new AtomicInteger(null == num ? 0 : num); + + return GlobalErrorCodeConstants.SUCCESS; + } + + public void resetRoom() { + // 韪㈠嚭鍦ㄥ骇鐨勫尰鐢� + List<BedStatusEnum> bedStatusEnumList = new ArrayList<BedStatusEnum>(); + bedStatusEnumList.add(BedStatusEnum.DOCTOR_ON); + bedStatusEnumList.add(BedStatusEnum.PAUSE); + List<RoomDO> roomDOList = roomMapper.simpleRoomList(bedStatusEnumList); + List<Long> userIdList = roomDOList.stream().map(roomDO -> roomDO.getDocId()).toList(); + oAuth2TokenApi.tick(userIdList); + + // 鍏抽棴鎵�鏈夊伐浣� + Integer ret = roomMapper.resetRoom(BedStatusEnum.CLOSED.getStatus()); + } + + /** + * 鎶婂尰鐢熷�欒瘖鐨勯槦鍒楀婊� + */ + public void hurryup() { + if (0 == openingFlag.get()) + return; + + // 澶勭悊 杩囧彿-鍥炴潵 鐨勪汉 + 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; + + curSeqNum.getAndIncrement(); + + // 鍙兘宸茬粡銆愬苟鍙戠殑銆戝湪 nextPatient 涓敼鍙樹簡鍊� + bedQueueBO.queueNum.incrementAndGet(); + + // 鍙兘宸茬粡銆愬苟鍙戠殑銆戝湪 nextPatient 涓敼鍙樹簡浼樺厛闃熷垪椤哄簭 + priorityQueue.remove(bedQueueBO); + priorityQueue.offer(bedQueueBO); + } + } + + // 澶勭悊 鎺掗槦涓� 鎮h�� + while (true) { + BedQueueBO bedQueueBO = priorityQueue.peek(); + if (null == bedQueueBO) + return; + + int curQueueNum = bedQueueBO.queueNum.get(); + if (curQueueNum > bedQueueBO.maxQueueNum) + throw new RuntimeException("hurryup: exceed max queue number!"); + + if (curQueueNum == bedQueueBO.maxQueueNum) + return; + + // 鏌ョ湅 鏄惁鏈夋帓闃熶腑鐨勬偅鑰� + Integer updateNum = queueMapper.preemptPatient( + bedQueueBO.getRoomId(), + bedQueueBO.getRoomName(), + bedQueueBO.getBedNo(), + curSeqNum.get() + 1, + QueueStatusEnum.WAITING.getStatus(), + QueueStatusEnum.READY.getStatus()); + + // 娌℃湁鎶㈠埌鎺掗槦鎮h�� + if (null == updateNum || 0 == updateNum) { + return; + } + + curSeqNum.getAndIncrement(); + + // 鍙兘宸茬粡銆愬苟鍙戠殑銆戝湪 nextPatient 涓敼鍙樹簡鍊� + bedQueueBO.queueNum.incrementAndGet(); + + // 鍙兘宸茬粡銆愬苟鍙戠殑銆戝湪 nextPatient 涓敼鍙樹簡浼樺厛闃熷垪椤哄簭 + priorityQueue.remove(bedQueueBO); + priorityQueue.offer(bedQueueBO); + } + } + + public Integer getOpeningFlag() { + return openingFlag.get(); + } + + public void setOpeningFlag(Integer flag) { + openingFlag.set(flag); + } + + public void setQueueReadyMax(Integer max) { + queueReadyMax = max; + } + + public BedQueueBO getBedQueueBO(Long roomId, String bedNo) { + return mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo)); + } + + public MonitorInfoVO getMonitorInfo() { + MonitorInfoVO monitorInfoVO = new MonitorInfoVO(); + monitorInfoVO.setOpeningFlag( openingFlag.get() ); + monitorInfoVO.setQueueNum( mapBedVsQueue.size() ); + monitorInfoVO.setActiveQueueNum( priorityQueue.size() ); + return monitorInfoVO; + } + + public void monitorInfo() { + log.info("map " + mapBedVsQueue.size() + " priority " + priorityQueue.size() + + " opening " + openingFlag.get()); + } + +} -- Gitblit v1.9.3