Browse Source

update

tags/v0
zhaohe 9 months ago
parent
commit
7403cd8534
  1. 54
      src/main/java/a8k/service/app/appctrl/mainflowctrl/CondtionMgrService.java
  2. 39
      src/main/java/a8k/service/app/appctrl/mainflowctrl/ResourceMgrService.java
  3. 6
      src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/DO_FINISH_TUBE_PROCESS.java
  4. 7
      src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/DO_PROCESS_ERROR_PLATE.java
  5. 2
      src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/PLATE_OPT_SCAN.java
  6. 6
      src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/PROCESS_INCUBATE_COMPLETED_PLATE.java
  7. 3
      src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java
  8. 8
      src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java
  9. 6
      src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/SEQ3_APPLAY_RESOURCE.java
  10. 43
      src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/SEQ5_PROCESS.java
  11. 6
      src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/SEQ7_EJECT_TUBEHOLDER.java
  12. 4
      src/main/java/a8k/service/app/appstate/ProjectProcessContextMgrService.java
  13. 4
      src/main/java/a8k/service/app/appstate/type/state/TubeState.java

54
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.IncubationPlateStateMgrService;
import a8k.service.app.appstate.OptScanModuleStateMgrService; import a8k.service.app.appstate.OptScanModuleStateMgrService;
import a8k.service.app.appstate.type.Tube; 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.TubeHolderState;
import a8k.service.app.appstate.type.state.TubeState; import a8k.service.app.appstate.type.state.TubeState;
@ -66,20 +65,16 @@ public class CondtionMgrService {
} }
public Boolean isTimeToEnterNewTubeHolder() { public Boolean isTimeToEnterNewTubeHolder() {
Boolean cond0 = true;
//试管架处于空闲状态
Boolean cond1 = gstate.getTubeHolder().getState().equals(TubeHolderState.IDLE); Boolean cond1 = gstate.getTubeHolder().getState().equals(TubeHolderState.IDLE);
//入料通道是否为空 //入料通道是否为空
return cond0 && cond1 && getTubeholderEnterPosPPS();
return cond1 && getTubeholderEnterPosPPS();
} }
public Boolean isTimeToSwitchNextTube() { public Boolean isTimeToSwitchNextTube() {
Boolean cond0 = true;
//当前试管处理完成
Boolean cond1 = isCurTubeProcessCompleted(); Boolean cond1 = isCurTubeProcessCompleted();
//有待处理的试管 //有待处理的试管
Boolean cond2 = isHasSometubesToBeProcessed(); Boolean cond2 = isHasSometubesToBeProcessed();
return cond0 && cond1 && cond2;
return cond1 && cond2;
} }
public Boolean isTimeToProcessPendingTube() { public Boolean isTimeToProcessPendingTube() {
@ -96,7 +91,7 @@ public class CondtionMgrService {
return cond1 && cond2 && cond3; return cond1 && cond2 && cond3;
} }
public Boolean isTimeToPreProcessTube() {
public Boolean isTimeToProcessTube() {
Tube tube = gstate.getCurProcessingTube(); Tube tube = gstate.getCurProcessingTube();
if (tube == null) if (tube == null)
return false; return false;
@ -108,46 +103,37 @@ public class CondtionMgrService {
return cond1 && cond2; return cond1 && cond2;
} }
public Boolean isTimeToProcessTube() {
public Boolean isHasSomeErrorPlatesToBeProcessed() {
return incubationPlateStateMgrService.isHasSomeErrorPlate();
}
public Boolean isHasErrorTube() {
Tube tube = gstate.getCurProcessingTube(); Tube tube = gstate.getCurProcessingTube();
if (tube == null) if (tube == null)
return false; 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(); Tube tube = gstate.getCurProcessingTube();
if (tube == null) if (tube == null)
return false; 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();
}
} }

39
src/main/java/a8k/service/app/appctrl/mainflowctrl/ResourceMgrService.java

@ -20,6 +20,7 @@ public class ResourceMgrService {
public A8kPublicAreaResource type; public A8kPublicAreaResource type;
public Boolean rented = false;//是否被租用 public Boolean rented = false;//是否被租用
public Object ownerNow = null; public Object ownerNow = null;
public String subOwnerName = "";
public Resource(A8kPublicAreaResource type) { public Resource(A8kPublicAreaResource type) {
this.type = type; this.type = type;
@ -52,7 +53,7 @@ public class ResourceMgrService {
* @param type 资源类型 * @param type 资源类型
* @return 是否申请成功 * @return 是否申请成功
*/ */
Boolean applyForOneResourceInternal(Object applyer, A8kPublicAreaResource type) {
Boolean applyForOneResourceInternal(Object applyer, String subOwnerName, A8kPublicAreaResource type) {
for (Resource r : resources) { for (Resource r : resources) {
if (r.type == type) { if (r.type == type) {
if (r.rented) { if (r.rented) {
@ -60,6 +61,7 @@ public class ResourceMgrService {
} }
r.rented = true; r.rented = true;
r.ownerNow = applyer; r.ownerNow = applyer;
r.subOwnerName = subOwnerName;
return true; return true;
} }
} }
@ -72,7 +74,7 @@ public class ResourceMgrService {
* @param resources 资源类型列表 * @param resources 资源类型列表
* @return 是否申请成功 * @return 是否申请成功
*/ */
synchronized Boolean applyForResourceInternal(Object applyer, A8kPublicAreaResource... resources) {
synchronized Boolean applyForResourceInternal(Object applyer, String subOwnerName, A8kPublicAreaResource... resources) {
// logger.info("{} applyForResources: {}", applyer.getClass().getSimpleName(), types); // logger.info("{} applyForResources: {}", applyer.getClass().getSimpleName(), types);
if (resources == null || resources.length == 0) { if (resources == null || resources.length == 0) {
@ -88,7 +90,7 @@ public class ResourceMgrService {
//租用所有资源 //租用所有资源
for (A8kPublicAreaResource type : resources) { for (A8kPublicAreaResource type : resources) {
Boolean suc = applyForOneResourceInternal(applyer, type);
Boolean suc = applyForOneResourceInternal(applyer, subOwnerName, type);
Assert.isTrue(suc, "applyForResource(applyer, type) fail"); Assert.isTrue(suc, "applyForResource(applyer, type) fail");
} }
return true; return true;
@ -96,7 +98,17 @@ public class ResourceMgrService {
public void applyForResources(Object applyer, A8kPublicAreaResource... resources) { public void applyForResources(Object applyer, A8kPublicAreaResource... resources) {
while (true) { 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) if (suc)
break; break;
@ -107,13 +119,12 @@ public class ResourceMgrService {
/** /**
* 释放资源 * 释放资源
* @param applyer 申请者
* @param type 资源类型 * @param type 资源类型
*/ */
synchronized public void releaseResource(Object applyer, A8kPublicAreaResource type) {
synchronized public void releaseResource(A8kPublicAreaResource... type) {
for (A8kPublicAreaResource t : type) {
for (Resource r : resources) { for (Resource r : resources) {
if (r.type == type) {
if (r.ownerNow == applyer) {
if (r.type == t) {
r.rented = false; r.rented = false;
r.ownerNow = null; 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 = "";
}
}
}
}
} }

6
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() { public Boolean isReady() {
return true;
return cms.isTimeToFinishTubeProcess();
} }
void resetHbotAndShakeModule() throws AppException { void resetHbotAndShakeModule() throws AppException {
if (virtualDevice.isEnable()) { if (virtualDevice.isEnable()) {
virtualDevice.doVirtualThings("处理错误试管", 2); virtualDevice.doVirtualThings("处理错误试管", 2);
@ -86,7 +84,7 @@ public class DO_FINISH_TUBE_PROCESS extends A8kStepAction {
Tube tube = gstate.getCurProcessingTube(); Tube tube = gstate.getCurProcessingTube();
Assert.isTrue(tube != null, "tube != null"); Assert.isTrue(tube != null, "tube != null");
if (tube.getState().equals(TubeState.POST_PROCESSED)) {
if (tube.getState().equals(TubeState.PROCESSED)) {
return List.of(); return List.of();
} }

7
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; ResourceMgrService resourceMgrService;
public Boolean isReady() {
return true;
}
public Boolean isReady() {return cms.isTimeToProcessErrorPlate();}
void doEjectErrorPlate(IncubationSubTank errorTank) throws AppException { void doEjectErrorPlate(IncubationSubTank errorTank) throws AppException {
@ -107,8 +105,7 @@ public class DO_PROCESS_ERROR_PLATE extends A8kStepAction {
if (!errors.isEmpty()) { if (!errors.isEmpty()) {
return errors; return errors;
} }
projectProcessContextMgrService.newPlateToOptScanPos(errorTank);
projectProcessContextMgrService.setOptModuleStateToEmpty();
projectProcessContextMgrService.dropErrorPlate(errorTank);
return List.of(); return List.of();
} }
} }

2
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() { public Boolean isReady() {
return true;
return cms.isTimeToPlateOptScan();
} }

6
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() { public Boolean isReady() {
return true;
return cms.isTimeToProcessIncubateCompletedPlate();
} }
IncubationSubTank getToBeProcessedTank() { IncubationSubTank getToBeProcessedTank() {
return incubationPlateStateMgrService.getOneExpiredPlate(); return incubationPlateStateMgrService.getOneExpiredPlate();
} }
@ -83,7 +81,7 @@ public class PROCESS_INCUBATE_COMPLETED_PLATE extends A8kStepAction {
IncubationSubTank toBeProcesstank; IncubationSubTank toBeProcesstank;
@Override public List<AppError> doAction() { @Override public List<AppError> doAction() {
resourceMgrService.applyForResources(this, A8kPublicAreaResource.OptScanArea,A8kPublicAreaResource.IncubationPlateArea);
resourceMgrService.applyForResources(this, A8kPublicAreaResource.OptScanArea, A8kPublicAreaResource.IncubationPlateArea);
IncubationSubTank tank = getToBeProcessedTank(); IncubationSubTank tank = getToBeProcessedTank();
if (tank == null) { if (tank == null) {
return List.of(); return List.of();

3
src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java

@ -82,11 +82,10 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction {
TubeHolderSetting tubeSetting; TubeHolderSetting tubeSetting;
public Boolean isReady() { public Boolean isReady() {
return true;
return cmgr.isTimeToEnterNewTubeHolder();
} }
/** /**
* *
*/ */

8
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; 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.ResourceMgrService;
import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType;
import a8k.service.app.appctrl.mainflowctrl.base.A8kPublicAreaResource; import a8k.service.app.appctrl.mainflowctrl.base.A8kPublicAreaResource;
@ -53,16 +54,17 @@ public class SEQ2_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction {
ProjectProcessContextMgrService projectProcessContextMgrService; ProjectProcessContextMgrService projectProcessContextMgrService;
@Resource @Resource
TubeFeedingCtrlService tubeFeedingCtrlService; TubeFeedingCtrlService tubeFeedingCtrlService;
@Resource
CondtionMgrService cms;
@Resource @Resource
ResourceMgrService resourceMgrService; ResourceMgrService resourceMgrService;
public Boolean isReady() { public Boolean isReady() {
return true;
}
return cms.isTimeToSwitchNextTube();
}
int getNextTubeIndex() { int getNextTubeIndex() {

6
src/main/java/a8k/service/app/appctrl/mainflowctrl/actionv2/SEQ3_APPLAY_RESOURCE.java

@ -1,6 +1,7 @@
package a8k.service.app.appctrl.mainflowctrl.actionv2; package a8k.service.app.appctrl.mainflowctrl.actionv2;
import a8k.hardware.type.a8kcanprotocol.A8kEcode; 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.ResourceMgrService;
import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType;
import a8k.service.app.appctrl.mainflowctrl.base.A8kStepAction; import a8k.service.app.appctrl.mainflowctrl.base.A8kStepAction;
@ -52,13 +53,12 @@ public class SEQ3_APPLAY_RESOURCE extends A8kStepAction {
ProjectProcessContextMgrService projectProcessContextMgrService; ProjectProcessContextMgrService projectProcessContextMgrService;
@Resource @Resource
ProjInfoMgrService projConfigMgrService; ProjInfoMgrService projConfigMgrService;
@Resource @Resource
ResourceMgrService resourceMgrService;
CondtionMgrService cms;
public Boolean isReady() { public Boolean isReady() {
return true;
return cms.isTimeToProcessPendingTube();
} }

43
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.CondtionMgrService;
import a8k.service.app.appctrl.mainflowctrl.ResourceMgrService; import a8k.service.app.appctrl.mainflowctrl.ResourceMgrService;
import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; 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.A8kStepAction;
import a8k.service.app.appctrl.mainflowctrl.base.MainFlowProcesser; import a8k.service.app.appctrl.mainflowctrl.base.MainFlowProcesser;
import a8k.service.app.appstate.GStateService; import a8k.service.app.appstate.GStateService;
@ -127,6 +128,8 @@ public class SEQ5_PROCESS extends A8kStepAction {
void samplePrepare() throws AppException, ZAppInterruptException { void samplePrepare() throws AppException, ZAppInterruptException {
String subResOwner = "samplePrepare";
if (virtualDevice.isEnable()) { if (virtualDevice.isEnable()) {
virtualDevice.doVirtualThings("摇匀并取盖", 2); virtualDevice.doVirtualThings("摇匀并取盖", 2);
sampleIsReady = true; sampleIsReady = true;
@ -147,9 +150,11 @@ public class SEQ5_PROCESS extends A8kStepAction {
logger.info("摇匀次数 :{}", shakeTimes); logger.info("摇匀次数 :{}", shakeTimes);
logger.info("试管架类型 :{}", tubeHolder.tubeHolderType); logger.info("试管架类型 :{}", tubeHolder.tubeHolderType);
logger.info("是否高位试管:{}", isHighTube); logger.info("是否高位试管:{}", isHighTube);
resourceMgrService.applyForResources(this, subResOwner, A8kPublicAreaResource.TubeSampleProcessAndTubeChannelArea);
tubePreProcesCtrlService.takeTubeFromTubeholderToShakePos(isHighTube); tubePreProcesCtrlService.takeTubeFromTubeholderToShakePos(isHighTube);
tubePreProcesCtrlService.shakeTube(45, shakeTimes); tubePreProcesCtrlService.shakeTube(45, shakeTimes);
tubePreProcesCtrlService.takeTubeCap(); tubePreProcesCtrlService.takeTubeCap();
resourceMgrService.releaseAllResource(this, subResOwner);
} else { } else {
logger.info("不是全血试管,不需要摇匀"); logger.info("不是全血试管,不需要摇匀");
} }
@ -158,11 +163,14 @@ public class SEQ5_PROCESS extends A8kStepAction {
waittingForSampleProcessFinished(); waittingForSampleProcessFinished();
//样本后处理 //样本后处理
resourceMgrService.applyForResources(this, subResOwner, A8kPublicAreaResource.TubeSampleProcessAndTubeChannelArea);
tubePreProcesCtrlService.resteModule(); tubePreProcesCtrlService.resteModule();
resourceMgrService.releaseAllResource(this, subResOwner);
} }
void paltePrepare() throws AppException, ZAppInterruptException { void paltePrepare() throws AppException, ZAppInterruptException {
String subResOwner = "paltePrepare";
// //
// VIRTUAL // VIRTUAL
// //
@ -181,13 +189,17 @@ public class SEQ5_PROCESS extends A8kStepAction {
for (ProjProcessContext cxt : cxts) { for (ProjProcessContext cxt : cxts) {
IncubatorPos incubatorPos = cxt.incubatorPos; IncubatorPos incubatorPos = cxt.incubatorPos;
resourceMgrService.applyForResources(this, subResOwner, A8kPublicAreaResource.PlateBoxArea, A8kPublicAreaResource.IncubationPlateArea);
plateBoxCtrlService.pushPlateQuick(cxt.consumable.getGroup(), incubatorPos); plateBoxCtrlService.pushPlateQuick(cxt.consumable.getGroup(), incubatorPos);
resourceMgrService.releaseAllResource(this, subResOwner);
} }
reactionPlateReady = true; reactionPlateReady = true;
} }
void sampleProcess() throws AppException, ZAppInterruptException { void sampleProcess() throws AppException, ZAppInterruptException {
String subResOwner = "sampleProcess";
if (virtualDevice.isEnable()) { if (virtualDevice.isEnable()) {
virtualDevice.doVirtualThings("准备Hbot Tip", 2); virtualDevice.doVirtualThings("准备Hbot Tip", 2);
waittingForSampleIsReady(); waittingForSampleIsReady();
@ -199,22 +211,26 @@ public class SEQ5_PROCESS extends A8kStepAction {
List<ProjProcessContext> cxts = projectProcessContextMgrService.getTubeAssociatedProjContext(gstate.getCurProcessingTube().getSampleId()); List<ProjProcessContext> cxts = projectProcessContextMgrService.getTubeAssociatedProjContext(gstate.getCurProcessingTube().getSampleId());
Assert.isTrue(!cxts.isEmpty(), "项目上下文不能为空"); Assert.isTrue(!cxts.isEmpty(), "项目上下文不能为空");
resourceMgrService.applyForResources(this, subResOwner, A8kPublicAreaResource.HbotArea);
for (ProjProcessContext cxt : cxts) { for (ProjProcessContext cxt : cxts) {
deviceCtrlScripter.doSampleProcessPrepare(cxt); deviceCtrlScripter.doSampleProcessPrepare(cxt);
waittingForSampleIsReady(); waittingForSampleIsReady();
deviceCtrlScripter.doSampleProcess(cxt); deviceCtrlScripter.doSampleProcess(cxt);
waittingForReactionPlateReady();
resourceMgrService.applyForResources(this, subResOwner, A8kPublicAreaResource.IncubationPlateArea);
deviceCtrlScripter.doSampleProcessPostProcess(cxt); deviceCtrlScripter.doSampleProcessPostProcess(cxt);
resourceMgrService.releaseResource(A8kPublicAreaResource.IncubationPlateArea);
} }
sampleProcessFinished = true; sampleProcessFinished = true;
} }
public Boolean isReady() { public Boolean isReady() {
return true;
return cms.isTimeToProcessTube();
} }
public void beforeDoAction() { public void beforeDoAction() {
reactionPlateReady = false; reactionPlateReady = false;
sampleIsReady = false; sampleIsReady = false;
@ -243,37 +259,46 @@ public class SEQ5_PROCESS extends A8kStepAction {
@Override public List<AppError> doAction() { @Override public List<AppError> doAction() {
var future1 = executor.submit(() -> { var future1 = executor.submit(() -> {
AppError error = null;
try { try {
sampleProcess(); sampleProcess();
} catch (AppException e) { } catch (AppException e) {
logger.error("error", e); logger.error("error", e);
errorFlag = true; errorFlag = true;
return e.error;
error = e.error;
} catch (ZAppInterruptException ignored) { } catch (ZAppInterruptException ignored) {
} }
return null;
resourceMgrService.releaseAllResource(this, "sampleProcess");
return error;
}); });
var future2 = executor.submit(() -> { var future2 = executor.submit(() -> {
AppError error = null;
try { try {
paltePrepare(); paltePrepare();
} catch (AppException e) { } catch (AppException e) {
logger.error("error", e); logger.error("error", e);
errorFlag = true; errorFlag = true;
return e.error;
error = e.error;
} catch (ZAppInterruptException ignored) { } catch (ZAppInterruptException ignored) {
} }
return null;
resourceMgrService.releaseAllResource(this, "paltePrepare");
return error;
}); });
var future3 = executor.submit(() -> { var future3 = executor.submit(() -> {
AppError error = null;
try { try {
samplePrepare(); samplePrepare();
} catch (AppException e) { } catch (AppException e) {
logger.error("error", e); logger.error("error", e);
errorFlag = true; errorFlag = true;
return e.error;
error = e.error;
} catch (ZAppInterruptException ignored) { } catch (ZAppInterruptException ignored) {
} }
return null;
resourceMgrService.releaseAllResource(this, "samplePrepare");
return error;
}); });
futures.add(future1); futures.add(future1);

6
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() { 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<AppError> doAction() { @Override public List<AppError> doAction() {
resourceMgrService.applyForResources(this, A8kPublicAreaResource.TubeSampleProcessAndTubeChannelArea); resourceMgrService.applyForResources(this, A8kPublicAreaResource.TubeSampleProcessAndTubeChannelArea);
try { try {

4
src/main/java/a8k/service/app/appstate/ProjectProcessContextMgrService.java

@ -372,6 +372,10 @@ public class ProjectProcessContextMgrService {
cxt.state = ProjProcessState.FINISH; cxt.state = ProjProcessState.FINISH;
} }
synchronized public void dropErrorPlate(IncubationSubTank tank) {
incubationPlateStateMgrService.resetIncubatorPos(tank.getPos());
}
synchronized public void changeTubeStateToError(Tube tube, List<AppError> errors) { synchronized public void changeTubeStateToError(Tube tube, List<AppError> errors) {
var incubationState = gstate.getIncubationPlate(); var incubationState = gstate.getIncubationPlate();

4
src/main/java/a8k/service/app/appstate/type/state/TubeState.java

@ -8,12 +8,8 @@ public enum TubeState {
TO_BE_PROCESSED,//待处理 TO_BE_PROCESSED,//待处理
PENDING,//挂起的试管即下一个被处理的试管 PENDING,//挂起的试管即下一个被处理的试管
RESOURCE_IS_READY,//资源准备好 RESOURCE_IS_READY,//资源准备好
PRE_PROCESSING, //预处理
PRE_PROCESSED, //预处理结束
PROCESSING,//处理 PROCESSING,//处理
PROCESSED,//处理完成 PROCESSED,//处理完成
POST_PROCESSING, //后处理
POST_PROCESSED, //后处理完成
PROCESS_COMPLETE,//处理完成 PROCESS_COMPLETE,//处理完成
ERROR,//处理出错 ERROR,//处理出错
; ;

Loading…
Cancel
Save