| | |
| | | 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 cn.lihu.jh.module.system.api.oauth2.OAuth2TokenApi; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Component; |
| | |
| | | @Validated |
| | | @Slf4j |
| | | public class QueueServiceTxFunctions { |
| | | |
| | | @Resource |
| | | private ConfigApi configApi; |
| | | |
| | | @Resource |
| | | private OAuth2TokenApi oAuth2TokenApi; |
| | |
| | | return ROOM_INVALID_STATUS; |
| | | } |
| | | |
| | | List<Byte> queueStatusList = new ArrayList<>(); |
| | | List<Integer> queueStatusList = new ArrayList<>(); |
| | | queueStatusList.add(QueueStatusEnum.READY.getStatus()); |
| | | List<QueueDO> queueDOList = queueMapper.getBedQueueByStatus(roomId, bedNo, queueStatusList); |
| | | |
| | |
| | | // 除了判断 准备候诊中 的人数,还需要 判断 过号的人数 |
| | | //if (bedQueueBO.getQueueNum().get() >0) |
| | | // return QUEUE_HAVE_PATIENT; |
| | | List<Byte> queueStatusList = new ArrayList<>(); |
| | | List<Integer> queueStatusList = new ArrayList<>(); |
| | | queueStatusList.add(QueueStatusEnum.READY.getStatus()); |
| | | queueStatusList.add(QueueStatusEnum.PASSED.getStatus()); |
| | | queueStatusList.add(QueueStatusEnum.RECALLED.getStatus()); |
| | |
| | | return GlobalErrorCodeConstants.SUCCESS; |
| | | } |
| | | |
| | | /* 2024.11.11 |
| | | // 常规 或者 领用 时 医生 取下一位患者 |
| | | public ErrorCode nextPatient(Long roomId, String bedNo) { |
| | | // 从 DB 把 序号最小的 [就诊准备中] 的人 设置为 [就诊中] (或领用中) |
| | | // 从 DB 把该工位.序号最小的 [就诊准备中] 的人 设置为 [就诊中] (或领用中) |
| | | Integer updateNum = queueMapper.updateBedQueueStatus(roomId, bedNo, |
| | | QueueStatusEnum.READY.getStatus(), QueueStatusEnum.ONSTAGE.getStatus()); |
| | | // 该工位 没有 [就诊准备中] 人员 |
| | |
| | | refreshPriorityQueue(bo); |
| | | return GlobalErrorCodeConstants.SUCCESS; |
| | | } |
| | | */ |
| | | |
| | | // 常规 或者 领用 时 医生 取下一位患者 |
| | | public ErrorCode nextPatient(Long roomId, String bedNo) { |
| | | QueueDO firstReadyQueueItem = queueMapper.getFirstItemByBedAndStatus(roomId, bedNo, QueueStatusEnum.READY.getStatus()); |
| | | // 该工位 没有 [就诊准备中] 人员 |
| | | if (null == firstReadyQueueItem) { |
| | | return QUEUE_NOT_READY_PATIENT; |
| | | } |
| | | |
| | | // QueueStatusEnum.READY => QueueStatusEnum.ONSTAGE |
| | | firstReadyQueueItem.setStatus(QueueStatusEnum.ONSTAGE.getStatus()); |
| | | queueMapper.updateById( firstReadyQueueItem ); |
| | | |
| | | // 优先队列中 该工位 就诊准备中人的数量 减一 |
| | | BedQueueBO bo = mapBedVsQueue.get( Utils.formatRoomBed( roomId, bedNo ) ); |
| | | bo.queueNum.getAndDecrement(); // 可能已经【并发的】在 hurry-up 中改变了值 |
| | | |
| | | refreshPriorityQueue(bo); |
| | | return GlobalErrorCodeConstants.SUCCESS; |
| | | } |
| | | |
| | | // 装机时 医生 取下一位患者 |
| | | public ErrorCode nextInstallPatient(Long roomId, String bedNo) { |
| | | // 从 DB 把 序号最小的 [已领用] 的人 设置为 [安装中] |
| | | Integer updateNum = queueMapper.preemptReceivedPatient(roomId, bedNo, |
| | | QueueStatusEnum.RECEIVED.getStatus(), QueueStatusEnum.INSTALLING.getStatus()); |
| | | // 该工位 没有 [已领用] 人员 |
| | | if (null == updateNum || 0 == updateNum) { |
| | | // 从 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()); //改变 排队状态 |
| | | queueItem.setBedNo( bedNo ); // 跟随到 装机 工位 |
| | | queueMapper.updateById(queueItem); |
| | | } |
| | | } |
| | | |
| | | // 装机工位 无优先队列 |
| | |
| | | List<BedQueueBO> bedQueueBOList = roomDOList.stream().map(item -> BeanUtils.toBean(item, BedQueueBO.class)).toList(); |
| | | |
| | | // 从DB 获取 队列中 就诊准备中人员统计 列表 |
| | | List<Byte> queueStatusList = new ArrayList<>(); |
| | | List<Integer> queueStatusList = new ArrayList<>(); |
| | | queueStatusList.add(QueueStatusEnum.READY.getStatus()); |
| | | List<QueueStatisticDO> queueStatisticDOList = queueMapper.queueStatistic(queueStatusList); |
| | | |
| | |
| | | bedQueueBO.getRoomId(), |
| | | bedQueueBO.getRoomName(), |
| | | bedQueueBO.getBedNo(), |
| | | curSeqNum.get() + 1, |
| | | QueueStatusEnum.RECALLED.getStatus(), |
| | | curSeqNum.get() + 1, // 过号回来,排到当前的下一位 |
| | | QueueStatusEnum.RECALLED.getStatus(), // 不需要处理 [安装召回], 原因: 安装工位 没有优先队列 |
| | | QueueStatusEnum.READY.getStatus()); |
| | | if (null == updateNum || 0 == updateNum) |
| | | break; |
| | | |
| | | // 召回 [过号] 患者后,处理 检查项目.亲和性 逻辑 |
| | | QueueDO recalledQueueItem = queueMapper.getQueueItemBySeqNum(curSeqNum.get() + 1); |
| | | updateAffinityItemsWhenRecalled( recalledQueueItem ); |
| | | |
| | | curSeqNum.getAndIncrement(); |
| | | |
| | |
| | | return; |
| | | } |
| | | |
| | | // 抢到排队患者后,处理 检查项目.亲和性 逻辑 |
| | | QueueDO preemptQueueItem = queueMapper.getQueueItemBySeqNum(curSeqNum.get() + 1); |
| | | updateAffinityItemsWhenPreempt( preemptQueueItem ); |
| | | |
| | | curSeqNum.getAndIncrement(); |
| | | |
| | | // 可能已经【并发的】在 nextPatient 中改变了值 |
| | |
| | | mapCheckTypeVsReadyMax = checkTypeDOList.stream().collect(Collectors.toMap(CheckTypeDO::getValue, checkType -> checkType)); |
| | | } |
| | | |
| | | public CheckTypeDO getCheckTypeItem(Integer checkType) { |
| | | return mapCheckTypeVsReadyMax.get( checkType ); |
| | | } |
| | | |
| | | public BedQueueBO getBedQueueBO(Long roomId, String bedNo) { |
| | | return mapBedVsQueue.get( Utils.formatRoomBed(roomId, bedNo) ); |
| | | } |
| | |
| | | MonitorInfoVO monitorInfoVO = new MonitorInfoVO(); |
| | | roomBedStatistic(monitorInfoVO); |
| | | log.info(" opening " + openingFlag.get() + " " + monitorInfoVO.getQueueNum() + " " + monitorInfoVO.getActiveQueueNum() + " " + monitorInfoVO.getCheckTypeBedInfo().toString() ); |
| | | } |
| | | |
| | | private void updateAffinityItemsWhenPreempt(QueueDO preemptQueueItem) { |
| | | CheckTypeDO checkTypeDO = getCheckTypeItem( preemptQueueItem.getBookCheckType() ); |
| | | if ( checkTypeDO.getAffinityCheckTypes().length > 0) { |
| | | List<QueueDO> affinityItems = queueMapper.getCurPatGivenCheckTypesAndStatus(preemptQueueItem.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(preemptQueueItem.getRoomId()); |
| | | queueItem.setRoomName(preemptQueueItem.getRoomName()); |
| | | queueItem.setBedNo(preemptQueueItem.getBedNo()); |
| | | queueItem.setSeqNum( preemptQueueItem.getSeqNum()); // 使用同一个 内部序号 |
| | | queueMapper.updateById(queueItem); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private void updateAffinityItemsWhenRecalled(QueueDO recalledQueueItem) { |
| | | CheckTypeDO checkTypeDO = getCheckTypeItem( recalledQueueItem.getBookCheckType() ); |
| | | if ( checkTypeDO.getAffinityCheckTypes().length > 0) { |
| | | List<QueueDO> affinityItems = queueMapper.getCurPatGivenCheckTypesAndStatus(recalledQueueItem.getPatId(), |
| | | checkTypeDO.getAffinityCheckTypes(), 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) { |
| | |
| | | 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 ); |
| | | } |
| | | |
| | | } |