| | |
| | | import javax.annotation.Resource; |
| | | |
| | | import java.util.*; |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | import java.util.concurrent.PriorityBlockingQueue; |
| | | import java.util.concurrent.*; |
| | | import java.util.concurrent.atomic.AtomicInteger; |
| | | import java.util.concurrent.atomic.AtomicReference; |
| | | |
| | | import static cn.lihu.jh.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.lihu.jh.module.ecg.enums.ErrorCodeConstants.*; |
| | |
| | | |
| | | PriorityBlockingQueue<BedQueueBO> priorityQueue = new PriorityBlockingQueue<>(); |
| | | ConcurrentHashMap<String, BedQueueBO > mapBedVsQueue = new ConcurrentHashMap<>(); |
| | | |
| | | ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); |
| | | |
| | | @Resource |
| | | private queueMapper queueMapper; |
| | |
| | | }); |
| | | |
| | | Integer num = queueMapper.getMaxSeqNum(); |
| | | curSeqNum = new AtomicInteger(null == num ? 1 : ++num); |
| | | |
| | | hurryup(); |
| | | curSeqNum = new AtomicInteger(null == num ? 0 : num); |
| | | } |
| | | |
| | | public void reorderQueue() { |
| | |
| | | if (null == bedQueueBO) |
| | | return; |
| | | |
| | | if (bedQueueBO.queueNum.get() == bedQueueBO.maxQueueNum) |
| | | int curQueueNum = bedQueueBO.queueNum.get(); |
| | | if (curQueueNum > bedQueueBO.maxQueueNum) |
| | | throw new RuntimeException("exceed max queue number!"); |
| | | |
| | | if (curQueueNum == bedQueueBO.maxQueueNum) |
| | | return; |
| | | |
| | | QueueDO queue = queueMapper.getFirstInQueueByStatus(QueueStatusEnum.WAITING.getStatus()); |
| | | if (null == queue) |
| | | return; |
| | | Integer updateNum = queueMapper.preemptPatient( |
| | | bedQueueBO.getRoomId(), |
| | | bedQueueBO.getRoomName(), |
| | | bedQueueBO.getBedNo(), |
| | | curSeqNum.get() + 1, |
| | | QueueStatusEnum.WAITING.getStatus(), |
| | | QueueStatusEnum.READY.getStatus()); |
| | | |
| | | 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(); |
| | | // æ²¡ææ¢å°æéæ£è
|
| | | if (null == updateNum || 0 == updateNum) { |
| | | return; |
| | | } |
| | | |
| | | curSeqNum.getAndIncrement(); |
| | | bedQueueBO.queueNum.getAndIncrement(); |
| | | BedQueueBO bedQueueBO2 = priorityQueue.poll(); |
| | | priorityQueue.offer(bedQueueBO2); |
| | | |
| | | // å¯è½å·²ç»ãå¹¶åçãå¨ nextPatient 䏿¹åäºå¼ |
| | | bedQueueBO.queueNum.incrementAndGet(); |
| | | |
| | | // å¯è½å·²ç»ãå¹¶åçãå¨ nextPatient 䏿¹åäºä¼å
éåé¡ºåº |
| | | priorityQueue.remove(bedQueueBO); |
| | | priorityQueue.offer(bedQueueBO); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * é¢çº¦ç¡®è®¤åçæé |
| | | * @param queueSaveReqVO |
| | | */ |
| | | @Override |
| | | public void queue(QueueSaveReqVO queueSaveReqVO) { |
| | | queueSaveReqVO.setStatus(QueueStatusEnum.WAITING.getStatus()); //æéä¸ |
| | | QueueDO queue = BeanUtils.toBean(queueSaveReqVO, QueueDO.class); |
| | | queueMapper.insert(queue); // queue.getId(); |
| | | queueMapper.insert(queue); |
| | | |
| | | singleThreadExecutor.submit( () -> { |
| | | hurryup(); |
| | | }); |
| | | } |
| | | |
| | | private void nextPatient(Long roomId, String bedNo) { |
| | |
| | | |
| | | // ä¼å
éåä¸ è¯¥å·¥ä½ å°±è¯åå¤ä¸äººçæ°é åä¸ |
| | | BedQueueBO bo = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo)); |
| | | boolean breturn = priorityQueue.remove(bo); |
| | | bo.queueNum.getAndDecrement(); |
| | | bo.queueNum.getAndDecrement(); // å¯è½å·²ç»ãå¹¶åçãå¨ hurry-up 䏿¹åäºå¼ |
| | | priorityQueue.remove(bo); |
| | | priorityQueue.offer(bo); |
| | | |
| | | singleThreadExecutor.submit( () -> { |
| | | hurryup(); |
| | | }); |
| | | } |
| | | |
| | | public void finishNextPatient(Long roomId, String bedNo) { |
| | | // ä» DB æ å°±è¯ä¸ç人 设置为就è¯å®æ |
| | | Integer ret = queueMapper.updateQueueStatus(roomId, bedNo, |
| | | QueueStatusEnum.ONSTAGE.getStatus(), QueueStatusEnum.FINISH.getStatus()); |
| | | System.out.println("宿æ°é: " + ret); |
| | | |
| | | nextPatient(roomId, bedNo); |
| | | } |
| | |
| | | // ä» DB æ å°±è¯ä¸ç人 设置为è¿å· |
| | | Integer ret = queueMapper.updateQueueStatus(roomId, bedNo, |
| | | QueueStatusEnum.ONSTAGE.getStatus(), QueueStatusEnum.PASSED.getStatus()); |
| | | System.out.println("宿æ°é: " + ret); |
| | | |
| | | nextPatient(roomId, bedNo); |
| | | } |