From be69c3d9d175027cb8d43f60a7744dc6e8c52433 Mon Sep 17 00:00:00 2001
From: eight <641137800@qq.com>
Date: 星期二, 20 八月 2024 15:01:32 +0800
Subject: [PATCH] update
---
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/queueServiceImpl.java | 109 ++++++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 92 insertions(+), 17 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 5b558c7..69d68d9 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
@@ -20,9 +20,10 @@
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
-import java.util.HashMap;
-import java.util.List;
-import java.util.PriorityQueue;
+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.*;
@@ -38,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;
@@ -98,32 +100,105 @@
@Override
public void queue(QueueSaveReqVO queueSaveReqVO) {
BedQueueBO bedQueueBO = priorityQueue.peek();
- if (bedQueueBO.queueNum == bedQueueBO.maxQueueNum) {
+ if (null == bedQueueBO)
+ return;
+
+ if (bedQueueBO.queueNum.get() == bedQueueBO.maxQueueNum) {
queueSaveReqVO.setStatus(QueueStatusEnum.WAITING.getStatus()); //鎺掗槦涓�
- } else if (bedQueueBO.queueNum < bedQueueBO.maxQueueNum) {
+ QueueDO queue = BeanUtils.toBean(queueSaveReqVO, QueueDO.class);
+ queueMapper.insert(queue); // queue.getId();
+ } else if (bedQueueBO.queueNum.get() < bedQueueBO.maxQueueNum) {
queueSaveReqVO.setStatus(QueueStatusEnum.READY.getStatus()); //鍊欒瘖鍑嗗涓�
- queueSaveReqVO.setRoomNum(bedQueueBO.getRoomName());
- queueSaveReqVO.setBedNum(bedQueueBO.getBedNo());
- queueSaveReqVO.setSeqNum(curSeqNum++);
+ queueSaveReqVO.setRoomId(bedQueueBO.getRoomId());
+ queueSaveReqVO.setRoomName(bedQueueBO.getRoomName());
+ queueSaveReqVO.setBedNo(bedQueueBO.getBedNo());
+ queueSaveReqVO.setSeqNum(curSeqNum.get());
QueueDO queue = BeanUtils.toBean(queueSaveReqVO, QueueDO.class);
queueMapper.insert(queue); // queue.getId();
- bedQueueBO.queueNum++;
+ curSeqNum.getAndIncrement();
+ bedQueueBO.queueNum.getAndIncrement();
+ BedQueueBO bedQueueBO2 = priorityQueue.poll();
+ priorityQueue.offer(bedQueueBO2);
}
+
+
}
- @PostConstruct
- private void initQueue() {
+ public void initQueue() {
+ priorityQueue.clear();
+ mapBedVsQueue.clear();
+
+ // 浠嶥B 鑾峰彇 宸ヤ綅鍒楄〃
List<RoomDO> roomDOList = roomMapper.simpleRoomList();
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 = MAX_QUEUE_NUM;
- item.queueNum = 0;
- priorityQueue.add(item);
+ Optional<QueueStatisticDO> queueStatisticDOOptional = queueStatisticDOList.stream().filter(it->it.getRoomId()==item.roomId && it.getBedNo().equals(item.getBedNo())).findFirst();
+ 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();
+ Integer num = queueMapper.getMaxSeqNum();
+ curSeqNum = new AtomicInteger(null == num ? 1 : ++num);
+
+ hurryup();
+ }
+
+ /**
+ * TODO 鏂板紑闃熷垪鏃讹紝闇�瑕佹妸鎺掗槦涓殑浜� 杞埌 灏辫瘖鍑嗗 鐘舵��
+ * 绛夊埌鍙栦笅涓�涓� 鎺掗槦涓汉鍛� 鐨勯�昏緫瀹屾垚鍚庯紝鍐嶅洖鏉ヤ笉閿�
+ */
+ 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;
}
}
-
--
Gitblit v1.9.3