Browse Source

update

tags/v0
zhaohe 10 months ago
parent
commit
c474418a37
  1. 130
      src/main/java/a8k/service/appctrl/CondtionMgrService.java
  2. 3
      src/main/java/a8k/service/appctrl/MainFlowCtrlService.java
  3. 14
      src/main/java/a8k/service/appctrl/action/base/A8kActionStepType.java
  4. 2
      src/main/java/a8k/service/appctrl/action/ctrl/DO_PAUSE.java
  5. 4
      src/main/java/a8k/service/appctrl/action/ctrl/DO_RESUME.java
  6. 2
      src/main/java/a8k/service/appctrl/action/ctrl/DO_START.java
  7. 2
      src/main/java/a8k/service/appctrl/action/ctrl/DO_STOP.java
  8. 27
      src/main/java/a8k/service/appctrl/action/mainflow/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java
  9. 16
      src/main/java/a8k/service/appctrl/action/mainflow/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java
  10. 22
      src/main/java/a8k/service/appctrl/action/mainflow/SEQ3_APPLAY_RESOURCE.java
  11. 156
      src/main/java/a8k/service/appctrl/action/mainflow/SEQ4_PRE_PROCESS.java
  12. 96
      src/main/java/a8k/service/appctrl/action/mainflow/SEQ5_PROCESS.java
  13. 95
      src/main/java/a8k/service/appctrl/action/mainflow/SEQ6_POST_PROCESS.java
  14. 19
      src/main/java/a8k/service/appctrl/action/mainflow/SEQ7_EJECT_TUBEHOLDER.java
  15. 7
      src/main/java/a8k/service/appctrl/scheduler/MainFlowCtrlScheduler.java
  16. 2
      src/main/java/a8k/service/appstate/GStateService.java
  17. 29
      src/main/java/a8k/service/appstate/IncubationPlateMgrService.java
  18. 6
      src/main/java/a8k/service/appstate/TubeProcessContextMgrService.java
  19. 7
      src/main/java/a8k/service/appstate/TubeProcessStateMgrService.java
  20. 3
      src/main/java/a8k/service/appstate/type/IncubationSubTank.java
  21. 1
      src/main/java/a8k/service/appstate/type/ProjProcessContext.java
  22. 3
      src/main/java/a8k/service/appstate/type/Tube.java
  23. 1
      src/main/java/a8k/service/appstate/type/state/TubeState.java

130
src/main/java/a8k/service/appctrl/CondtionMgrService.java

@ -0,0 +1,130 @@
package a8k.service.appctrl;
import a8k.hardware.A8kCanBusService;
import a8k.hardware.type.a8kcanprotocol.IOId;
import a8k.service.appstate.GStateService;
import a8k.service.appstate.IncubationPlateMgrService;
import a8k.service.appstate.type.Tube;
import a8k.service.appstate.type.state.A8kWorkState;
import a8k.service.appstate.type.state.TubeHolderState;
import a8k.service.appstate.type.state.TubeState;
import a8k.type.exception.AppException;
import jakarta.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
public class CondtionMgrService {
static Logger logger = LoggerFactory.getLogger(CondtionMgrService.class);
@Resource
GStateService gstate;
@Resource
A8kCanBusService canBus;
@Resource
IncubationPlateMgrService incubationPlateMgrService;
Boolean getTubeholderEnterPosPPS() { //入料通道是否为空
try {
return canBus.getIOState(IOId.InfeedPPS);
} catch (Exception e) {
logger.error("getTubeholderEnterPosPPS error", e);
return false;
}
}
public Boolean isNoMoreTubeToBeProcessed() {
return !gstate.getTubeHolder().isHasTubeToBeProcessed();
}
public Boolean isCanDoAction() {
return gstate.mainFlowCtrlState.workState.equals(A8kWorkState.WORKING) && !gstate.mainFlowCtrlState.errorFlag;
}
public Boolean isHasSometubesToBeProcessed() {
return gstate.getTubeHolder().isHasTubeToBeProcessed() || gstate.getEmergencyTubePos().tube.state.equals(TubeState.TO_BE_PROCESSED);
}
public Boolean isCurTubeProcessCompleted() {
return gstate.getCurProcessingTube() == null || gstate.getCurProcessingTube().state.equals(TubeState.PROCESS_COMPLETE);
}
public Boolean isTimeToEnterNewTubeHolder() {
Boolean cond0 = isCanDoAction();
//试管架处于空闲状态
Boolean cond1 = gstate.getTubeHolder().state.equals(TubeHolderState.IDLE);
//入料通道是否为空
Boolean cond2 = getTubeholderEnterPosPPS();
return cond0 && cond1 && cond2;
}
public Boolean isTimeToSwitchNextTube() {
Boolean cond0 = isCanDoAction();
//当前试管处理完成
Boolean cond1 = isCurTubeProcessCompleted();
//有待处理的试管
Boolean cond2 = isHasSometubesToBeProcessed();
return cond0 && cond1 && cond2;
}
public Boolean isTimeToProcessPendingTube() {
Tube tube = gstate.getCurProcessingTube();
if (tube == null)
return false;
//当前正在工作
Boolean cond1 = isCanDoAction();
//没有试管在处理 或者 当前试管处理完成
Boolean cond2 = tube.state.equals(TubeState.PENDING);
//急诊有待处理的试管或者试管架正在处理
Boolean cond3 = incubationPlateMgrService.isHasEnoughIncubationIDLEPos(tube.projIndex.size());
return cond1 && cond2 && cond3;
}
public Boolean isTimeToPreProcessTube() {
Tube tube = gstate.getCurProcessingTube();
if (tube == null)
return false;
//当前正在工作
Boolean cond1 = isCanDoAction();
//没有试管在处理 或者 当前试管处理完成
Boolean cond2 = tube.state.equals(TubeState.RESOURCE_IS_READY);
//急诊有待处理的试管或者试管架正在处理
Boolean cond3 = incubationPlateMgrService.isHasEnoughIncubationIDLEPos(tube.projIndex.size());
return cond1 && cond2 && cond3;
}
public Boolean isTimeToProcessTube() {
Tube tube = gstate.getCurProcessingTube();
if (tube == null)
return false;
//当前正在工作
Boolean cond1 = isCanDoAction();
//没有试管在处理 或者 当前试管处理完成
Boolean cond2 = tube.state.equals(TubeState.PRE_PROCESSED);
//急诊有待处理的试管或者试管架正在处理
Boolean cond3 = incubationPlateMgrService.isHasEnoughIncubationIDLEPos(tube.projIndex.size());
return cond1 && cond2 && cond3;
}
public Boolean isTimeToPostProcessTube() {
Tube tube = gstate.getCurProcessingTube();
if (tube == null)
return false;
//当前正在工作
Boolean cond1 = isCanDoAction();
//没有试管在处理 或者 当前试管处理完成
Boolean cond2 = tube.state.equals(TubeState.PROCESSED);
//急诊有待处理的试管或者试管架正在处理
Boolean cond3 = incubationPlateMgrService.isHasEnoughIncubationIDLEPos(tube.projIndex.size());
return cond1 && cond2 && cond3;
}
}

3
src/main/java/a8k/service/appctrl/MainFlowCtrlService.java

@ -1,8 +1,8 @@
package a8k.service.appctrl; package a8k.service.appctrl;
import a8k.service.appctrl.action.*;
import a8k.service.appctrl.action.base.A8kActionStepType; import a8k.service.appctrl.action.base.A8kActionStepType;
import a8k.service.appctrl.action.base.A8kStepAction; import a8k.service.appctrl.action.base.A8kStepAction;
import a8k.service.appctrl.action.ctrl.DO_STOP;
import a8k.service.appctrl.scheduler.MainFlowCtrlScheduler; import a8k.service.appctrl.scheduler.MainFlowCtrlScheduler;
import a8k.service.appctrl.type.A8kErrorContext; import a8k.service.appctrl.type.A8kErrorContext;
import a8k.service.appstate.GStateService; import a8k.service.appstate.GStateService;
@ -16,7 +16,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List; import java.util.List;
@Component @Component

14
src/main/java/a8k/service/appctrl/action/base/A8kActionStepType.java

@ -5,18 +5,16 @@ public enum A8kActionStepType {
DO_PAUSE,//暂停 DO_PAUSE,//暂停
DO_STOP, //停止 DO_STOP, //停止
DO_RESUME,//恢复 DO_RESUME,//恢复
DO_CLEAR_ERROR,//清除错误,特殊动作,无需注册成类型
//mainflow
SEQ1_ENTER_TUBEHOLDER_AND_SCAN, //入料并扫描 SEQ1_ENTER_TUBEHOLDER_AND_SCAN, //入料并扫描
SEQ2_SWITCH_TO_THE_NEXT_TUBE,// 切换到下一个试管 SEQ2_SWITCH_TO_THE_NEXT_TUBE,// 切换到下一个试管
SEQ3_APPLAY_RESOURCE,//申请资源 SEQ3_APPLAY_RESOURCE,//申请资源
SEQ4_PRE_PROCESS, SEQ4_PRE_PROCESS,
SEQ5_PROCESS,
SEQ6_POST_PROCESS,
SEQ7_EJECT_TUBEHOLDER, //弹出试管架
// SEQ4_PROCESS,
// SEQ5_POS_PROCESS_TUBE,
DO_EJECT_TUBEHOLDER, //弹出试管架
//特殊动作无需注册成类型
DO_CLEAR_ERROR,//清除错误
//
} }

2
src/main/java/a8k/service/appctrl/action/DO_PAUSE.java → src/main/java/a8k/service/appctrl/action/ctrl/DO_PAUSE.java

@ -1,4 +1,4 @@
package a8k.service.appctrl.action;
package a8k.service.appctrl.action.ctrl;
import a8k.service.appctrl.action.base.A8kActionStepType; import a8k.service.appctrl.action.base.A8kActionStepType;
import a8k.service.appctrl.action.base.A8kStepAction; import a8k.service.appctrl.action.base.A8kStepAction;

4
src/main/java/a8k/service/appctrl/action/DO_RESUME.java → src/main/java/a8k/service/appctrl/action/ctrl/DO_RESUME.java

@ -1,4 +1,4 @@
package a8k.service.appctrl.action;
package a8k.service.appctrl.action.ctrl;
import a8k.service.appctrl.action.base.A8kActionStepType; import a8k.service.appctrl.action.base.A8kActionStepType;
import a8k.service.appctrl.action.base.A8kStepAction; import a8k.service.appctrl.action.base.A8kStepAction;
@ -19,7 +19,7 @@ public class DO_RESUME extends A8kStepAction {
static Logger logger = LoggerFactory.getLogger(DO_RESUME.class); static Logger logger = LoggerFactory.getLogger(DO_RESUME.class);
DO_RESUME() { DO_RESUME() {
super(A8kActionStepType.DO_STOP);
super(A8kActionStepType.DO_RESUME);
} }
@Resource @Resource

2
src/main/java/a8k/service/appctrl/action/DO_START.java → src/main/java/a8k/service/appctrl/action/ctrl/DO_START.java

@ -1,4 +1,4 @@
package a8k.service.appctrl.action;
package a8k.service.appctrl.action.ctrl;
import a8k.service.appctrl.action.base.A8kActionStepType; import a8k.service.appctrl.action.base.A8kActionStepType;
import a8k.service.appctrl.action.base.A8kStepAction; import a8k.service.appctrl.action.base.A8kStepAction;

2
src/main/java/a8k/service/appctrl/action/DO_STOP.java → src/main/java/a8k/service/appctrl/action/ctrl/DO_STOP.java

@ -1,4 +1,4 @@
package a8k.service.appctrl.action;
package a8k.service.appctrl.action.ctrl;
import a8k.service.appctrl.action.base.A8kActionStepType; import a8k.service.appctrl.action.base.A8kActionStepType;
import a8k.service.appctrl.action.base.A8kStepAction; import a8k.service.appctrl.action.base.A8kStepAction;

27
src/main/java/a8k/service/appctrl/action/mainflow/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java

@ -5,6 +5,7 @@ import a8k.baseservice.appeventbus.appevent.AppWarningNotifyEvent;
import a8k.hardware.A8kCanBusService; import a8k.hardware.A8kCanBusService;
import a8k.hardware.type.a8kcanprotocol.A8kEcode; import a8k.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.hardware.type.a8kcanprotocol.IOId; import a8k.hardware.type.a8kcanprotocol.IOId;
import a8k.service.appctrl.CondtionMgrService;
import a8k.service.appdata.AppSampleRecordMgrService; import a8k.service.appdata.AppSampleRecordMgrService;
import a8k.service.appctrl.AppTubeSettingMgrService; import a8k.service.appctrl.AppTubeSettingMgrService;
import a8k.service.appctrl.action.base.A8kActionStepType; import a8k.service.appctrl.action.base.A8kActionStepType;
@ -64,6 +65,8 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction {
@Resource @Resource
GStateService gstate; GStateService gstate;
@Resource @Resource
CondtionMgrService cmgr;
@Resource
SampleScanTransportCtrl stc; SampleScanTransportCtrl stc;
@Resource @Resource
AppEventBusService ebus; AppEventBusService ebus;
@ -74,14 +77,6 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction {
@Resource @Resource
TubeProcessContextMgrService tubeProcessContextMgrService; TubeProcessContextMgrService tubeProcessContextMgrService;
MainFlowCtrlState mfcs;
@PostConstruct
void init() {
mfcs = gstate.mainFlowCtrlState;
}
SampleScanResult scanTubeHodler() throws AppException { SampleScanResult scanTubeHodler() throws AppException {
SampleScanResult result = new SampleScanResult(); SampleScanResult result = new SampleScanResult();
@ -225,13 +220,7 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction {
} }
@Override public Boolean checkCondition() { @Override public Boolean checkCondition() {
//处于工作状态
Boolean cond1 = gstate.isWorking();
//试管架处于空闲状态
Boolean cond2 = gstate.getTubeHolder().state.equals(TubeHolderState.IDLE);
//入料通道是否为空
Boolean cond3 = getTubeholderEnterPosPPS();
return cond1 && cond2 && cond3;
return cmgr.isTimeToEnterNewTubeHolder();
} }
@Override public List<A8kPublicResourceType> getResourceList() { @Override public List<A8kPublicResourceType> getResourceList() {
@ -265,13 +254,5 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction {
tryUpdateGroupId = true; tryUpdateGroupId = true;
} }
Boolean getTubeholderEnterPosPPS() { //入料通道是否为空
try {
return canBus.getIOState(IOId.InfeedPPS);
} catch (AppException e) {
logger.error("getTubeholderEnterPosPPS error", e);
return false;
}
}
} }

16
src/main/java/a8k/service/appctrl/action/mainflow/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java

@ -1,9 +1,11 @@
package a8k.service.appctrl.action.mainflow; package a8k.service.appctrl.action.mainflow;
import a8k.service.appctrl.CondtionMgrService;
import a8k.service.appctrl.action.base.A8kActionStepType; import a8k.service.appctrl.action.base.A8kActionStepType;
import a8k.service.appctrl.action.base.A8kStepAction; import a8k.service.appctrl.action.base.A8kStepAction;
import a8k.service.appstate.*; import a8k.service.appstate.*;
import a8k.service.appstate.resource.A8kPublicResourceType; import a8k.service.appstate.resource.A8kPublicResourceType;
import a8k.service.appstate.type.MainFlowCtrlState;
import a8k.service.appstate.type.TubeHolder; import a8k.service.appstate.type.TubeHolder;
import a8k.service.appstate.type.Tube; import a8k.service.appstate.type.Tube;
import a8k.service.appstate.type.state.TubeState; import a8k.service.appstate.type.state.TubeState;
@ -38,9 +40,15 @@ public class SEQ2_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction {
SampleScanTransportCtrl sstc; SampleScanTransportCtrl sstc;
@Resource @Resource
TubeProcessStateMgrService tubeProcessStateMgrService; TubeProcessStateMgrService tubeProcessStateMgrService;
@Resource
CondtionMgrService cms;
MainFlowCtrlState state;
@PostConstruct @PostConstruct
void init() { void init() {
state = gstate.mainFlowCtrlState;
} }
int moveToNextTube() { int moveToNextTube() {
@ -89,13 +97,7 @@ public class SEQ2_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction {
} }
@Override public Boolean checkCondition() { @Override public Boolean checkCondition() {
//当前正在工作
Boolean cond1 = gstate.isWorking();
//没有试管在处理 或者 当前试管处理完成
Boolean cond2 = gstate.getCurProcessingTube() == null || gstate.getCurProcessingTube().state.equals(TubeState.PROCESS_COMPLETE);
//急诊有待处理的试管或者试管架正在处理
Boolean cond3 = gstate.getTubeHolder().isHasTubeToBeProcessed() || gstate.getEmergencyTubePos().tube.state.equals(TubeState.TO_BE_PROCESSED);
return cond1 && cond2 && cond3;
return cms.isTimeToSwitchNextTube();
} }
@Override public List<A8kPublicResourceType> getResourceList() { @Override public List<A8kPublicResourceType> getResourceList() {

22
src/main/java/a8k/service/appctrl/action/mainflow/SEQ3_APPLAY_RESOURCE.java

@ -2,13 +2,14 @@ package a8k.service.appctrl.action.mainflow;
import a8k.baseservice.AppExceptionBuilder; import a8k.baseservice.AppExceptionBuilder;
import a8k.hardware.type.a8kcanprotocol.A8kEcode; import a8k.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.service.appctrl.CondtionMgrService;
import a8k.service.appdata.AppProjInfoMgrService; import a8k.service.appdata.AppProjInfoMgrService;
import a8k.service.appctrl.action.base.A8kActionStepType; import a8k.service.appctrl.action.base.A8kActionStepType;
import a8k.service.appctrl.action.base.A8kStepAction; import a8k.service.appctrl.action.base.A8kStepAction;
import a8k.service.appstate.*; import a8k.service.appstate.*;
import a8k.service.appstate.resource.A8kPublicResourceType; import a8k.service.appstate.resource.A8kPublicResourceType;
import a8k.service.appstate.type.MainFlowCtrlState;
import a8k.service.appstate.type.Tube; import a8k.service.appstate.type.Tube;
import a8k.service.appstate.type.state.TubeState;
import a8k.type.Consumable; import a8k.type.Consumable;
import a8k.type.IncubatorPos; import a8k.type.IncubatorPos;
import a8k.type.TipPos; import a8k.type.TipPos;
@ -51,10 +52,15 @@ public class SEQ3_APPLAY_RESOURCE extends A8kStepAction {
AppProjInfoMgrService appProjInfoMgrService; //项目信息管理 AppProjInfoMgrService appProjInfoMgrService; //项目信息管理
@Resource @Resource
TubeProcessStateMgrService tubeProcessStateMgrService; //试管处理状态管理 TubeProcessStateMgrService tubeProcessStateMgrService; //试管处理状态管理
@Resource
CondtionMgrService cms;
MainFlowCtrlState state;
@PostConstruct @PostConstruct
void init() { void init() {
state = gstate.mainFlowCtrlState;
} }
@Override public void doaction() throws AppException { @Override public void doaction() throws AppException {
@ -106,22 +112,12 @@ public class SEQ3_APPLAY_RESOURCE extends A8kStepAction {
tipPos.add(tips); tipPos.add(tips);
} }
//创建项目处理上下文 //创建项目处理上下文
tubeProcessStateMgrService.startProcessTube(a8kIdCardInfo, consumables, tipPos, incubatorPoss);
tubeProcessStateMgrService.setTubeResourceIsReady(a8kIdCardInfo, consumables, tipPos, incubatorPoss);
logger.info("apply resource ok"); logger.info("apply resource ok");
} }
@Override public Boolean checkCondition() { @Override public Boolean checkCondition() {
Tube tube = gstate.getCurProcessingTube();
if (tube == null)
return false;
//当前正在工作
Boolean cond1 = gstate.isWorking();
//没有试管在处理 或者 当前试管处理完成
Boolean cond2 = tube.state.equals(TubeState.PENDING);
//急诊有待处理的试管或者试管架正在处理
Boolean cond3 = incubationPlateMgrService.isHasEnoughIncubationIDLEPos(tube.projIndex.size());
return cond1 && cond2 && cond3;
return cms.isTimeToProcessPendingTube();
} }
@Override public List<A8kPublicResourceType> getResourceList() { @Override public List<A8kPublicResourceType> getResourceList() {

156
src/main/java/a8k/service/appctrl/action/mainflow/SEQ4_PRE_PROCESS.java

@ -1,22 +1,24 @@
package a8k.service.appctrl.action.mainflow; package a8k.service.appctrl.action.mainflow;
import a8k.OS; import a8k.OS;
import a8k.service.appctrl.CondtionMgrService;
import a8k.service.appdata.AppProjInfoMgrService; import a8k.service.appdata.AppProjInfoMgrService;
import a8k.baseservice.AppExceptionBuilder; import a8k.baseservice.AppExceptionBuilder;
import a8k.baseservice.appeventbus.AppEventBusService; import a8k.baseservice.appeventbus.AppEventBusService;
import a8k.service.appctrl.action.base.A8kActionStepType; import a8k.service.appctrl.action.base.A8kActionStepType;
import a8k.service.appctrl.action.base.A8kStepAction; import a8k.service.appctrl.action.base.A8kStepAction;
import a8k.service.appstate.ConsumablesMgrService;
import a8k.service.appstate.GStateService;
import a8k.service.appstate.IncubationPlateMgrService;
import a8k.service.appstate.TubeProcessContextMgrService;
import a8k.service.appstate.*;
import a8k.service.appstate.resource.A8kPublicResourceType; import a8k.service.appstate.resource.A8kPublicResourceType;
import a8k.service.appstate.type.MainFlowCtrlState;
import a8k.service.appstate.type.Tube;
import a8k.service.appstate.type.state.TubeState; import a8k.service.appstate.type.state.TubeState;
import a8k.service.devicedriver.ctrl.HbotControlService; import a8k.service.devicedriver.ctrl.HbotControlService;
import a8k.service.devicedriver.ctrl.ReactionPlatesTransmitCtrl; import a8k.service.devicedriver.ctrl.ReactionPlatesTransmitCtrl;
import a8k.service.devicedriver.ctrl.SampleScanTransportCtrl; import a8k.service.devicedriver.ctrl.SampleScanTransportCtrl;
import a8k.service.devicedriver.ctrl.SamplesPreProcesCtrl; import a8k.service.devicedriver.ctrl.SamplesPreProcesCtrl;
import a8k.type.ecode.AppError;
import a8k.type.exception.AppException; import a8k.type.exception.AppException;
import a8k.utils.ZFnCall;
import jakarta.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -24,6 +26,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.concurrent.*; import java.util.concurrent.*;
/** /**
@ -50,8 +53,6 @@ public class SEQ4_PRE_PROCESS extends A8kStepAction {
@Resource @Resource
ConsumablesMgrService consumablesMgrService; ConsumablesMgrService consumablesMgrService;
@Resource
IncubationPlateMgrService incubationPlateMgrService;
@Resource @Resource
AppProjInfoMgrService appProjInfoMgrService; AppProjInfoMgrService appProjInfoMgrService;
@ -74,6 +75,15 @@ public class SEQ4_PRE_PROCESS extends A8kStepAction {
@Resource @Resource
HbotControlService hbotControlService; HbotControlService hbotControlService;
@Resource
TubeProcessStateMgrService tubeProcessStateMgrService;
@Resource
IncubationPlateMgrService incubationPlateMgrService;
@Resource
CondtionMgrService cms;
ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 3, 0, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(10)); ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 3, 0, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(10));
@ -81,12 +91,16 @@ public class SEQ4_PRE_PROCESS extends A8kStepAction {
void init() { void init() {
} }
/** /**
* 推出反应板夹 * 推出反应板夹
* @throws AppException 异常 * @throws AppException 异常
*/ */
void prepareReactionPlate() throws AppException { void prepareReactionPlate() throws AppException {
if (gstate.debugMode) {
logger.info("prepareReactionPlate");
OS.forceSleep(1000);
return;
}
// Tube tube = gstate.getCurProcessingTube(); // Tube tube = gstate.getCurProcessingTube();
// List<Integer> projIndex = tube.projIndex; // List<Integer> projIndex = tube.projIndex;
// List<IncubatorPos> incubatorPos = tube.incubatorPos; // List<IncubatorPos> incubatorPos = tube.incubatorPos;
@ -97,6 +111,7 @@ public class SEQ4_PRE_PROCESS extends A8kStepAction {
// reactionPlatesTransmitCtrl.pushPlate(bindConsumablesCh.get(i), incubatorPos.get(i)); // reactionPlatesTransmitCtrl.pushPlate(bindConsumablesCh.get(i), incubatorPos.get(i));
// tank.state = IncubationSubTankState.WAITING_FOR_DROP; // tank.state = IncubationSubTankState.WAITING_FOR_DROP;
// } // }
} }
/** /**
@ -104,6 +119,12 @@ public class SEQ4_PRE_PROCESS extends A8kStepAction {
* @throws AppException * @throws AppException
*/ */
void shakeAndTakeCap() throws AppException { void shakeAndTakeCap() throws AppException {
if (gstate.debugMode) {
logger.info("shakeAndTakeCap");
OS.forceSleep(1000);
return;
}
// Tube tube = gstate.getCurProcessingTube(); // Tube tube = gstate.getCurProcessingTube();
// if (tube.isEmergency) { // if (tube.isEmergency) {
// //如果事急诊位则什么也不做 // //如果事急诊位则什么也不做
@ -120,9 +141,15 @@ public class SEQ4_PRE_PROCESS extends A8kStepAction {
// samplesPreProcesCtrl.takeTubeAndJudgeTubeExist(tube.isHighTube); // samplesPreProcesCtrl.takeTubeAndJudgeTubeExist(tube.isHighTube);
// samplesPreProcesCtrl.shakeTube(45, 5); // samplesPreProcesCtrl.shakeTube(45, 5);
// samplesPreProcesCtrl.takeTubeCap(); // samplesPreProcesCtrl.takeTubeCap();
OS.forceSleep(1000);
} }
void hbotPrepareTip() throws AppException { void hbotPrepareTip() throws AppException {
if (gstate.debugMode) {
logger.info("hbotPrepareTip");
OS.forceSleep(1000);
return;
}
// Tube tube = gstate.getCurProcessingTube(); // Tube tube = gstate.getCurProcessingTube();
// // hbotControlService.takeTip(); // // hbotControlService.takeTip();
// TipPos tippos = consumablesMgrService.takeNextTipPosAndSetUsed(); // TipPos tippos = consumablesMgrService.takeNextTipPosAndSetUsed();
@ -138,66 +165,9 @@ public class SEQ4_PRE_PROCESS extends A8kStepAction {
// } // }
// //
// logger.info("takeTip success"); // logger.info("takeTip success");
OS.forceSleep(1000);
} }
// @Override public void doaction() throws AppException {
// Tube tube = gstate.getCurProcessingTube();
// //构建样本和耗材绑定关系
// List<ConsumableGroup> bindConsumableCH = new ArrayList<>();
// List<Integer> consumablePosIndexList = new ArrayList<>();
// List<IncubatorPos> incubatorPosList = new ArrayList<>();
// for (Integer projIndex : tube.projIndex) {
// ConsumableGroup chNum = consumablesMgrService.getChannelNumByProjIndex(projIndex);
// Integer consumablePosIndex = consumablesMgrService.allocConsumable(chNum);
//
//
// if (chNum == null) {
// logger.error("apply consumable failed, projIndex:{}", projIndex);
// throw ebuilder.buildAppCodeErrorException("预处理阶段,申请耗材失败");
// }
// if (consumablePosIndex == null) {
// logger.error("alloc consumable failed, projIndex:{}", projIndex);
// throw ebuilder.buildAppCodeErrorException("预处理阶段,申请耗材失败x");
// }
// bindConsumableCH.add(chNum);
// consumablePosIndexList.add(consumablePosIndex);
// incubatorPosList = gstate.getIncubationPlate().getEmptyPosList(tube.projIndex.size());
// }
// tube.bindConsumablesCh = bindConsumableCH;
// tube.consumablePos = consumablePosIndexList;
// tube.incubatorPos = incubatorPosList;
//
// tubeProcessContextMgrService.updateTubeContext(tube);//更新样本上下文
//
// //检测反应板是否有空位
// if (gstate.getIncubationPlate().getEmptyPosNum() < tube.projIndex.size()) {
// throw ebuilder.buildAppCodeErrorException("预处理阶段,反应板空位不足");
// }
//
// //准备反应板夹
// var doPrepareReactionPlateFuture = executor.submit(() -> ZFnCall.callfn(this::prepareReactionPlate));
// //摇匀并取盖
// var doShakeAndTakeCapFuture = executor.submit(() -> ZFnCall.callfn(this::shakeAndTakeCap));
// //准备Hbot Tip
// var doHbotPrepareTipFuture = executor.submit(() -> ZFnCall.callfn(this::hbotPrepareTip));
//
// wait(doPrepareReactionPlateFuture);
// wait(doShakeAndTakeCapFuture);
// wait(doHbotPrepareTipFuture);
//
// List<AppError> errors = new java.util.ArrayList<>(List.of());
// try {
// errors.add(doPrepareReactionPlateFuture.get());
// errors.add(doShakeAndTakeCapFuture.get());
// errors.add(doHbotPrepareTipFuture.get());
// } catch (InterruptedException | ExecutionException ignored) {
// }
// errors.removeIf(Objects::isNull);
// if (!errors.isEmpty()) {
// throw ebuilder.buildMutiErrorAppException(errors);
// }
// }
@Override public void doaction() throws AppException { @Override public void doaction() throws AppException {
// //
// 1.准备3份反应板夹 // 1.准备3份反应板夹
@ -205,44 +175,46 @@ public class SEQ4_PRE_PROCESS extends A8kStepAction {
// 3.摇匀脱帽 // 3.摇匀脱帽
// //
Tube tube = gstate.getCurProcessingTube();
//准备反应板夹
var doPrepareReactionPlateFuture = executor.submit(() -> ZFnCall.callfn(this::prepareReactionPlate));
//摇匀并取盖
var doShakeAndTakeCapFuture = executor.submit(() -> ZFnCall.callfn(this::shakeAndTakeCap));
//准备Hbot Tip
var doHbotPrepareTipFuture = executor.submit(() -> ZFnCall.callfn(this::hbotPrepareTip));
wait(doPrepareReactionPlateFuture);
wait(doShakeAndTakeCapFuture);
wait(doHbotPrepareTipFuture);
List<AppError> errors = new java.util.ArrayList<>(List.of());
try {
errors.add(doPrepareReactionPlateFuture.get());
errors.add(doShakeAndTakeCapFuture.get());
errors.add(doHbotPrepareTipFuture.get());
} catch (InterruptedException | ExecutionException ignored) {
}
errors.removeIf(Objects::isNull);
if (!errors.isEmpty()) {
throw ebuilder.buildMutiErrorAppException(errors);
}
// List<TipPos> tipPos
// consumablesMgrService.getChannelNumByProjIndex(projIndex);
//
// 计算需要执行的动作
//
//
// 执行动作
//
//
// 赋值状态
//
//
// 恢复状态
//
tubeProcessStateMgrService.setCurTubeState(TubeState.PRE_PROCESSED);
incubationPlateMgrService.waitingForDrop(tube);
logger.info("pre process success");
} }
@Override public Boolean checkCondition() { @Override public Boolean checkCondition() {
//当前正在工作
Boolean cond1 = gstate.isWorking();
//有需要进行预处理的样本
Boolean cond2 = gstate.getCurProcessingTube() != null && gstate.getCurProcessingTube().state.equals(TubeState.PRE_PROCESSING);
return cond1 && cond2;
return cms.isTimeToPreProcessTube();
} }
@Override public List<A8kPublicResourceType> getResourceList() { @Override public List<A8kPublicResourceType> getResourceList() {
return List.of( return List.of(
A8kPublicResourceType.IncubationPlateMotor, A8kPublicResourceType.IncubationPlateMotor,
A8kPublicResourceType.PlatesBoxMotor, A8kPublicResourceType.PlatesBoxMotor,
A8kPublicResourceType.HBOT
A8kPublicResourceType.HBOT,
A8kPublicResourceType.CurTubeProcessToken
); );
} }

96
src/main/java/a8k/service/appctrl/action/mainflow/SEQ5_PROCESS.java

@ -0,0 +1,96 @@
package a8k.service.appctrl.action.mainflow;
import a8k.OS;
import a8k.baseservice.AppExceptionBuilder;
import a8k.service.appctrl.CondtionMgrService;
import a8k.service.appctrl.action.base.A8kActionStepType;
import a8k.service.appctrl.action.base.A8kStepAction;
import a8k.service.appstate.*;
import a8k.service.appstate.resource.A8kPublicResourceType;
import a8k.service.appstate.type.MainFlowCtrlState;
import a8k.service.appstate.type.Tube;
import a8k.service.appstate.type.state.TubeState;
import a8k.type.exception.AppException;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.concurrent.*;
/**
*
* 核对物料资源是否足够
* TUBE
* TO_BE_PROCESSED --> PRE_PROCESSING
*/
@Component
public class SEQ5_PROCESS extends A8kStepAction {
static Logger logger = LoggerFactory.getLogger(SEQ5_PROCESS.class);
SEQ5_PROCESS() {
super(A8kActionStepType.SEQ5_PROCESS);
}
@Resource
GStateService gstate;
@Resource
AppExceptionBuilder ebuilder;
@Resource
TubeProcessStateMgrService tubeProcessStateMgrService;
@Resource
IncubationPlateMgrService incubationPlateMgrService;
@Resource
CondtionMgrService cms;
MainFlowCtrlState state;
@PostConstruct
void init() {
state = gstate.mainFlowCtrlState;
}
@Override public void doaction() throws AppException {
//
// 1.准备3份反应板夹
// 2.取tip头
// 3.摇匀脱帽
//
tubeProcessStateMgrService.setCurTubeState(TubeState.PROCESSING);
Tube tube = gstate.getCurProcessingTube();
OS.forceSleep(3000);
tubeProcessStateMgrService.setCurTubeState(TubeState.PROCESSED);
incubationPlateMgrService.startIncubating(tube);
logger.info("pre process success");
}
@Override public Boolean checkCondition() {
return cms.isTimeToProcessTube();
}
@Override public List<A8kPublicResourceType> getResourceList() {
return List.of(
A8kPublicResourceType.IncubationPlateMotor,
A8kPublicResourceType.HBOT,
A8kPublicResourceType.CurTubeProcessToken
);
}
//
// UTILS
//
void wait(Future<?> future) {
while (!future.isDone()) {
OS.forceSleep(100);
}
}
}

95
src/main/java/a8k/service/appctrl/action/mainflow/SEQ6_POST_PROCESS.java

@ -0,0 +1,95 @@
package a8k.service.appctrl.action.mainflow;
import a8k.OS;
import a8k.baseservice.AppExceptionBuilder;
import a8k.service.appctrl.CondtionMgrService;
import a8k.service.appctrl.action.base.A8kActionStepType;
import a8k.service.appctrl.action.base.A8kStepAction;
import a8k.service.appstate.*;
import a8k.service.appstate.resource.A8kPublicResourceType;
import a8k.service.appstate.type.MainFlowCtrlState;
import a8k.service.appstate.type.Tube;
import a8k.service.appstate.type.state.TubeState;
import a8k.type.ecode.AppError;
import a8k.type.exception.AppException;
import a8k.utils.ZFnCall;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.*;
/**
*
* 核对物料资源是否足够
* TUBE
* TO_BE_PROCESSED --> PRE_PROCESSING
*/
@Component
public class SEQ6_POST_PROCESS extends A8kStepAction {
static Logger logger = LoggerFactory.getLogger(SEQ6_POST_PROCESS.class);
SEQ6_POST_PROCESS() {
super(A8kActionStepType.SEQ6_POST_PROCESS);
}
@Resource
GStateService gstate;
@Resource
AppExceptionBuilder ebuilder;
@Resource
TubeProcessStateMgrService tubeProcessStateMgrService;
@Resource
IncubationPlateMgrService incubationPlateMgrService;
@Resource
CondtionMgrService cms;
ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 3, 0, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(10));
MainFlowCtrlState state;
@PostConstruct
void init() {
state = gstate.mainFlowCtrlState;
}
@Override public void doaction() throws AppException {
tubeProcessStateMgrService.setCurTubeState(TubeState.POST_PROCESSING);
Tube tube = gstate.getCurProcessingTube();
OS.forceSleep(3000);
tubeProcessStateMgrService.setCurTubeState(TubeState.POST_PROCESSED);
}
@Override public Boolean checkCondition() {
return cms.isTimeToPostProcessTube();
}
@Override public List<A8kPublicResourceType> getResourceList() {
return List.of(
A8kPublicResourceType.IncubationPlateMotor,
A8kPublicResourceType.PlatesBoxMotor,
A8kPublicResourceType.HBOT,
A8kPublicResourceType.CurTubeProcessToken
);
}
//
// UTILS
//
void wait(Future<?> future) {
while (!future.isDone()) {
OS.forceSleep(100);
}
}
}

19
src/main/java/a8k/service/appctrl/action/mainflow/DO_EJECT_TUBEHOLDER.java → src/main/java/a8k/service/appctrl/action/mainflow/SEQ7_EJECT_TUBEHOLDER.java

@ -1,5 +1,6 @@
package a8k.service.appctrl.action.mainflow; package a8k.service.appctrl.action.mainflow;
import a8k.service.appctrl.CondtionMgrService;
import a8k.service.appctrl.action.base.A8kActionStepType; import a8k.service.appctrl.action.base.A8kActionStepType;
import a8k.service.appctrl.action.base.A8kStepAction; import a8k.service.appctrl.action.base.A8kStepAction;
import a8k.service.appstate.GStateService; import a8k.service.appstate.GStateService;
@ -18,11 +19,11 @@ import org.springframework.stereotype.Component;
import java.util.List; import java.util.List;
@Component @Component
public class DO_EJECT_TUBEHOLDER extends A8kStepAction {
static Logger logger = LoggerFactory.getLogger(DO_EJECT_TUBEHOLDER.class);
public class SEQ7_EJECT_TUBEHOLDER extends A8kStepAction {
static Logger logger = LoggerFactory.getLogger(SEQ7_EJECT_TUBEHOLDER.class);
DO_EJECT_TUBEHOLDER() {
super(A8kActionStepType.DO_EJECT_TUBEHOLDER);
SEQ7_EJECT_TUBEHOLDER() {
super(A8kActionStepType.SEQ7_EJECT_TUBEHOLDER);
} }
@Resource @Resource
@ -30,12 +31,14 @@ public class DO_EJECT_TUBEHOLDER extends A8kStepAction {
@Resource @Resource
SampleScanTransportCtrl stc; SampleScanTransportCtrl stc;
MainFlowCtrlState mfcs;
MainFlowCtrlState state;
@Resource
CondtionMgrService cms;
@PostConstruct @PostConstruct
void init() { void init() {
mfcs = gstate.mainFlowCtrlState;
state = gstate.mainFlowCtrlState;
} }
@Override public void doaction() throws AppException { @Override public void doaction() throws AppException {
@ -46,9 +49,9 @@ public class DO_EJECT_TUBEHOLDER extends A8kStepAction {
@Override public Boolean checkCondition() { @Override public Boolean checkCondition() {
//处于工作状态试管架已经处于空闲状态入料光电被触发 //处于工作状态试管架已经处于空闲状态入料光电被触发
Boolean cond1 = mfcs.workState.equals(A8kWorkState.WORKING);
Boolean cond1 = cms.isCanDoAction();
Boolean cond2 = gstate.getTubeHolder().state.equals(TubeHolderState.PROCESSING); Boolean cond2 = gstate.getTubeHolder().state.equals(TubeHolderState.PROCESSING);
Boolean cond3 = !gstate.getTubeHolder().isHasTubeToBeProcessed();
Boolean cond3 = cms.isNoMoreTubeToBeProcessed();
return cond1 & cond2 & cond3; return cond1 & cond2 & cond3;
} }

7
src/main/java/a8k/service/appctrl/scheduler/MainFlowCtrlScheduler.java

@ -60,8 +60,6 @@ public class MainFlowCtrlScheduler {
A8kEcodePostProcesser ecodePostProcesser; A8kEcodePostProcesser ecodePostProcesser;
A8kEcodeClearProcesser ecodeClearProcesser; A8kEcodeClearProcesser ecodeClearProcesser;
Boolean clearErrorPendingFlag = false; //清除错误请求标志
List<A8kStepAction> stepActionList = new ArrayList<>(); List<A8kStepAction> stepActionList = new ArrayList<>();
@PostConstruct @PostConstruct
@ -270,11 +268,6 @@ public class MainFlowCtrlScheduler {
while (workThread.isAlive()) { while (workThread.isAlive()) {
if (state.fatalErrorFlag) { if (state.fatalErrorFlag) {
OS.forceSleep(800); OS.forceSleep(800);
} else if (clearErrorPendingFlag) {
clearError();
OS.forceSleep(800);
} else if (state.errorFlag) {
OS.forceSleep(800);
} else { } else {
doActions(guessWhatToDo()); doActions(guessWhatToDo());
OS.forceSleep(800); OS.forceSleep(800);

2
src/main/java/a8k/service/appstate/GStateService.java

@ -44,6 +44,8 @@ public class GStateService {
//当前正在处理的试管 //当前正在处理的试管
Tube curProcessingTube = null; Tube curProcessingTube = null;
public Boolean debugMode = true;
//主流程控制状态 //主流程控制状态
public MainFlowCtrlState mainFlowCtrlState = new MainFlowCtrlState(); public MainFlowCtrlState mainFlowCtrlState = new MainFlowCtrlState();

29
src/main/java/a8k/service/appstate/IncubationPlateMgrService.java

@ -4,6 +4,8 @@ import a8k.controler.extapi.pagecontrol.ExtApiTabConfig;
import a8k.controler.extapi.utils.ExtApiTab; import a8k.controler.extapi.utils.ExtApiTab;
import a8k.hardware.type.a8kcanprotocol.A8kEcode; import a8k.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.service.appstate.type.IncubationSubTank; import a8k.service.appstate.type.IncubationSubTank;
import a8k.service.appstate.type.ProjProcessContext;
import a8k.service.appstate.type.Tube;
import a8k.service.appstate.type.state.IncubationSubTankState; import a8k.service.appstate.type.state.IncubationSubTankState;
import a8k.type.IncubatorPos; import a8k.type.IncubatorPos;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
@ -55,6 +57,7 @@ public class IncubationPlateMgrService {
return ret; return ret;
} }
synchronized public void setIncubationPlateState(IncubatorPos pos, IncubationSubTankState state) { synchronized public void setIncubationPlateState(IncubatorPos pos, IncubationSubTankState state) {
var incubationState = gstate.getIncubationPlate(); var incubationState = gstate.getIncubationPlate();
var subtanks = incubationState.subtanks; var subtanks = incubationState.subtanks;
@ -73,6 +76,32 @@ public class IncubationPlateMgrService {
} }
} }
synchronized public void waitingForDrop(Tube tube) {
var incubationState = gstate.getIncubationPlate();
var subtanks = incubationState.subtanks;
for (ProjProcessContext context : tube.projProcessContexts) {
subtanks[context.incubatorPos.off].state = IncubationSubTankState.WAITING_FOR_DROP;
subtanks[context.incubatorPos.off].projProcessContxt = context;
subtanks[context.incubatorPos.off].bloodType = tube.bloodType;
subtanks[context.incubatorPos.off].sampleBarcode = tube.sampleBarcode;
subtanks[context.incubatorPos.off].userid = tube.userid;
subtanks[context.incubatorPos.off].projIndex = context.projIndex;
subtanks[context.incubatorPos.off].projName = context.projName;
}
}
synchronized public void startIncubating(Tube tube){
var incubationState = gstate.getIncubationPlate();
var subtanks = incubationState.subtanks;
for (ProjProcessContext context : tube.projProcessContexts) {
subtanks[context.incubatorPos.off].state = IncubationSubTankState.INCUBATING;
}
}
synchronized public void setIncubationPlateStateError(IncubatorPos pos, A8kEcode ecode) { synchronized public void setIncubationPlateStateError(IncubatorPos pos, A8kEcode ecode) {
var incubationState = gstate.getIncubationPlate(); var incubationState = gstate.getIncubationPlate();
var subtanks = incubationState.subtanks; var subtanks = incubationState.subtanks;

6
src/main/java/a8k/service/appstate/TubeProcessContextMgrService.java

@ -122,9 +122,11 @@ public class TubeProcessContextMgrService {
} }
synchronized public void createProjProcessContext(@NotNull Tube tube, @NotNull A8kIdCardInfo idCardInfo,@NotNull Consumable consumable, @NotNull List<TipPos> tipPos, @NotNull IncubatorPos incubatorPos) {
synchronized public void createProjProcessContext(@NotNull Tube tube, @NotNull A8kIdCardInfo idCardInfo, @NotNull Consumable consumable, @NotNull List<TipPos> tipPos,
@NotNull IncubatorPos incubatorPos) {
ProjProcessContext context = new ProjProcessContext(); ProjProcessContext context = new ProjProcessContext();
context.projIndex = idCardInfo.projIndex; context.projIndex = idCardInfo.projIndex;
context.projName = idCardInfo.projName;
context.a8kIdCardInfo = idCardInfo; context.a8kIdCardInfo = idCardInfo;
context.consumable = consumable; context.consumable = consumable;
context.incubatorPos = incubatorPos; context.incubatorPos = incubatorPos;
@ -134,4 +136,6 @@ public class TubeProcessContextMgrService {
tube.projProcessContexts.add(context); tube.projProcessContexts.add(context);
} }
} }

7
src/main/java/a8k/service/appstate/TubeProcessStateMgrService.java

@ -20,20 +20,23 @@ public class TubeProcessStateMgrService {
@Resource @Resource
TubeProcessContextMgrService tubeProcessContextMgrService; TubeProcessContextMgrService tubeProcessContextMgrService;
synchronized public void setCurTubeState(TubeState state) { synchronized public void setCurTubeState(TubeState state) {
Tube tube = gstate.getCurProcessingTube(); Tube tube = gstate.getCurProcessingTube();
assert tube != null; assert tube != null;
tube.state = state; tube.state = state;
} }
synchronized public void startProcessTube(@NotNull List<A8kIdCardInfo> idCardInfo, @NotNull List<Consumable> consumable, @NotNull List<List<TipPos>> tipPos,
synchronized public void setTubeResourceIsReady(@NotNull List<A8kIdCardInfo> idCardInfo, @NotNull List<Consumable> consumable, @NotNull List<List<TipPos>> tipPos,
@NotNull List<IncubatorPos> incubatorPos) { @NotNull List<IncubatorPos> incubatorPos) {
Tube tube = gstate.getCurProcessingTube(); Tube tube = gstate.getCurProcessingTube();
assert tube != null; assert tube != null;
for (int i = 0; i < tube.projIndex.size(); i++) { for (int i = 0; i < tube.projIndex.size(); i++) {
tubeProcessContextMgrService.createProjProcessContext(tube, idCardInfo.get(i), consumable.get(i), tipPos.get(i), incubatorPos.get(i)); tubeProcessContextMgrService.createProjProcessContext(tube, idCardInfo.get(i), consumable.get(i), tipPos.get(i), incubatorPos.get(i));
} }
tube.state = TubeState.PRE_PROCESSING;
tube.state = TubeState.RESOURCE_IS_READY;
} }
synchronized public void pendingTube(Tube tube) { synchronized public void pendingTube(Tube tube) {

3
src/main/java/a8k/service/appstate/type/IncubationSubTank.java

@ -21,6 +21,9 @@ public class IncubationSubTank {
public Integer projIndex = 0; //项目代码 public Integer projIndex = 0; //项目代码
public String projName = ""; //项目名称 public String projName = ""; //项目名称
//
public ProjProcessContext projProcessContxt;
//孵育时间 //孵育时间
public Date startIncubatedTime; //开始孵育时间 public Date startIncubatedTime; //开始孵育时间
public Integer targetIncubatedTimeS; //目标孵育时间 public Integer targetIncubatedTimeS; //目标孵育时间

1
src/main/java/a8k/service/appstate/type/ProjProcessContext.java

@ -12,6 +12,7 @@ public class ProjProcessContext {
public String sampleId; //样本ID-系统生成-唯一标识一个样本 public String sampleId; //样本ID-系统生成-唯一标识一个样本
public Integer projIndex;//项目代码 public Integer projIndex;//项目代码
public String projName;
public A8kIdCardInfo a8kIdCardInfo;//a8k卡信息 public A8kIdCardInfo a8kIdCardInfo;//a8k卡信息
public Consumable consumable;//耗材绑定的通道号 public Consumable consumable;//耗材绑定的通道号
public IncubatorPos incubatorPos;//孵育位置 public IncubatorPos incubatorPos;//孵育位置

3
src/main/java/a8k/service/appstate/type/Tube.java

@ -19,10 +19,11 @@ public class Tube {
public String sampleBarcode = ""; //用于请求用户信息的条码ID public String sampleBarcode = ""; //用于请求用户信息的条码ID
public String userid = ""; //用户输入的样本ID不做逻辑只做展示 public String userid = ""; //用户输入的样本ID不做逻辑只做展示
public List<Integer> projIndex = new ArrayList<>(); //项目代码 public List<Integer> projIndex = new ArrayList<>(); //项目代码
public List<String> projName = new ArrayList<>(); //项目名称
// //
public TubeState state = TubeState.EMPTY; //样本被处理的状态 public TubeState state = TubeState.EMPTY; //样本被处理的状态
public List<ProjProcessContext> projProcessContexts; public List<ProjProcessContext> projProcessContexts;
public A8kEcode ecode = null;
public A8kEcode ecode = null;
} }

1
src/main/java/a8k/service/appstate/type/state/TubeState.java

@ -7,6 +7,7 @@ public enum TubeState {
EMPTY,// EMPTY,//
TO_BE_PROCESSED,//待处理 TO_BE_PROCESSED,//待处理
PENDING,//挂起的试管即下一个被处理的试管 PENDING,//挂起的试管即下一个被处理的试管
RESOURCE_IS_READY,//资源准备好
PRE_PROCESSING, //预处理 PRE_PROCESSING, //预处理
PRE_PROCESSED, //预处理结束 PRE_PROCESSED, //预处理结束
PROCESSING,//处理 PROCESSING,//处理

Loading…
Cancel
Save