jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/doctor/DoctorController.java
@@ -414,7 +414,7 @@ if (roomId != roomId_operator) return error(QUEUE_RECALL_INSTALL_NOT_CUR_ROOM); Integer result = queueService.recallInstallPatient(roomId, bedNo, patId, checkType, bedNo_operator); Integer result = queueService.recallInstallPatient(roomId, bedNo, patId, checkType, roomId_operator, bedNo_operator); if (null == result || 0 == result) return error(PATIENT_NOT_EXISTS); jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/devrent/DevRentServiceImpl.java
@@ -136,12 +136,7 @@ // 检查项目.亲和性 处理逻辑 CheckTypeDO checkTypeDO = queueServiceTxFunctions.getCheckTypeItem( firstOnStageQueueItem.getBookCheckType() ); if (checkTypeDO.getAffinityCheckTypes().length > 0) { List<QueueDO> affinityAffinityWaitingItems = queueMapper.getCurPatGivenCheckTypesAndStatus(firstOnStageQueueItem.getPatId(), checkTypeDO.getAffinityCheckTypes(), QueueStatusEnum.AFFINITY_WAITING.getStatus()); if (!affinityAffinityWaitingItems.isEmpty()) { QueueDO tmpQueueDO = affinityAffinityWaitingItems.get(0); tmpQueueDO.setStatus(QueueStatusEnum.ONSTAGE.getStatus()); queueMapper.updateById(tmpQueueDO); } procAffinityWhenRoutineFinish( firstOnStageQueueItem.getPatId(), checkTypeDO.getAffinityCheckTypes() ); } return CommonResult.success(rent_id); @@ -216,30 +211,18 @@ //queueMapper.updateBedQueueStatus(createReqVO.getRoomId(), createReqVO.getBedNo(), // QueueStatusEnum.ONSTAGE.getStatus(), QueueStatusEnum.RECEIVED.getStatus()); QueueDO firstOnStageQueueItem = queueMapper.getFirstItemByBedAndStatus(createReqVO.getRoomId(), createReqVO.getBedNo(), QueueStatusEnum.ONSTAGE.getStatus()); CheckTypeDO checkTypeDO = queueServiceTxFunctions.getCheckTypeItem( firstOnStageQueueItem.getBookCheckType() ); // QueueStatusEnum.ONSTAGE => QueueStatusEnum.RECEIVED firstOnStageQueueItem.setStatus(QueueStatusEnum.RECEIVED.getStatus()); // 默认状态 设置 // 检查项目.亲和性 处理逻辑 if (checkTypeDO.getAffinityCheckTypes().length > 0) { List<QueueDO> affinityInstallingItems = queueMapper.getCurPatGivenCheckTypesAndStatus(firstOnStageQueueItem.getPatId(), checkTypeDO.getAffinityCheckTypes(), QueueStatusEnum.INSTALLING.getStatus()); if (!affinityInstallingItems.isEmpty()) { firstOnStageQueueItem.setStatus(QueueStatusEnum.AFFINITY_RECEIVED.getStatus()); } } queueMapper.updateById( firstOnStageQueueItem ); QueueDO bedOnStageQueueItem = queueMapper.getFirstItemByBedAndStatus( createReqVO.getRoomId(), createReqVO.getBedNo(), QueueStatusEnum.ONSTAGE.getStatus() ); CheckTypeDO checkTypeDO = queueServiceTxFunctions.getCheckTypeItem( bedOnStageQueueItem.getBookCheckType() ); bedOnStageQueueItem.setStatus(QueueStatusEnum.RECEIVED.getStatus()); // [已领用] 状态 // 检查项目.亲和性 处理逻辑 // 检查项目.亲和性 处理逻辑 , 更新 bedOnStageQueueItem if (checkTypeDO.getAffinityCheckTypes().length > 0) { List<QueueDO> affinityAffinityWaitingItems = queueMapper.getCurPatGivenCheckTypesAndStatus(firstOnStageQueueItem.getPatId(), checkTypeDO.getAffinityCheckTypes(), QueueStatusEnum.AFFINITY_WAITING.getStatus()); if (!affinityAffinityWaitingItems.isEmpty()) { QueueDO tmpQueueDO = affinityAffinityWaitingItems.get(0); tmpQueueDO.setStatus(QueueStatusEnum.ONSTAGE.getStatus()); queueMapper.updateById(tmpQueueDO); } procAffinityWhenReadyFinish(/*IN, OUT*/bedOnStageQueueItem, checkTypeDO.getAffinityCheckTypes()); } queueMapper.updateById( bedOnStageQueueItem ); return CommonResult.success(rent_id); } @@ -315,21 +298,16 @@ //queueMapper.updateBedQueueStatus(createReqVO.getRoomId(), createReqVO.getBedNo(), // QueueStatusEnum.INSTALLING.getStatus(), QueueStatusEnum.FINISH.getStatus()); QueueDO firstInstallingQueueItem = queueMapper.getFirstItemByBedAndStatus(createReqVO.getRoomId(), createReqVO.getBedNo(), QueueStatusEnum.INSTALLING.getStatus()); // QueueStatusEnum.INSTALLING => QueueStatusEnum.FINISH firstInstallingQueueItem.setStatus(QueueStatusEnum.FINISH.getStatus()); // 默认状态 设置 queueMapper.updateById( firstInstallingQueueItem ); QueueDO bedInstallingQueueItem = queueMapper.getFirstItemByBedAndStatus( createReqVO.getRoomId(), createReqVO.getBedNo(), QueueStatusEnum.INSTALLING.getStatus()); bedInstallingQueueItem.setStatus(QueueStatusEnum.FINISH.getStatus()); // 默认状态 设置 queueMapper.updateById( bedInstallingQueueItem ); // 检查项目.亲和性 处理逻辑 CheckTypeDO checkTypeDO = queueServiceTxFunctions.getCheckTypeItem( firstInstallingQueueItem.getBookCheckType() ); CheckTypeDO checkTypeDO = queueServiceTxFunctions.getCheckTypeItem( bedInstallingQueueItem.getBookCheckType() ); if (checkTypeDO.getAffinityCheckTypes().length > 0) { List<QueueDO> affinityAffinityReceivedItems = queueMapper.getCurPatGivenCheckTypesAndStatus(firstInstallingQueueItem.getPatId(), checkTypeDO.getAffinityCheckTypes(), QueueStatusEnum.AFFINITY_RECEIVED.getStatus()); if (!affinityAffinityReceivedItems.isEmpty()) { QueueDO tmpQueueDO = affinityAffinityReceivedItems.get(0); tmpQueueDO.setStatus(QueueStatusEnum.INSTALLING.getStatus()); queueMapper.updateById(tmpQueueDO); } procAffinityWhenInstallFinish(bedInstallingQueueItem, checkTypeDO.getAffinityCheckTypes()); } return CommonResult.success(rent_id); @@ -788,5 +766,49 @@ return 0; } private void procAffinityWhenRoutineFinish(String patId, Integer[] affinityCheckTypes) { // 如果存在 [亲和-排队] 亲和项,则选择 其中一个亲和项 接替其 处于 [就诊中] List<QueueDO> affinityAffinityWaitingItems = queueMapper.getCurPatGivenCheckTypesAndStatus( patId, affinityCheckTypes, QueueStatusEnum.AFFINITY_WAITING.getStatus()); if (!affinityAffinityWaitingItems.isEmpty()) { QueueDO tmpQueueDO = affinityAffinityWaitingItems.get(0); tmpQueueDO.setStatus(QueueStatusEnum.ONSTAGE.getStatus()); queueMapper.updateById(tmpQueueDO); } } private void procAffinityWhenReadyFinish(QueueDO bedOnStageQueueItem, Integer[] affinityCheckTypes) { // 如果存在 [安装中] 亲和项,则跟随其中一个亲和项 List<QueueDO> affinityInstallingItems = queueMapper.getCurPatGivenCheckTypesAndStatus( bedOnStageQueueItem.getPatId(), affinityCheckTypes, QueueStatusEnum.INSTALLING.getStatus()); if (!affinityInstallingItems.isEmpty()) { QueueDO affinityInstallingItem = affinityInstallingItems.get(0); bedOnStageQueueItem.setStatus(QueueStatusEnum.AFFINITY_RECEIVED.getStatus()); // 亲和-领用 bedOnStageQueueItem.setRoomId( affinityInstallingItem.getRoomId() ); bedOnStageQueueItem.setBedNo( affinityInstallingItem.getBedNo() ); // 领用 到 安装 可能会在不同工位 } // 如果存在 [亲和-排队] 亲和项,则选择 其中一个亲和项 接替其 处于 [就诊中] List<QueueDO> affinityAffinityWaitingItems = queueMapper.getCurPatGivenCheckTypesAndStatus( bedOnStageQueueItem.getPatId(), affinityCheckTypes, QueueStatusEnum.AFFINITY_WAITING.getStatus()); if (!affinityAffinityWaitingItems.isEmpty()) { QueueDO tmpQueueDO = affinityAffinityWaitingItems.get(0); tmpQueueDO.setStatus(QueueStatusEnum.ONSTAGE.getStatus()); queueMapper.updateById( tmpQueueDO ); } } private void procAffinityWhenInstallFinish(QueueDO bedInstallingQueueItem, Integer[] affinityCheckTypes) { List<QueueDO> affinityAffinityReceivedItems = queueMapper.getCurPatGivenCheckTypesAndStatus( bedInstallingQueueItem.getPatId(), affinityCheckTypes, QueueStatusEnum.AFFINITY_RECEIVED.getStatus()); if (!affinityAffinityReceivedItems.isEmpty()) { QueueDO tmpQueueDO = affinityAffinityReceivedItems.get(0); tmpQueueDO.setStatus(QueueStatusEnum.INSTALLING.getStatus()); tmpQueueDO.setRoomId( bedInstallingQueueItem.getRoomId() ); tmpQueueDO.setBedNo( bedInstallingQueueItem.getBedNo() ); // 从 [领用] 到 [安装], 可鞥在不同工位上操作 queueMapper.updateById(tmpQueueDO); } } } jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueService.java
@@ -126,7 +126,7 @@ Integer recallPatient(Long roomId, String bedNo, String patId, Integer checkType); Integer recallInstallPatient(Long roomId, String bedNo, String patId, Integer checkType, String bedNo_operator); Integer recallInstallPatient(Long roomId, String bedNo, String patId, Integer checkType, Long roomId_operator, String bedNo_operator); Integer patientJump(String patId, Byte jumped ); jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceImpl.java
@@ -322,19 +322,9 @@ queueSaveReqVO.setStatus(QueueStatusEnum.WAITING.getStatus()); // 处理 检查项目.亲和性 逻辑 // 如果存在 处于 [就诊准备中] | [就诊中] 的亲和项,则跟随其中一个亲和项 CheckTypeDO checkTypeDO = queueServiceTxFunctions.getCheckTypeItem( queueSaveReqVO.getBookCheckType() ); if ( checkTypeDO.getAffinityCheckTypes().length > 0) { List<QueueDO> affinityItems = queueMapper.getCurPatGivenCheckTypesAndStatusList( queueSaveReqVO.getPatId(), checkTypeDO.getAffinityCheckTypes(), List.of(QueueStatusEnum.READY.getStatus(), QueueStatusEnum.ONSTAGE.getStatus())); if (!affinityItems.isEmpty()) { QueueDO queueItem = affinityItems.get(0); queueSaveReqVO.setStatus(QueueStatusEnum.AFFINITY_WAITING.getStatus()); // [亲和-排队] 状态 queueSaveReqVO.setRoomId(queueItem.getRoomId()); queueSaveReqVO.setRoomName(queueItem.getRoomName()); queueSaveReqVO.setBedNo(queueItem.getBedNo()); queueSaveReqVO.setSeqNum(queueItem.getSeqNum()); } procAffinityWhenQueue(queueSaveReqVO, checkTypeDO.getAffinityCheckTypes()); } QueueDO queue = BeanUtils.toBean(queueSaveReqVO, QueueDO.class); @@ -533,13 +523,16 @@ } @Override public Integer recallInstallPatient(Long roomId, String bedNo, String patId, Integer checkType, String bedNo_operator) { public Integer recallInstallPatient(Long roomId, String bedNo, String patId, Integer checkType, Long roomId_operator, String bedNo_operator) { Integer updateNum = queueMapper.recallPassedInstallPatient(roomId, bedNo_operator, patId, checkType, QueueStatusEnum.PASSED_INSTALL.getStatus(), QueueStatusEnum.RECALLED_INSTALL.getStatus()); // 检查项目.亲和性 处理 if (null != updateNum && 1 == updateNum) { updateAffinityItemsWhenInstallRecall(patId, checkType, bedNo_operator); CheckTypeDO checkTypeDO = queueServiceTxFunctions.getCheckTypeItem( checkType ); if ( checkTypeDO.getAffinityCheckTypes().length > 0) { procAffinityWhenInstallRecall(patId, checkTypeDO.getAffinityCheckTypes(), roomId_operator, bedNo_operator); } } // 安装工位 不涉及 优先队列 @@ -642,17 +635,31 @@ return roomDO; } private void updateAffinityItemsWhenInstallRecall(String patId, Integer checkType, String bedNo_operator) { CheckTypeDO checkTypeDO = queueServiceTxFunctions.getCheckTypeItem( checkType ); if ( checkTypeDO.getAffinityCheckTypes().length > 0) { List<QueueDO> affinityItems = queueMapper.getCurPatGivenCheckTypesAndStatus(patId, checkTypeDO.getAffinityCheckTypes(), QueueStatusEnum.AFFINITY_RECEIVED.getStatus()); for (int i = 0; i < affinityItems.size(); i++) { QueueDO queueItem = affinityItems.get(i); queueItem.setBedNo( bedNo_operator ); //queueItem.setSeqNum( preemptQueueItem.getSeqNum() ); // 装机时 内部序号不变 queueMapper.updateById(queueItem); } private void procAffinityWhenInstallRecall(String patId, Integer[] affinityCheckTypes, Long roomId_operator, String bedNo_operator) { List<QueueDO> affinityItems = queueMapper.getCurPatGivenCheckTypesAndStatus( patId, affinityCheckTypes, QueueStatusEnum.AFFINITY_RECEIVED.getStatus()); for (int i = 0; i < affinityItems.size(); i++) { QueueDO queueItem = affinityItems.get(i); queueItem.setRoomId( roomId_operator ); queueItem.setBedNo( bedNo_operator ); //queueItem.setSeqNum( preemptQueueItem.getSeqNum() ); // 装机时 内部序号不变 故不需更新 queueMapper.updateById(queueItem); } } private void procAffinityWhenQueue(/*IN, OUT*/QueueSaveReqVO queueSaveReqVO, Integer[] affinityCheckTypes) { // 如果存在 处于 [就诊准备中] | [就诊中] 的亲和项,则跟随其中一个亲和项 List<QueueDO> affinityItems = queueMapper.getCurPatGivenCheckTypesAndStatusList( queueSaveReqVO.getPatId(), affinityCheckTypes, List.of(QueueStatusEnum.READY.getStatus(), QueueStatusEnum.ONSTAGE.getStatus())); if (!affinityItems.isEmpty()) { QueueDO queueItem = affinityItems.get(0); queueSaveReqVO.setStatus(QueueStatusEnum.AFFINITY_WAITING.getStatus()); // [亲和-排队] 状态 queueSaveReqVO.setRoomId(queueItem.getRoomId()); queueSaveReqVO.setRoomName(queueItem.getRoomName()); queueSaveReqVO.setBedNo(queueItem.getBedNo()); queueSaveReqVO.setSeqNum(queueItem.getSeqNum()); } } } jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceTxFunctions.java
@@ -286,7 +286,7 @@ 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; } @@ -298,14 +298,7 @@ // 检查项目.亲和性 处理逻辑 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); } procAffinityWhenSomeOneEntryInstalling(firstItem.getPatId(), roomId, bedNo, checkTypeDO.getAffinityCheckTypes() ); } // 装机工位 无优先队列 @@ -409,7 +402,11 @@ // 召回 [过号] 患者后,处理 检查项目.亲和性 逻辑 QueueDO recalledQueueItem = queueMapper.getQueueItemBySeqNum(curSeqNum.get() + 1); updateAffinityItemsWhenRecalled( recalledQueueItem ); CheckTypeDO checkTypeDO = getCheckTypeItem( recalledQueueItem.getBookCheckType() ); if ( checkTypeDO.getAffinityCheckTypes().length > 0) { procAffinityWhenRecalled(recalledQueueItem, checkTypeDO.getAffinityCheckTypes()); } curSeqNum.getAndIncrement(); @@ -458,9 +455,13 @@ return; } // 抢到排队患者后,处理 检查项目.亲和性 逻辑 QueueDO preemptQueueItem = queueMapper.getQueueItemBySeqNum(curSeqNum.get() + 1); updateAffinityItemsWhenPreempt( preemptQueueItem ); CheckTypeDO checkTypeDO = getCheckTypeItem( preemptQueueItem.getBookCheckType() ); // 抢到排队患者后,处理 检查项目.亲和性 逻辑 if ( checkTypeDO.getAffinityCheckTypes().length > 0) { procAffinityWhenPreempt(preemptQueueItem, checkTypeDO.getAffinityCheckTypes()); } curSeqNum.getAndIncrement(); @@ -507,33 +508,27 @@ 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 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.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 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); } } @@ -590,6 +585,19 @@ }); } 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<>();