eight
2025-04-09 160ae352de2d3d6cab01203ce2ae8b104b900afd
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceTxFunctions.java
@@ -7,7 +7,6 @@
import cn.lihu.jh.module.ecg.controller.admin.room.vo.MonitorInfoVO;
import cn.lihu.jh.module.ecg.dal.dataobject.checktype.CheckTypeDO;
import cn.lihu.jh.module.ecg.dal.dataobject.queue.QueueDO;
import cn.lihu.jh.module.ecg.dal.dataobject.queue.QueueStatisticDO;
import cn.lihu.jh.module.ecg.dal.dataobject.room.RoomDO;
import cn.lihu.jh.module.ecg.dal.mysql.call.CallMapper;
import cn.lihu.jh.module.ecg.dal.mysql.checktype.CheckTypeMapper;
@@ -98,10 +97,6 @@
            return ROOM_INVALID_STATUS;
        }
        List<Integer> queueStatusList = new ArrayList<>();
        queueStatusList.add(QueueStatusEnum.READY.getStatus());
        List<QueueDO> queueDOList = queueMapper.getBedQueueByStatus(roomId, bedNo, queueStatusList);
        RoomDO roomDO = roomMapper.getRoom(roomId, bedNo);
        // 新增..工位队列
@@ -109,8 +104,6 @@
        bedBO.setRoomId(roomId);
        bedBO.setRoomName(roomName);
        bedBO.setBedNo(bedNo);
        bedBO.setMaxReadyPatNum(getBedReadyMax(roomId, bedNo));
        bedBO.setReadyPatNum(new AtomicInteger(queueDOList.size()));
        bedBO.setStatus(BedStatusEnum.OPENING.getStatus());
        bedBO.setCheckTypes( roomDO.getCheckTypes() );
        bedBO.setOpType( roomDO.getOpType() );
@@ -154,7 +147,7 @@
        }
        mapOpeningBed.remove( Utils.formatRoomBed(roomId, bedNo) );
        removeRoutingQueue(bedBO);
        removeBedFromRoutingQueue(bedBO);
        return GlobalErrorCodeConstants.SUCCESS;
    }
@@ -175,7 +168,7 @@
        }
        bedBO.setStatus(BedStatusEnum.DOCTOR_PAUSE.getStatus());
        removeRoutingQueue(bedBO);
        removeBedFromRoutingQueue(bedBO);
        return GlobalErrorCodeConstants.SUCCESS;
    }
@@ -197,7 +190,7 @@
        }
        bedBO.setStatus(BedStatusEnum.DOCTOR_ON.getStatus());
        addRoutingQueue(bedBO);
        addBedToRoutingQueue(bedBO);
        return GlobalErrorCodeConstants.SUCCESS;
    }
@@ -218,7 +211,7 @@
        }
        bedBO.setStatus(BedStatusEnum.DOCTOR_ON.getStatus());
        addRoutingQueue(bedBO);
        addBedToRoutingQueue(bedBO);
        return GlobalErrorCodeConstants.SUCCESS;
    }
@@ -239,7 +232,7 @@
            return ROOM_INVALID_STATUS;
        }
        removeRoutingQueue(bedBO);
        removeBedFromRoutingQueue(bedBO);
        bedBO.setStatus(BedStatusEnum.OPENING.getStatus());
        return GlobalErrorCodeConstants.SUCCESS;
@@ -281,7 +274,7 @@
        BedBO bo = mapOpeningBed.get( Utils.formatRoomBed( roomId, bedNo ) );
        bo.readyPatNum.getAndDecrement(); // 可能已经【并发的】在 hurry-up 中改变了值
        refreshRoutingQueue(bo);
        refreshBedPriorityLevelInRoutingQueue(bo);
        return GlobalErrorCodeConstants.SUCCESS;
    }
@@ -334,22 +327,10 @@
        List<RoomDO> roomDOList = roomMapper.simpleRoomList(bedStatusEnumList);
        List<BedBO> bedBOList = roomDOList.stream().map(item -> BeanUtils.toBean(item, BedBO.class)).toList();
        // 从DB 获取 队列中 【候诊中】人员统计 列表
        List<Integer> queueStatusList = new ArrayList<>();
        queueStatusList.add(QueueStatusEnum.READY.getStatus());
        List<QueueStatisticDO> queueStatisticDOList = queueMapper.queueStatistic(queueStatusList);
        bedBOList.forEach(item -> {
            item.setMaxReadyPatNum( getBedReadyMax(item.roomId, item.bedNo) );
            Optional<QueueStatisticDO> queueStatisticDOOptional = queueStatisticDOList.stream().filter(it->it.getRoomId()==item.roomId && it.getBedNo().equals(item.getBedNo())).findFirst();
            int queueNum = queueStatisticDOOptional.isPresent() ? queueStatisticDOOptional.get().getTotalInStatus() : 0;
            if ( item.getMaxReadyPatNum() < queueNum )
                throw new RuntimeException("init: exceed max queue number!");
            item.setReadyPatNum( new AtomicInteger(queueNum) );
            mapOpeningBed.put( Utils.formatRoomBed(item.roomId, item.bedNo), item);
            if (BedStatusEnum.DOCTOR_ON.getStatus() == item.getStatus()) {
                addRoutingQueue(item);
                addBedToRoutingQueue(item);
            }
        });
@@ -417,7 +398,7 @@
            bedBO.readyPatNum.incrementAndGet();
            // 可能已经【并发的】在 nextPatient 中改变了分流队列顺序
            refreshRoutingQueue(bedBO);
            refreshBedPriorityLevelInRoutingQueue(bedBO);
        }
        // 处理 排队中 患者
@@ -478,7 +459,7 @@
            bedBO.readyPatNum.incrementAndGet();
            // 可能已经【并发的】在 nextPatient 中改变了分流队列顺序
            refreshRoutingQueue(bedBO);
            refreshBedPriorityLevelInRoutingQueue(bedBO);
        }
    }
@@ -548,7 +529,7 @@
        }
        // 改变了分流队列顺序
        refreshRoutingQueue(bedBO);
        refreshBedPriorityLevelInRoutingQueue(bedBO);
    }
    /**
@@ -582,22 +563,28 @@
        }
    }
    private Integer getBedReadyMax(Long roomId, String bedNo) {
        RoomDO roomDO = roomMapper.getRoom(roomId, bedNo);
        Integer[] checkTypes = roomDO.getCheckTypes();
        Integer ret = 0;
        for (int i=0; i<checkTypes.length; i++) {
            CheckTypeDO checkTypeDO = mapCheckTypeVsReadyMax.get(checkTypes[i]);
    private Integer getBedReadyMax(BedBO bedBO) {
        Integer[] checkTypes = bedBO.getCheckTypes();
        int ret = 0;
        for (Integer checkType : checkTypes) {
            CheckTypeDO checkTypeDO = mapCheckTypeVsReadyMax.get(checkType);
            Integer tmp = checkTypeDO.getReadyNum();
            ret = ret < tmp ? tmp : ret;  //【候诊中】数量 取大值
        }
        return ret;
    }
    private void addRoutingQueue(BedBO bedBO) {
    private void addBedToRoutingQueue(BedBO bedBO) {
        // 装机工位 不进 分流队列,不接收 【排队中】患者分流
        if (BedOpTypeEnum.OP_INSTALL.getOpType() == bedBO.getOpType())
        if (Objects.equals(BedOpTypeEnum.OP_INSTALL.getOpType(), bedBO.getOpType()))
            return;
        // 同步DB, 设置工位的分流控制信息
        List<Integer> queueStatusList = new ArrayList<>();
        queueStatusList.add(QueueStatusEnum.READY.getStatus()); //[候诊中]
        List<QueueDO> queueDOList = queueMapper.getBedQueueByStatus(bedBO.getRoomId(), bedBO.getBedNo(), queueStatusList);
        bedBO.setMaxReadyPatNum( getBedReadyMax(bedBO) );
        bedBO.setReadyPatNum(new AtomicInteger(queueDOList.size()));
        Integer[] checkTypes = bedBO.getCheckTypes();
        Arrays.stream(checkTypes).forEach(checkType -> {
@@ -616,9 +603,9 @@
        });
    }
    private void removeRoutingQueue(BedBO bedBO) {
    private void removeBedFromRoutingQueue(BedBO bedBO) {
        // 装机工位 不进 分流队列,不接收 【排队中】患者分流
        if (BedOpTypeEnum.OP_INSTALL.getOpType() == bedBO.getOpType())
        if (Objects.equals(BedOpTypeEnum.OP_INSTALL.getOpType(), bedBO.getOpType()))
            return;
        Integer[] checkTypes = bedBO.getCheckTypes();
@@ -629,9 +616,9 @@
        });
    }
    private void refreshRoutingQueue(BedBO bedBO) {
    private void refreshBedPriorityLevelInRoutingQueue(BedBO bedBO) {
        // 装机工位 不进 分流队列,不接收 【排队中】患者分流
        if (BedOpTypeEnum.OP_INSTALL.getOpType() == bedBO.getOpType())
        if (Objects.equals(BedOpTypeEnum.OP_INSTALL.getOpType(), bedBO.getOpType()))
            return;
        Integer[] checkTypes = bedBO.getCheckTypes();