eight
2024-11-13 cac7f142c909d712d6d49c45b0d4efbdef673e48
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceTxFunctions.java
@@ -274,18 +274,6 @@
        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 中改变了值
@@ -413,11 +401,15 @@
                    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);
            updateAffinityItemsWhenRecalled( recalledQueueItem );
            curSeqNum.getAndIncrement();
@@ -467,21 +459,8 @@
            }
            // 抢到排队患者后,处理 检查项目.亲和性 逻辑
            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(queueDO.getRoomId());
                    queueItem.setRoomName(queueDO.getRoomName());
                    queueItem.setBedNo(queueDO.getBedNo());
                    queueItem.setSeqNum(curSeqNum.get() + 1);  // 使用同一个 内部序号
                    queueMapper.updateById(queueItem);
                }
            }
            QueueDO preemptQueueItem = queueMapper.getQueueItemBySeqNum(curSeqNum.get() + 1);
            updateAffinityItemsWhenPreempt( preemptQueueItem );
            curSeqNum.getAndIncrement();
@@ -526,6 +505,36 @@
        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) {
@@ -631,6 +640,7 @@
        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 );
    }
}