| | |
| | | firstReadyQueueItem.setStatus(QueueStatusEnum.ONSTAGE.getStatus()); |
| | | queueMapper.updateById( firstReadyQueueItem ); |
| | | |
| | | // 检查项目.亲和性 处理逻辑 |
| | | CheckTypeDO checkTypeDO = getCheckTypeItem( firstReadyQueueItem.getBookCheckType() ); |
| | | if (checkTypeDO.getAffinityCheckTypes().length > 0) { |
| | | List<QueueDO> affinityItems = queueMapper.getCurPatGivenCheckTypesAndStatus(firstReadyQueueItem.getPatId(), checkTypeDO.getAffinityCheckTypes(), QueueStatusEnum.AFFINITY_WAITING.getStatus()); |
| | | if (!affinityItems.isEmpty()) { |
| | | QueueDO tmpQueueDO = affinityItems.get(0); |
| | | tmpQueueDO.setStatus( QueueStatusEnum.READY.getStatus() ); |
| | | queueMapper.updateById( tmpQueueDO ); |
| | | return GlobalErrorCodeConstants.SUCCESS; // 准备中 数量没有变化,故直接返回 |
| | | } |
| | | } |
| | | |
| | | // 优先队列中 该工位 就诊准备中人的数量 减一 |
| | | BedQueueBO bo = mapBedVsQueue.get( Utils.formatRoomBed( roomId, bedNo ) ); |
| | | bo.queueNum.getAndDecrement(); // 可能已经【并发的】在 hurry-up 中改变了值 |
| | |
| | | public ErrorCode nextInstallPatient(Long roomId, String bedNo) { |
| | | // 从 DB 把 序号最小的 [已领用] [已召回-安装] 的人 设置为 [安装中] |
| | | QueueDO firstItem = queueMapper.getFirstItemByRoomAndStatus(roomId, List.of(QueueStatusEnum.RECEIVED.getStatus(), QueueStatusEnum.RECALLED_INSTALL.getStatus())); |
| | | // 该工位 没有 [已领用] [已召回-安装] 人员 |
| | | // 该工位 没有 [已领用] | [已召回-安装] 人员 |
| | | if (null == firstItem) { |
| | | return QUEUE_NOT_READY_PATIENT; |
| | | } |
| | | |
| | | firstItem.setStatus( QueueStatusEnum.INSTALLING.getStatus() ); |
| | | firstItem.setBedNo( bedNo ); |
| | | queueMapper.updateById( firstItem ); |
| | | |
| | | // 检查项目.亲和性 处理逻辑 |
| | | CheckTypeDO checkTypeDO = getCheckTypeItem( firstItem.getBookCheckType() ); |
| | | if (checkTypeDO.getAffinityCheckTypes().length > 0) { |
| | | List<QueueDO> affinityItems = queueMapper.getCurPatGivenCheckTypesAndStatus(firstItem.getPatId(), |
| | | checkTypeDO.getAffinityCheckTypes(), QueueStatusEnum.RECEIVED.getStatus()); |
| | | for (int i = 0; i < affinityItems.size(); i++) { |
| | | QueueDO queueItem = affinityItems.get(i); |
| | | queueItem.setStatus(QueueStatusEnum.AFFINITY_RECEIVED.getStatus()); //改变 排队状态 |
| | | queueMapper.updateById(queueItem); |
| | | } |
| | | procAffinityWhenSomeOneEntryInstalling(firstItem.getPatId(), roomId, bedNo, checkTypeDO.getAffinityCheckTypes() ); |
| | | } |
| | | |
| | | // 装机工位 无优先队列 |
| | |
| | | } |
| | | |
| | | public void resetRoom(Boolean needCloseBed) { |
| | | // 踢出在座的医生 |
| | | 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); |
| | | |
| | | // 关闭所有工位 |
| | | if (needCloseBed) { |
| | | // 踢出在座的医生 |
| | | 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()); |
| | | } |
| | | } |
| | |
| | | bedQueueBO.getRoomId(), |
| | | bedQueueBO.getRoomName(), |
| | | bedQueueBO.getBedNo(), |
| | | curSeqNum.get() + 1, |
| | | curSeqNum.get() + 1, // 过号回来,排到当前的下一位 |
| | | QueueStatusEnum.RECALLED.getStatus(), // 不需要处理 [安装召回], 原因: 安装工位 没有优先队列 |
| | | QueueStatusEnum.READY.getStatus()); |
| | | if (null == updateNum || 0 == updateNum) |
| | | break; |
| | | |
| | | // 召回 [过号] 患者后,处理 检查项目.亲和性 逻辑 |
| | | QueueDO recalledQueueItem = queueMapper.getQueueItemBySeqNum(curSeqNum.get() + 1); |
| | | |
| | | CheckTypeDO checkTypeDO = getCheckTypeItem( recalledQueueItem.getBookCheckType() ); |
| | | if ( checkTypeDO.getAffinityCheckTypes().length > 0) { |
| | | procAffinityWhenRecalled(recalledQueueItem, checkTypeDO.getAffinityCheckTypes()); |
| | | } |
| | | |
| | | curSeqNum.getAndIncrement(); |
| | | |
| | |
| | | } |
| | | |
| | | // 处理 排队中 患者 |
| | | Integer[] checkTypes = bedQueueBO.getCheckTypes(); |
| | | Arrays.stream(checkTypes).forEach(checkType -> hurryupOneCheckType(checkType)); |
| | | hurryupOneBedCheckTypes( bedQueueBO ); |
| | | } |
| | | |
| | | public void hurryupOneBedCheckTypes(BedQueueBO bedQueueBO) { |
| | | while (bedQueueBO.queueNum.get() < bedQueueBO.maxQueueNum) { |
| | | // 抢占 是否有排队中的患者 |
| | | Integer updateNum = queueMapper.preemptWaitingPatientWithBedCheckTypes( |
| | | bedQueueBO.getRoomId(), |
| | | bedQueueBO.getRoomName(), |
| | | bedQueueBO.getBedNo(), |
| | | curSeqNum.get() + 1, |
| | | QueueStatusEnum.WAITING.getStatus(), |
| | | QueueStatusEnum.READY.getStatus(), |
| | | bedQueueBO.checkTypes); |
| | | |
| | | // 没有抢到排队患者 |
| | | if (null == updateNum || 0 == updateNum) { |
| | | return; |
| | | } |
| | | |
| | | QueueDO preemptQueueItem = queueMapper.getQueueItemBySeqNum(curSeqNum.get() + 1); |
| | | CheckTypeDO checkTypeDO = getCheckTypeItem( preemptQueueItem.getBookCheckType() ); |
| | | |
| | | // 抢到排队患者后,处理 检查项目.亲和性 逻辑 |
| | | if ( checkTypeDO.getAffinityCheckTypes().length > 0) { |
| | | procAffinityWhenPreempt(preemptQueueItem, checkTypeDO.getAffinityCheckTypes()); |
| | | } |
| | | |
| | | curSeqNum.getAndIncrement(); |
| | | |
| | | bedQueueBO.queueNum.incrementAndGet(); |
| | | } |
| | | |
| | | // 改变了优先队列顺序 |
| | | refreshPriorityQueue(bedQueueBO); |
| | | } |
| | | |
| | | public void hurryupOneCheckType(Integer checkType) { |
| | |
| | | return; |
| | | } |
| | | |
| | | QueueDO preemptQueueItem = queueMapper.getQueueItemBySeqNum(curSeqNum.get() + 1); |
| | | CheckTypeDO checkTypeDO = getCheckTypeItem( preemptQueueItem.getBookCheckType() ); |
| | | |
| | | // 抢到排队患者后,处理 检查项目.亲和性 逻辑 |
| | | QueueDO queueDO = queueMapper.getQueueItemBySeqNum(curSeqNum.get() + 1); |
| | | CheckTypeDO checkTypeDO = getCheckTypeItem( queueDO.getBookCheckType() ); |
| | | if ( checkTypeDO.getAffinityCheckTypes().length > 0) { |
| | | List<QueueDO> affinityItems = queueMapper.getCurPatGivenCheckTypesAndStatus(queueDO.getPatId(), |
| | | checkTypeDO.getAffinityCheckTypes(), QueueStatusEnum.WAITING.getStatus()); |
| | | for (int i = 0; i < affinityItems.size(); i++) { |
| | | QueueDO queueItem = affinityItems.get(i); |
| | | queueItem.setStatus(QueueStatusEnum.AFFINITY_WAITING.getStatus()); //改变 排队状态 |
| | | queueItem.setRoomId(queueItem.getRoomId()); |
| | | queueItem.setRoomName(queueItem.getRoomName()); |
| | | queueItem.setBedNo(queueItem.getBedNo()); |
| | | queueItem.setSeqNum(curSeqNum.get() + 1); // 使用同一个 内部序号 |
| | | queueMapper.updateById(queueItem); |
| | | } |
| | | procAffinityWhenPreempt(preemptQueueItem, checkTypeDO.getAffinityCheckTypes()); |
| | | } |
| | | |
| | | curSeqNum.getAndIncrement(); |
| | |
| | | MonitorInfoVO monitorInfoVO = new MonitorInfoVO(); |
| | | roomBedStatistic(monitorInfoVO); |
| | | log.info(" opening " + openingFlag.get() + " " + monitorInfoVO.getQueueNum() + " " + monitorInfoVO.getActiveQueueNum() + " " + monitorInfoVO.getCheckTypeBedInfo().toString() ); |
| | | } |
| | | |
| | | private void procAffinityWhenPreempt(QueueDO preemptQueueItem, Integer[] affinityCheckTypes) { |
| | | List<QueueDO> affinityItems = queueMapper.getCurPatGivenCheckTypesAndStatus( |
| | | preemptQueueItem.getPatId(), affinityCheckTypes, QueueStatusEnum.WAITING.getStatus()); |
| | | for (int i = 0; i < affinityItems.size(); i++) { |
| | | QueueDO queueItem = affinityItems.get(i); |
| | | queueItem.setStatus(QueueStatusEnum.AFFINITY_WAITING.getStatus()); //改变 排队状态 |
| | | queueItem.setAffinityItem( 1 ); |
| | | queueItem.setRoomId(preemptQueueItem.getRoomId()); |
| | | queueItem.setRoomName(preemptQueueItem.getRoomName()); |
| | | queueItem.setBedNo(preemptQueueItem.getBedNo()); |
| | | queueItem.setSeqNum( preemptQueueItem.getSeqNum()); // 使用同一个 内部序号 |
| | | queueMapper.updateById(queueItem); |
| | | } |
| | | } |
| | | |
| | | private void procAffinityWhenRecalled(QueueDO recalledQueueItem, Integer[] affinityCheckTypes) { |
| | | List<QueueDO> affinityItems = queueMapper.getCurPatGivenCheckTypesAndStatus( |
| | | recalledQueueItem.getPatId(), affinityCheckTypes, QueueStatusEnum.AFFINITY_WAITING.getStatus()); |
| | | for (int i = 0; i < affinityItems.size(); i++) { |
| | | QueueDO queueItem = affinityItems.get(i); |
| | | queueItem.setSeqNum( recalledQueueItem.getSeqNum() ); // 召回后,原内部序号更新 |
| | | queueMapper.updateById(queueItem); |
| | | } |
| | | } |
| | | |
| | | private Integer getBedReadyMax(Long roomId, String bedNo) { |
| | |
| | | }); |
| | | } |
| | | |
| | | private void procAffinityWhenSomeOneEntryInstalling(String patId, Long roomId_operator, String bedNo_operator, Integer[] affinityCheckTypes) { |
| | | // 对于 刚进入到 [安装中]的项, 如果存在 [已领用] 的亲和项,则需要其跟随 |
| | | List<QueueDO> affinityItems = queueMapper.getCurPatGivenCheckTypesAndStatus( |
| | | patId, affinityCheckTypes, QueueStatusEnum.RECEIVED.getStatus()); |
| | | for (int i = 0; i < affinityItems.size(); i++) { |
| | | QueueDO queueItem = affinityItems.get(i); |
| | | queueItem.setStatus(QueueStatusEnum.AFFINITY_RECEIVED.getStatus()); //改变 排队状态 |
| | | queueItem.setRoomId(roomId_operator); |
| | | queueItem.setBedNo(bedNo_operator); // 跟随到 装机 工位 |
| | | queueMapper.updateById(queueItem); |
| | | } |
| | | } |
| | | |
| | | private void roomBedStatistic(MonitorInfoVO monitorInfoVO) { |
| | | Map<Integer, Integer> mapOpeningCheckBedStatInfo = new HashMap<>(); |
| | | Map<Integer, Integer> mapOpeningInstallBedStatInfo = new HashMap<>(); |
| | |
| | | monitorInfoVO.setQueueNum(mapBedVsQueue.size()); |
| | | monitorInfoVO.setActiveQueueNum((int) mapBedVsQueue.values().stream().filter(item -> item.getStatus() == BedStatusEnum.DOCTOR_ON.getStatus()).count()); |
| | | monitorInfoVO.setPriorityQueueNum( hashSetOperatingBedQueue.size() ); |
| | | monitorInfoVO.setMapBedVsQueue( mapBedVsQueue ); |
| | | } |
| | | |
| | | } |