From 1aecee3a44782899685bd2a098a16533f7a20846 Mon Sep 17 00:00:00 2001 From: eight <641137800@qq.com> Date: 星期一, 02 九月 2024 17:10:22 +0800 Subject: [PATCH] monitor info function --- jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/queueServiceImpl.java | 284 +++++++++++++++++++++++++++++++++++++------------------- 1 files changed, 188 insertions(+), 96 deletions(-) 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 537c778..63ed788 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 @@ -1,36 +1,34 @@ package cn.lihu.jh.module.ecg.service.queue; +import java.util.*; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; +import javax.annotation.Resource; + +import cn.lihu.jh.module.ecg.controller.admin.room.vo.MonitorInfoVO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import cn.lihu.jh.framework.common.exception.enums.GlobalErrorCodeConstants; +import cn.lihu.jh.module.ecg.dal.dataobject.room.RoomDO; import cn.lihu.jh.framework.common.exception.ErrorCode; import cn.lihu.jh.framework.common.pojo.CommonResult; import cn.lihu.jh.module.ecg.controller.admin.room.vo.RoomRespVO; import cn.lihu.jh.module.ecg.dal.dataobject.queue.BedQueueStatisticDO; import cn.lihu.jh.module.ecg.dal.dataobject.queue.QueueStatisticDO; -import cn.lihu.jh.module.ecg.dal.dataobject.room.RoomResVO; 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.QueueStatusEnum; -import cn.lihu.jh.module.infra.api.config.ConfigApi; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - import cn.lihu.jh.module.ecg.controller.admin.queue.vo.*; import cn.lihu.jh.module.ecg.dal.dataobject.queue.QueueDO; import cn.lihu.jh.framework.common.pojo.PageResult; import cn.lihu.jh.framework.common.util.object.BeanUtils; - import cn.lihu.jh.module.ecg.dal.mysql.queue.queueMapper; - -import javax.annotation.Resource; - -import java.util.*; -import java.util.concurrent.*; -import java.util.concurrent.atomic.AtomicInteger; - -import static cn.lihu.jh.framework.common.exception.enums.GlobalErrorCodeConstants.SUCCESS; +import static cn.lihu.jh.module.ecg.enums.ErrorCodeConstants.*; 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 瀹炵幇绫� @@ -39,10 +37,8 @@ */ @Service @Validated +@Slf4j public class QueueServiceImpl implements QueueService { - - @Resource - private ConfigApi configApi; @Resource private queueMapper queueMapper; @@ -99,6 +95,7 @@ e.printStackTrace(); } + System.out.println("startBedOpen ========"); return ECG_INNER_ERROR; } @@ -115,6 +112,7 @@ e.printStackTrace(); } + System.out.println("startBedClose ========"); return ECG_INNER_ERROR; } @@ -133,6 +131,7 @@ e.printStackTrace(); } + System.out.println("startBedDoctorPause ========"); return ECG_INNER_ERROR; } @@ -151,6 +150,7 @@ e.printStackTrace(); } + System.out.println("startBedDoctorResume ========"); return ECG_INNER_ERROR; } @@ -169,6 +169,7 @@ e.printStackTrace(); } + System.out.println("startBedDoctorOn ========"); return ECG_INNER_ERROR; } @@ -187,9 +188,53 @@ e.printStackTrace(); } + System.out.println("startBedDoctorOff ========"); return ECG_INNER_ERROR; } + @Override + public ErrorCode startNextPatient(Long roomId, String bedNo) { + Future<ErrorCode> future = singleThreadExecutor.submit( + new BedDoctorNextPatientCallable(this, roomId, bedNo) + ); + + try { + ErrorCode ret = future.get(); + return ret; + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (ExecutionException e) { + e.printStackTrace(); + } + + System.out.println("startNextPatient ========"); + return ECG_INNER_ERROR; + } + + @Override + public void startHurryUp() { + singleThreadExecutor.execute( () -> { + hurryup(); + }); + } + + @Override + public void startBedReload() { + singleThreadExecutor.execute( () -> { + bedReload(); + hurryup(); + monitorInfo(); + }); + } + + @Override + public MonitorInfoVO getMonitorInfo() { + MonitorInfoVO monitorInfoVO = new MonitorInfoVO(); + monitorInfoVO.setOpeningFlag( openingFlag.get() ); + monitorInfoVO.setQueueNum( mapBedVsQueue.size() ); + monitorInfoVO.setActiveQueueNum( priorityQueue.size() ); + return monitorInfoVO; + } /** * 宸插叧闂� 鎴栬�� 鍏抽棴涓紝鍙互寮�閫氬伐浣� @@ -199,13 +244,20 @@ */ @Override public ErrorCode bedOpen(Long roomId, 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.setBedStatus(roomId, bedNo, - BedStatusEnum.OPENING, statusList); - if ( null==updateNum || 0 == updateNum ) + 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()); @@ -217,129 +269,168 @@ bedQueueBO.setBedNo(bedNo); bedQueueBO.setMaxQueueNum(queueReadyMax); bedQueueBO.setQueueNum(new AtomicInteger(queueDOList.size())); - bedQueueBO.setStatusEnum(BedStatusEnum.OPENING); + bedQueueBO.setStatus(BedStatusEnum.OPENING.getStatus()); priorityQueue.offer(bedQueueBO); mapBedVsQueue.put(String.format("%09d%s", roomId, bedNo), bedQueueBO); - return SUCCESS; + + return GlobalErrorCodeConstants.SUCCESS; } @Override public ErrorCode bedClose(Long roomId, String bedNo) { BedQueueBO bedQueueBO = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo)); - if (null == bedQueueBO) - return QUEUE_BED_ABNORMAL; + if (null == bedQueueBO) { + log.error("bedClose mapBedVsQueue DONOT existed. " + roomId + " " + bedNo); + return QUEUE_BED_NOT_EXIST; + } - if (bedQueueBO.getQueueNum().get() >0) + // 闄や簡鍒ゆ柇 鍑嗗鍊欒瘖涓� 鐨勪汉鏁帮紝杩橀渶瑕� 鍒ゆ柇 杩囧彿鐨勪汉鏁� + //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.PASSED_RETURN.getStatus()); + List<QueueDO> queueDOList = queueMapper.getDoctorQueueByStatus(roomId, bedNo, queueStatusList); + if (queueDOList.size() > 0) return QUEUE_HAVE_PATIENT; - - BedStatusEnum destStatusEnum = destStatusEnum = BedStatusEnum.CLOSED; - mapBedVsQueue.remove(String.format("%09d%s", roomId, bedNo)); - priorityQueue.remove(bedQueueBO); // DB update List statusList = new ArrayList<BedStatusEnum>(); statusList.add(BedStatusEnum.OPENING); statusList.add(BedStatusEnum.DOCTOR_ON); statusList.add(BedStatusEnum.PAUSE); - Integer updateNum = roomMapper.setBedStatus(roomId, bedNo, destStatusEnum, statusList); - if ( null==updateNum || 0 == updateNum ) + 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; + } - return SUCCESS; + mapBedVsQueue.remove(String.format("%09d%s", roomId, bedNo)); + priorityQueue.remove(bedQueueBO); + return GlobalErrorCodeConstants.SUCCESS; } @Override public CommonResult<RoomRespVO> getRoom(Long roomId, String bedNo, Long docId) { + RoomDO roomDO = roomMapper.getRoom(roomId, bedNo, docId); + if (null == roomDO) { + return error(ROOM_NOT_SIT); + } + BedQueueBO bedQueueBO = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo)); if (null == bedQueueBO) { - return error(QUEUE_BED_ABNORMAL); + log.error("getRoom mapBedVsQueue DONOT existed. " + roomId + " " + bedNo); + return error(QUEUE_BED_NOT_EXIST); } - RoomResVO roomResVO = roomMapper.getRoom(roomId, bedNo, docId); - if (null == roomResVO) { - return error(ECG_INNER_ERROR); - } - - RoomRespVO roomRespVO = BeanUtils.toBean(roomResVO, RoomRespVO.class); + 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) - return QUEUE_BED_ABNORMAL; - - bedQueueBO.setStatusEnum(BedStatusEnum.PAUSE); - priorityQueue.remove(bedQueueBO); + 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.setBedDoctorPause(roomId, bedNo, docId, docName, - BedStatusEnum.PAUSE, statusList); - if ( null==updateNum || 0 == updateNum ) + 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; + } - return SUCCESS; + 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) - return QUEUE_BED_ABNORMAL; - - bedQueueBO.setStatusEnum(BedStatusEnum.DOCTOR_ON); - priorityQueue.offer(bedQueueBO); + 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.setBedDoctorPause(roomId, bedNo, docId, docName, + Integer updateNum = roomMapper.setBedDoctorStatus(roomId, bedNo, docId, BedStatusEnum.DOCTOR_ON, statusList); - if ( null==updateNum || 0 == updateNum ) + if ( null==updateNum || 0 == updateNum ) { + log.error("bedDoctorResume DB invalid status. " + roomId + " " + bedNo); return ROOM_INVALID_STATUS; + } - return SUCCESS; + 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) - return QUEUE_BED_ABNORMAL; + 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 ) + 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.setStatusEnum(BedStatusEnum.DOCTOR_ON); - - return SUCCESS; + 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) - return QUEUE_BED_ABNORMAL; + 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); - Integer updateNum = roomMapper.setBedDoctorOff(roomId, bedNo, docId, docName, - BedStatusEnum.OPENING, statusList); - if ( null==updateNum || 0 == updateNum ) + 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; + } - bedQueueBO.setStatusEnum(BedStatusEnum.OPENING); + // 濡傛灉鏄湪 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; + } + } - return SUCCESS; + bedQueueBO.setStatus(BedStatusEnum.OPENING.getStatus()); + return GlobalErrorCodeConstants.SUCCESS; } private void validatequeueExists(Integer id) { @@ -363,16 +454,20 @@ * 1. 姣忓ぉ寮�璇婂墠 浠嶥B鍚屾宸ヤ綅鐨勬偅鑰呴槦鍒楁暟鎹埌 宸ヤ綅浼樺厛闃熷垪 * 2. 鏈嶅姟杩愮淮閲嶅惎鏃� */ - public void initBedQueueAndSeqNumFromDB() { + @Override + public ErrorCode bedReload() { priorityQueue.clear(); mapBedVsQueue.clear(); + + // 娓呴櫎闈炲綋澶╃殑鎺掗槦浜哄憳 + queueMapper.clearQueue(); // 浠嶥B 鑾峰彇 宸ヤ綅鍒楄〃 List<BedStatusEnum> bedStatusEnumList = new ArrayList<BedStatusEnum>(); bedStatusEnumList.add(BedStatusEnum.OPENING); bedStatusEnumList.add(BedStatusEnum.DOCTOR_ON); bedStatusEnumList.add(BedStatusEnum.PAUSE); - List<RoomResVO> roomDOList = roomMapper.simpleRoomList(bedStatusEnumList); + List<RoomDO> roomDOList = roomMapper.simpleRoomList(bedStatusEnumList); List<BedQueueBO> bedQueueBOList = roomDOList.stream().map(item -> BeanUtils.toBean(item, BedQueueBO.class)).toList(); // 浠嶥B 鑾峰彇 闃熷垪涓� 灏辫瘖鍑嗗涓汉鍛樼粺璁� 鍒楄〃 @@ -388,12 +483,16 @@ throw new RuntimeException("init: exceed max queue number!"); item.queueNum.set( queueNum ); - priorityQueue.offer(item); 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; } /** @@ -408,7 +507,7 @@ for (BedQueueBO bedQueueBO : mapBedVsQueue.values()) { while (bedQueueBO.queueNum.get() < bedQueueBO.maxQueueNum) { // 鏌ョ湅 褰撳墠宸ヤ綅 鏄惁鏈夎繃鍙�-鍥炴潵鐨勬偅鑰� - Integer updateNum = queueMapper.procPassedReturnPatient( + Integer updateNum = queueMapper.queuePassedReturnPatient( bedQueueBO.getRoomId(), bedQueueBO.getRoomName(), bedQueueBO.getBedNo(), @@ -477,20 +576,17 @@ QueueDO queue = BeanUtils.toBean(queueSaveReqVO, QueueDO.class); queueMapper.insert(queue); - if (0 == openingFlag.get()) - return; - startHurryUp(); } - private void nextPatient(Long roomId, String bedNo) { + @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; + return QUEUE_NOT_READY_PATIENT; } // 浼樺厛闃熷垪涓� 璇ュ伐浣� 灏辫瘖鍑嗗涓汉鐨勬暟閲� 鍑忎竴 @@ -499,7 +595,7 @@ priorityQueue.remove(bo); priorityQueue.offer(bo); - startHurryUp(); + return GlobalErrorCodeConstants.SUCCESS; } public void finishNextPatient(Long roomId, String bedNo) { @@ -507,7 +603,7 @@ Integer ret = queueMapper.updateQueueStatus(roomId, bedNo, QueueStatusEnum.ONSTAGE.getStatus(), QueueStatusEnum.FINISH.getStatus()); - nextPatient(roomId, bedNo); + startNextPatient(roomId, bedNo); } public void passNextPatient(Long roomId, String bedNo) { @@ -515,7 +611,7 @@ Integer ret = queueMapper.updateQueueStatus(roomId, bedNo, QueueStatusEnum.ONSTAGE.getStatus(), QueueStatusEnum.PASSED.getStatus()); - nextPatient(roomId, bedNo); + startNextPatient(roomId, bedNo); } public List<QueueDO> getDoctorQueueByStatus(Long roomId, String bedNo, List<Byte> statusList) { @@ -553,22 +649,18 @@ if (1 == openingFlag.get()) return; - // 娓呴櫎闈炲綋澶╃殑鎺掗槦浜哄憳 - queueMapper.clearQueue(); - - initBedQueueAndSeqNumFromDB(); - openingFlag.set(1); - hurryup(); + startBedReload(); } public void closeBiz() { openingFlag.set(0); + startBedReload(); } @Override public Integer recallPatient(Long roomId, String bedNo, String patId) { - Integer updateNum = queueMapper.passedPatientReturn(roomId, bedNo, patId, + Integer updateNum = queueMapper.recallPassedPatient(roomId, bedNo, patId, QueueStatusEnum.PASSED.getStatus(), QueueStatusEnum.PASSED_RETURN.getStatus()); startHurryUp(); return updateNum; @@ -581,10 +673,10 @@ return updateNum; } - private void startHurryUp() { - singleThreadExecutor.execute( () -> { - hurryup(); - }); + @Override + public void monitorInfo() { + log.info("map " + mapBedVsQueue.size() + " priority " + priorityQueue.size() + + " opening " + openingFlag.get()); } } -- Gitblit v1.9.3