From 7403cd8534ff6e12642b2d481f852545e055685e Mon Sep 17 00:00:00 2001 From: zhaohe Date: Thu, 7 Nov 2024 13:44:45 +0800 Subject: [PATCH] update --- .../appctrl/mainflowctrl/CondtionMgrService.java | 54 ++++++++-------------- .../appctrl/mainflowctrl/ResourceMgrService.java | 49 ++++++++++++++------ .../actionv2/DO_FINISH_TUBE_PROCESS.java | 6 +-- .../actionv2/DO_PROCESS_ERROR_PLATE.java | 7 +-- .../mainflowctrl/actionv2/PLATE_OPT_SCAN.java | 2 +- .../actionv2/PROCESS_INCUBATE_COMPLETED_PLATE.java | 6 +-- .../actionv2/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java | 7 ++- .../actionv2/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java | 8 ++-- .../actionv2/SEQ3_APPLAY_RESOURCE.java | 6 +-- .../mainflowctrl/actionv2/SEQ5_PROCESS.java | 49 +++++++++++++++----- .../actionv2/SEQ7_EJECT_TUBEHOLDER.java | 6 ++- .../appstate/ProjectProcessContextMgrService.java | 4 ++ .../service/app/appstate/type/state/TubeState.java | 4 -- 13 files changed, 119 insertions(+), 89 deletions(-) diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/CondtionMgrService.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/CondtionMgrService.java index 3c9c187..8f2532a 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/CondtionMgrService.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/CondtionMgrService.java @@ -6,7 +6,6 @@ import a8k.service.app.appstate.GStateService; import a8k.service.app.appstate.IncubationPlateStateMgrService; import a8k.service.app.appstate.OptScanModuleStateMgrService; import a8k.service.app.appstate.type.Tube; -import a8k.service.app.appstate.type.state.A8kWorkState; import a8k.service.app.appstate.type.state.TubeHolderState; import a8k.service.app.appstate.type.state.TubeState; @@ -66,20 +65,16 @@ public class CondtionMgrService { } public Boolean isTimeToEnterNewTubeHolder() { - Boolean cond0 = true; - //试管架处于空闲状态 Boolean cond1 = gstate.getTubeHolder().getState().equals(TubeHolderState.IDLE); //入料通道是否为空 - return cond0 && cond1 && getTubeholderEnterPosPPS(); + return cond1 && getTubeholderEnterPosPPS(); } public Boolean isTimeToSwitchNextTube() { - Boolean cond0 = true; - //当前试管处理完成 Boolean cond1 = isCurTubeProcessCompleted(); //有待处理的试管 Boolean cond2 = isHasSometubesToBeProcessed(); - return cond0 && cond1 && cond2; + return cond1 && cond2; } public Boolean isTimeToProcessPendingTube() { @@ -96,7 +91,7 @@ public class CondtionMgrService { return cond1 && cond2 && cond3; } - public Boolean isTimeToPreProcessTube() { + public Boolean isTimeToProcessTube() { Tube tube = gstate.getCurProcessingTube(); if (tube == null) return false; @@ -108,46 +103,37 @@ public class CondtionMgrService { return cond1 && cond2; } - public Boolean isTimeToProcessTube() { + public Boolean isHasSomeErrorPlatesToBeProcessed() { + return incubationPlateStateMgrService.isHasSomeErrorPlate(); + } + + public Boolean isHasErrorTube() { Tube tube = gstate.getCurProcessingTube(); if (tube == null) return false; - - //当前正在工作 - Boolean cond1 = true; - //没有试管在处理 或者 当前试管处理完成 - Boolean cond2 = tube.getState().equals(TubeState.PRE_PROCESSED) | tube.getState().equals(TubeState.PROCESSING); - return cond1 && cond2; + return gstate.getCurProcessingTube().getState().equals(TubeState.ERROR); } - public Boolean isTimeToPostProcessTube() { + public Boolean isHasProcessedTube() { Tube tube = gstate.getCurProcessingTube(); if (tube == null) return false; - - //当前正在工作 - Boolean cond1 = true; - //没有试管在处理 或者 当前试管处理完成 - Boolean cond2 = tube.getState().equals(TubeState.PROCESSED); - return cond1 && cond2; + return gstate.getCurProcessingTube().getState().equals(TubeState.PROCESSED); } - public Boolean isHasSomeErrorPlatesToBeProcessed() { - return incubationPlateStateMgrService.isHasSomeErrorPlate(); + public Boolean isTimeToFinishTubeProcess() { + return isHasErrorTube() || isHasProcessedTube(); } - public Boolean isHasSomeErrorTubeToBeProcessed() { - Tube tube = gstate.getCurProcessingTube(); - if (tube == null) - return false; - return gstate.getCurProcessingTube().getState().equals(TubeState.ERROR); + public Boolean isTimeToProcessErrorPlate() { + return isHasSomeErrorPlatesToBeProcessed() && isOptModuleEmpty(); } - public Boolean isHasPostProcessedTube() { - Tube tube = gstate.getCurProcessingTube(); - if (tube == null) - return false; - return gstate.getCurProcessingTube().getState().equals(TubeState.POST_PROCESSED); + public Boolean isTimeToPlateOptScan() { + return !optScanModuleStateMgrService.isEmpty(); } + public Boolean isTimeToProcessIncubateCompletedPlate() { + return incubationPlateStateMgrService.getOneExpiredPlate() != null && optScanModuleStateMgrService.isEmpty(); + } } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/ResourceMgrService.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/ResourceMgrService.java index 3bc1210..45277ad 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/ResourceMgrService.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/ResourceMgrService.java @@ -18,8 +18,9 @@ public class ResourceMgrService { static public class Resource { public A8kPublicAreaResource type; - public Boolean rented = false;//是否被租用 - public Object ownerNow = null; + public Boolean rented = false;//是否被租用 + public Object ownerNow = null; + public String subOwnerName = ""; public Resource(A8kPublicAreaResource type) { this.type = type; @@ -52,14 +53,15 @@ public class ResourceMgrService { * @param type 资源类型 * @return 是否申请成功 */ - Boolean applyForOneResourceInternal(Object applyer, A8kPublicAreaResource type) { + Boolean applyForOneResourceInternal(Object applyer, String subOwnerName, A8kPublicAreaResource type) { for (Resource r : resources) { if (r.type == type) { if (r.rented) { return false; } - r.rented = true; - r.ownerNow = applyer; + r.rented = true; + r.ownerNow = applyer; + r.subOwnerName = subOwnerName; return true; } } @@ -72,7 +74,7 @@ public class ResourceMgrService { * @param resources 资源类型列表 * @return 是否申请成功 */ - synchronized Boolean applyForResourceInternal(Object applyer, A8kPublicAreaResource... resources) { + synchronized Boolean applyForResourceInternal(Object applyer, String subOwnerName, A8kPublicAreaResource... resources) { // logger.info("{} applyForResources: {}", applyer.getClass().getSimpleName(), types); if (resources == null || resources.length == 0) { @@ -88,7 +90,7 @@ public class ResourceMgrService { //租用所有资源 for (A8kPublicAreaResource type : resources) { - Boolean suc = applyForOneResourceInternal(applyer, type); + Boolean suc = applyForOneResourceInternal(applyer, subOwnerName, type); Assert.isTrue(suc, "applyForResource(applyer, type) fail"); } return true; @@ -96,7 +98,17 @@ public class ResourceMgrService { public void applyForResources(Object applyer, A8kPublicAreaResource... resources) { while (true) { - Boolean suc = applyForResourceInternal(applyer, resources); + Boolean suc = applyForResourceInternal(applyer, "", resources); + if (suc) + break; + + OS.forceSleep(300); + } + } + + public void applyForResources(Object applyer, String subOwnerName, A8kPublicAreaResource... resources) { + while (true) { + Boolean suc = applyForResourceInternal(applyer, subOwnerName, resources); if (suc) break; @@ -107,13 +119,12 @@ public class ResourceMgrService { /** * 释放资源 - * @param applyer 申请者 * @param type 资源类型 */ - synchronized public void releaseResource(Object applyer, A8kPublicAreaResource type) { - for (Resource r : resources) { - if (r.type == type) { - if (r.ownerNow == applyer) { + synchronized public void releaseResource(A8kPublicAreaResource... type) { + for (A8kPublicAreaResource t : type) { + for (Resource r : resources) { + if (r.type == t) { r.rented = false; r.ownerNow = null; } @@ -134,5 +145,17 @@ public class ResourceMgrService { } } + synchronized public void releaseAllResource(Object applyer, String subOwnerName) { + for (Resource r : resources) { + if (r.ownerNow == applyer) { + if (r.subOwnerName.equals(subOwnerName)) { + r.rented = false; + r.ownerNow = null; + r.subOwnerName = ""; + } + } + } + } + } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/DO_FINISH_TUBE_PROCESS.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/DO_FINISH_TUBE_PROCESS.java index 061c580..ce975c6 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/DO_FINISH_TUBE_PROCESS.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/DO_FINISH_TUBE_PROCESS.java @@ -59,11 +59,9 @@ public class DO_FINISH_TUBE_PROCESS extends A8kStepAction { public Boolean isReady() { - return true; + return cms.isTimeToFinishTubeProcess(); } - - void resetHbotAndShakeModule() throws AppException { if (virtualDevice.isEnable()) { virtualDevice.doVirtualThings("处理错误试管", 2); @@ -86,7 +84,7 @@ public class DO_FINISH_TUBE_PROCESS extends A8kStepAction { Tube tube = gstate.getCurProcessingTube(); Assert.isTrue(tube != null, "tube != null"); - if (tube.getState().equals(TubeState.POST_PROCESSED)) { + if (tube.getState().equals(TubeState.PROCESSED)) { return List.of(); } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/DO_PROCESS_ERROR_PLATE.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/DO_PROCESS_ERROR_PLATE.java index 26383e0..00757ad 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/DO_PROCESS_ERROR_PLATE.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/DO_PROCESS_ERROR_PLATE.java @@ -54,9 +54,7 @@ public class DO_PROCESS_ERROR_PLATE extends A8kStepAction { ResourceMgrService resourceMgrService; - public Boolean isReady() { - return true; - } + public Boolean isReady() {return cms.isTimeToProcessErrorPlate();} void doEjectErrorPlate(IncubationSubTank errorTank) throws AppException { @@ -107,8 +105,7 @@ public class DO_PROCESS_ERROR_PLATE extends A8kStepAction { if (!errors.isEmpty()) { return errors; } - projectProcessContextMgrService.newPlateToOptScanPos(errorTank); - projectProcessContextMgrService.setOptModuleStateToEmpty(); + projectProcessContextMgrService.dropErrorPlate(errorTank); return List.of(); } } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/PLATE_OPT_SCAN.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/PLATE_OPT_SCAN.java index ac28269..70e16a0 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/PLATE_OPT_SCAN.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/PLATE_OPT_SCAN.java @@ -71,7 +71,7 @@ public class PLATE_OPT_SCAN extends A8kStepAction { public Boolean isReady() { - return true; + return cms.isTimeToPlateOptScan(); } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/PROCESS_INCUBATE_COMPLETED_PLATE.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/PROCESS_INCUBATE_COMPLETED_PLATE.java index d78b04a..2a3f616 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/PROCESS_INCUBATE_COMPLETED_PLATE.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/PROCESS_INCUBATE_COMPLETED_PLATE.java @@ -62,11 +62,9 @@ public class PROCESS_INCUBATE_COMPLETED_PLATE extends A8kStepAction { public Boolean isReady() { - return true; + return cms.isTimeToProcessIncubateCompletedPlate(); } - - IncubationSubTank getToBeProcessedTank() { return incubationPlateStateMgrService.getOneExpiredPlate(); } @@ -83,7 +81,7 @@ public class PROCESS_INCUBATE_COMPLETED_PLATE extends A8kStepAction { IncubationSubTank toBeProcesstank; @Override public List doAction() { - resourceMgrService.applyForResources(this, A8kPublicAreaResource.OptScanArea,A8kPublicAreaResource.IncubationPlateArea); + resourceMgrService.applyForResources(this, A8kPublicAreaResource.OptScanArea, A8kPublicAreaResource.IncubationPlateArea); IncubationSubTank tank = getToBeProcessedTank(); if (tank == null) { return List.of(); diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java index 1bb6022..c1900fa 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java @@ -69,9 +69,9 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { @Resource AppTubeSettingMgrService appTubeSettingMgrService; @Resource - ProjInfoMgrService appProjInfoMgr; + ProjInfoMgrService appProjInfoMgr; @Resource - ResourceMgrService resourceMgrService; + ResourceMgrService resourceMgrService; @Resource TubeFeedingCtrlService stc; @@ -82,11 +82,10 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { TubeHolderSetting tubeSetting; public Boolean isReady() { - return true; + return cmgr.isTimeToEnterNewTubeHolder(); } - /** * */ diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java index a1a372d..b59fbb0 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java @@ -1,5 +1,6 @@ package a8k.service.app.appctrl.mainflowctrl.actionv2; +import a8k.service.app.appctrl.mainflowctrl.CondtionMgrService; import a8k.service.app.appctrl.mainflowctrl.ResourceMgrService; import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; import a8k.service.app.appctrl.mainflowctrl.base.A8kPublicAreaResource; @@ -53,16 +54,17 @@ public class SEQ2_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction { ProjectProcessContextMgrService projectProcessContextMgrService; @Resource TubeFeedingCtrlService tubeFeedingCtrlService; + @Resource + CondtionMgrService cms; @Resource ResourceMgrService resourceMgrService; public Boolean isReady() { - return true; - } - + return cms.isTimeToSwitchNextTube(); + } int getNextTubeIndex() { diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/SEQ3_APPLAY_RESOURCE.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/SEQ3_APPLAY_RESOURCE.java index 812fbc7..772edd6 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/SEQ3_APPLAY_RESOURCE.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/SEQ3_APPLAY_RESOURCE.java @@ -1,6 +1,7 @@ package a8k.service.app.appctrl.mainflowctrl.actionv2; import a8k.hardware.type.a8kcanprotocol.A8kEcode; +import a8k.service.app.appctrl.mainflowctrl.CondtionMgrService; import a8k.service.app.appctrl.mainflowctrl.ResourceMgrService; import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; import a8k.service.app.appctrl.mainflowctrl.base.A8kStepAction; @@ -52,13 +53,12 @@ public class SEQ3_APPLAY_RESOURCE extends A8kStepAction { ProjectProcessContextMgrService projectProcessContextMgrService; @Resource ProjInfoMgrService projConfigMgrService; - @Resource - ResourceMgrService resourceMgrService; + CondtionMgrService cms; public Boolean isReady() { - return true; + return cms.isTimeToProcessPendingTube(); } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/SEQ5_PROCESS.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/SEQ5_PROCESS.java index accae96..948bd1e 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/SEQ5_PROCESS.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/SEQ5_PROCESS.java @@ -4,6 +4,7 @@ import a8k.OS; import a8k.service.app.appctrl.mainflowctrl.CondtionMgrService; import a8k.service.app.appctrl.mainflowctrl.ResourceMgrService; import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; +import a8k.service.app.appctrl.mainflowctrl.base.A8kPublicAreaResource; import a8k.service.app.appctrl.mainflowctrl.base.A8kStepAction; import a8k.service.app.appctrl.mainflowctrl.base.MainFlowProcesser; import a8k.service.app.appstate.GStateService; @@ -74,11 +75,11 @@ public class SEQ5_PROCESS extends A8kStepAction { @Resource PipetteGunCtrlService pipetteGunCtrlService; @Resource - DeviceCtrlScripter deviceCtrlScripter; + DeviceCtrlScripter deviceCtrlScripter; @Resource - ResourceMgrService resourceMgrService; + ResourceMgrService resourceMgrService; @Resource - PlateBoxCtrlService plateBoxCtrlService; + PlateBoxCtrlService plateBoxCtrlService; @Resource TubePreProcesCtrlService tubePreProcesCtrlService; // @@ -127,6 +128,8 @@ public class SEQ5_PROCESS extends A8kStepAction { void samplePrepare() throws AppException, ZAppInterruptException { + String subResOwner = "samplePrepare"; + if (virtualDevice.isEnable()) { virtualDevice.doVirtualThings("摇匀并取盖", 2); sampleIsReady = true; @@ -147,9 +150,11 @@ public class SEQ5_PROCESS extends A8kStepAction { logger.info("摇匀次数 :{}", shakeTimes); logger.info("试管架类型 :{}", tubeHolder.tubeHolderType); logger.info("是否高位试管:{}", isHighTube); + resourceMgrService.applyForResources(this, subResOwner, A8kPublicAreaResource.TubeSampleProcessAndTubeChannelArea); tubePreProcesCtrlService.takeTubeFromTubeholderToShakePos(isHighTube); tubePreProcesCtrlService.shakeTube(45, shakeTimes); tubePreProcesCtrlService.takeTubeCap(); + resourceMgrService.releaseAllResource(this, subResOwner); } else { logger.info("不是全血试管,不需要摇匀"); } @@ -158,11 +163,14 @@ public class SEQ5_PROCESS extends A8kStepAction { waittingForSampleProcessFinished(); //样本后处理 + resourceMgrService.applyForResources(this, subResOwner, A8kPublicAreaResource.TubeSampleProcessAndTubeChannelArea); tubePreProcesCtrlService.resteModule(); + resourceMgrService.releaseAllResource(this, subResOwner); } void paltePrepare() throws AppException, ZAppInterruptException { + String subResOwner = "paltePrepare"; // // VIRTUAL // @@ -181,13 +189,17 @@ public class SEQ5_PROCESS extends A8kStepAction { for (ProjProcessContext cxt : cxts) { IncubatorPos incubatorPos = cxt.incubatorPos; + resourceMgrService.applyForResources(this, subResOwner, A8kPublicAreaResource.PlateBoxArea, A8kPublicAreaResource.IncubationPlateArea); plateBoxCtrlService.pushPlateQuick(cxt.consumable.getGroup(), incubatorPos); + resourceMgrService.releaseAllResource(this, subResOwner); } reactionPlateReady = true; } void sampleProcess() throws AppException, ZAppInterruptException { + String subResOwner = "sampleProcess"; + if (virtualDevice.isEnable()) { virtualDevice.doVirtualThings("准备Hbot Tip", 2); waittingForSampleIsReady(); @@ -199,22 +211,26 @@ public class SEQ5_PROCESS extends A8kStepAction { List cxts = projectProcessContextMgrService.getTubeAssociatedProjContext(gstate.getCurProcessingTube().getSampleId()); Assert.isTrue(!cxts.isEmpty(), "项目上下文不能为空"); + resourceMgrService.applyForResources(this, subResOwner, A8kPublicAreaResource.HbotArea); + for (ProjProcessContext cxt : cxts) { deviceCtrlScripter.doSampleProcessPrepare(cxt); waittingForSampleIsReady(); deviceCtrlScripter.doSampleProcess(cxt); + waittingForReactionPlateReady(); + resourceMgrService.applyForResources(this, subResOwner, A8kPublicAreaResource.IncubationPlateArea); deviceCtrlScripter.doSampleProcessPostProcess(cxt); + resourceMgrService.releaseResource(A8kPublicAreaResource.IncubationPlateArea); + } sampleProcessFinished = true; } public Boolean isReady() { - return true; + return cms.isTimeToProcessTube(); } - - public void beforeDoAction() { reactionPlateReady = false; sampleIsReady = false; @@ -243,37 +259,46 @@ public class SEQ5_PROCESS extends A8kStepAction { @Override public List doAction() { var future1 = executor.submit(() -> { + AppError error = null; try { sampleProcess(); } catch (AppException e) { logger.error("error", e); errorFlag = true; - return e.error; + error = e.error; } catch (ZAppInterruptException ignored) { + } - return null; + resourceMgrService.releaseAllResource(this, "sampleProcess"); + return error; }); var future2 = executor.submit(() -> { + AppError error = null; try { paltePrepare(); } catch (AppException e) { logger.error("error", e); errorFlag = true; - return e.error; + error = e.error; + } catch (ZAppInterruptException ignored) { } - return null; + resourceMgrService.releaseAllResource(this, "paltePrepare"); + return error; }); var future3 = executor.submit(() -> { + AppError error = null; try { samplePrepare(); } catch (AppException e) { logger.error("error", e); errorFlag = true; - return e.error; + error = e.error; + } catch (ZAppInterruptException ignored) { } - return null; + resourceMgrService.releaseAllResource(this, "samplePrepare"); + return error; }); futures.add(future1); diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/SEQ7_EJECT_TUBEHOLDER.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/SEQ7_EJECT_TUBEHOLDER.java index fb9031f..b5669e3 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/SEQ7_EJECT_TUBEHOLDER.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/SEQ7_EJECT_TUBEHOLDER.java @@ -59,11 +59,13 @@ public class SEQ7_EJECT_TUBEHOLDER extends A8kStepAction { public Boolean isReady() { - return true; + Boolean cond2 = gstate.getTubeHolder().getState().equals(TubeHolderState.PROCESSING); + Boolean cond3 = cms.isCurTubeProcessCompleted(); + Boolean cond4 = !cms.isHasSometubesToBeProcessed(); + return cond2 && cond3 && cond4; } - @Override public List doAction() { resourceMgrService.applyForResources(this, A8kPublicAreaResource.TubeSampleProcessAndTubeChannelArea); try { diff --git a/src/main/java/a8k/service/app/appstate/ProjectProcessContextMgrService.java b/src/main/java/a8k/service/app/appstate/ProjectProcessContextMgrService.java index 974ee34..5f5fae4 100644 --- a/src/main/java/a8k/service/app/appstate/ProjectProcessContextMgrService.java +++ b/src/main/java/a8k/service/app/appstate/ProjectProcessContextMgrService.java @@ -372,6 +372,10 @@ public class ProjectProcessContextMgrService { cxt.state = ProjProcessState.FINISH; } + synchronized public void dropErrorPlate(IncubationSubTank tank) { + incubationPlateStateMgrService.resetIncubatorPos(tank.getPos()); + } + synchronized public void changeTubeStateToError(Tube tube, List errors) { var incubationState = gstate.getIncubationPlate(); diff --git a/src/main/java/a8k/service/app/appstate/type/state/TubeState.java b/src/main/java/a8k/service/app/appstate/type/state/TubeState.java index 2900af5..28e0454 100644 --- a/src/main/java/a8k/service/app/appstate/type/state/TubeState.java +++ b/src/main/java/a8k/service/app/appstate/type/state/TubeState.java @@ -8,12 +8,8 @@ public enum TubeState { TO_BE_PROCESSED,//待处理 PENDING,//挂起的试管,即下一个被处理的试管 RESOURCE_IS_READY,//资源准备好 - PRE_PROCESSING, //预处理 - PRE_PROCESSED, //预处理结束 PROCESSING,//处理 PROCESSED,//处理完成 - POST_PROCESSING, //后处理 - POST_PROCESSED, //后处理完成 PROCESS_COMPLETE,//处理完成 ERROR,//处理出错 ;