Browse Source

update

tags/v0
zhaohe 10 months ago
parent
commit
3814278319
  1. 8
      src/main/java/a8k/constant/AppConstant.java
  2. 10
      src/main/java/a8k/service/appctrl/AppDeviceCtrlService.java
  3. 76
      src/main/java/a8k/service/appctrl/MainFlowCtrlService.java
  4. 14
      src/main/java/a8k/service/appctrl/action/DO_PAUSE.java
  5. 46
      src/main/java/a8k/service/appctrl/action/DO_RESUME.java
  6. 17
      src/main/java/a8k/service/appctrl/action/DO_START.java
  7. 10
      src/main/java/a8k/service/appctrl/action/DO_STOP.java
  8. 6
      src/main/java/a8k/service/appctrl/action/base/A8kActionStepType.java
  9. 3
      src/main/java/a8k/service/appctrl/action/base/A8kStepAction.java
  10. 37
      src/main/java/a8k/service/appctrl/action/mainflow/SEQ3_PRE_PROCESS.java
  11. 19
      src/main/java/a8k/service/appctrl/scheduler/MainFlowCtrlScheduler.java
  12. 67
      src/main/java/a8k/service/appstate/ConsumablesMgrService.java
  13. 4
      src/main/java/a8k/service/appstate/GStateService.java
  14. 15
      src/main/java/a8k/service/appstate/TubeProcessContextMgrService.java
  15. 8
      src/main/java/a8k/service/appstate/type/MainFlowCtrlState.java
  16. 3
      src/main/java/a8k/service/appstate/type/ProjProcessContext.java
  17. 3
      src/main/java/a8k/type/Consumable.java
  18. 12
      src/main/java/a8k/utils/ZASSERT.java

8
src/main/java/a8k/constant/AppConstant.java

@ -0,0 +1,8 @@
package a8k.constant;
import a8k.type.Consumable;
public class AppConstant {
public static final int CONSUMABLE_NUM = 25;
public static final int TIP_NUM = 120;
}

10
src/main/java/a8k/service/appctrl/AppDeviceCtrlService.java

@ -51,24 +51,22 @@ public class AppDeviceCtrlService {
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
@ExtApiFn(name = "开始工作", group = "设备控制")
public void startWork() {
gstate.setWorkState(A8kWorkState.WORKING);
mainFlowCtrlSampleScanService.setClearErrorPendingFlag();
mainFlowCtrlSampleScanService.startWork();
}
@ExtApiFn(name = "停止工作", group = "设备控制")
public void stopWork() {
gstate.setWorkState(A8kWorkState.IDLE);
mainFlowCtrlSampleScanService.stopWork();
}
@ExtApiFn(name = "暂停工作", group = "设备控制")
public void pauseWork() {
gstate.setWorkState(A8kWorkState.PAUSE);
mainFlowCtrlSampleScanService.pauseWork();
}
@ExtApiFn(name = "继续工作", group = "设备控制")
public void continueWork() {
gstate.setWorkState(A8kWorkState.WORKING);
// mainFlowCtrlSampleScanService.setClearErrorPendingFlag();
mainFlowCtrlSampleScanService.continueWork();
}
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

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

@ -6,6 +6,8 @@ import a8k.service.appctrl.action.base.A8kStepAction;
import a8k.service.appctrl.scheduler.MainFlowCtrlScheduler;
import a8k.service.appctrl.type.A8kErrorContext;
import a8k.service.appstate.GStateService;
import a8k.service.appstate.type.MainFlowCtrlState;
import a8k.service.appstate.type.state.A8kWorkState;
import com.iflytop.a800.SpringBootBeanUtil;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
@ -39,6 +41,7 @@ public class MainFlowCtrlService {
scheduler.regClearErrorProcesser(this::clearErrorcodeBeforeContinueDo);
scheduler.regEcodePostProcesser(this::postPorcessA8kEcode);
scheduler.regCheckBeforeGuess(this::checkBeforeGuess);
logger.info("className {}", DO_STOP.class.getName());
@ -54,18 +57,42 @@ public class MainFlowCtrlService {
scheduler.startScheduler();
}
//
// EXT
//
public void setClearErrorPendingFlag() {
scheduler.setClearErrorPendingFlag();
void changeWorkState(A8kWorkState workState) {
MainFlowCtrlState state = gstate.getMainFlowCtrlState();
state.workStateChangeFlag = true;
state.lastWorkState = state.workState;
state.workState = workState;
}
public List<A8kStepAction> getA8kStepActionList() {
return scheduler.getA8kStepActionList();
}
void checkBeforeGuess() {
MainFlowCtrlState state = gstate.getMainFlowCtrlState();
if (state.startActionPending) {
if (state.workState != A8kWorkState.IDLE) {
state.startActionPending = false;
return;
}
changeWorkState(A8kWorkState.WORKING);
} else if (state.pauseActionPending) {
if (state.workState != A8kWorkState.WORKING) {
state.pauseActionPending = false;
return;
}
changeWorkState(A8kWorkState.PAUSE);
} else if (state.resumeActionPending) {
if (state.workState != A8kWorkState.PAUSE) {
state.resumeActionPending = false;
return;
}
changeWorkState(A8kWorkState.WORKING);
} else if (state.stopActionPending) {
if (state.workState == A8kWorkState.IDLE) {
state.stopActionPending = false;
return;
}
changeWorkState(A8kWorkState.IDLE);
}
}
void postPorcessA8kEcode(List<A8kErrorContext> ecodeList) {
}
@ -79,4 +106,35 @@ public class MainFlowCtrlService {
return true;
}
//
// EXT
//
public List<A8kStepAction> getA8kStepActionList() {
return scheduler.getA8kStepActionList();
}
public void startWork() {
MainFlowCtrlState state = gstate.getMainFlowCtrlState();
scheduler.setClearErrorPendingFlag();
state.startActionPending = true;
}
public void stopWork() {
MainFlowCtrlState state = gstate.getMainFlowCtrlState();
scheduler.setClearErrorPendingFlag();
state.stopActionPending = true;
}
public void pauseWork() {
MainFlowCtrlState state = gstate.getMainFlowCtrlState();
scheduler.setClearErrorPendingFlag();
state.pauseActionPending = true;
}
public void continueWork() {
MainFlowCtrlState state = gstate.getMainFlowCtrlState();
scheduler.setClearErrorPendingFlag();
state.resumeActionPending = true;
}
}

14
src/main/java/a8k/service/appctrl/action/DO_PAUSE.java

@ -5,6 +5,7 @@ import a8k.service.appctrl.action.base.A8kStepAction;
import a8k.service.appstate.GStateService;
import a8k.service.appstate.resource.A8kPublicResourceType;
import a8k.service.appstate.type.state.A8kWorkState;
import a8k.service.devicedriver.ctrl.SampleScanTransportCtrl;
import a8k.type.exception.AppException;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
@ -25,19 +26,22 @@ public class DO_PAUSE extends A8kStepAction {
@Resource
GStateService gstate;
@Resource
SampleScanTransportCtrl sampleScanTransportCtrl;
@PostConstruct
void init() {
}
@Override public void doaction() throws AppException {
gstate.mainFlowCtrlState.workState = A8kWorkState.PAUSE;
gstate.mainFlowCtrlState.workStateChangeFlag = false;
}
@Override public Boolean checkCondition() {
Boolean cond1 = !gstate.mainFlowCtrlState.workState.equals(gstate.getWorkState());
Boolean cond2 = gstate.getWorkState().equals(A8kWorkState.PAUSE);
return cond1 & cond2;
Boolean cond1 = gstate.mainFlowCtrlState.workStateChangeFlag;
Boolean cond2 = gstate.mainFlowCtrlState.lastWorkState.equals(A8kWorkState.WORKING);
Boolean cond3 = gstate.mainFlowCtrlState.workState.equals(A8kWorkState.PAUSE);
return cond1 & cond2 & cond3;
}
@Override public List<A8kPublicResourceType> getResourceList() {

46
src/main/java/a8k/service/appctrl/action/DO_RESUME.java

@ -0,0 +1,46 @@
package a8k.service.appctrl.action;
import a8k.service.appctrl.action.base.A8kActionStepType;
import a8k.service.appctrl.action.base.A8kStepAction;
import a8k.service.appstate.GStateService;
import a8k.service.appstate.resource.A8kPublicResourceType;
import a8k.service.appstate.type.state.A8kWorkState;
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;
@Component
public class DO_RESUME extends A8kStepAction {
static Logger logger = LoggerFactory.getLogger(DO_RESUME.class);
DO_RESUME() {
super(A8kActionStepType.DO_STOP);
}
@Resource
GStateService gstate;
@PostConstruct
void init() {
}
@Override public void doaction() throws AppException {
gstate.mainFlowCtrlState.workStateChangeFlag = false;
}
@Override public Boolean checkCondition() {
Boolean cond1 = gstate.mainFlowCtrlState.workStateChangeFlag;
Boolean cond2 = gstate.mainFlowCtrlState.lastWorkState.equals(A8kWorkState.PAUSE);
Boolean cond3 = gstate.mainFlowCtrlState.workState.equals(A8kWorkState.WORKING);
return cond1 & cond2 & cond3;
}
@Override public List<A8kPublicResourceType> getResourceList() {
return List.of();
}
}

17
src/main/java/a8k/service/appctrl/action/DO_START.java

@ -27,7 +27,7 @@ public class DO_START extends A8kStepAction {
GStateService gstate;
@Resource
SampleScanTransportCtrl sstc;
SampleScanTransportCtrl sampleScanTransportCtrl;
@PostConstruct
@ -37,18 +37,15 @@ public class DO_START extends A8kStepAction {
@Override public void doaction() throws AppException {
if (gstate.mainFlowCtrlState.workState.equals(A8kWorkState.IDLE)) {
sstc.ejectTubeHolder();
//TODO: 弹出所有反应板夹
}
gstate.mainFlowCtrlState.workState = A8kWorkState.WORKING;
gstate.mainFlowCtrlState.workStateChangeFlag = false;
sampleScanTransportCtrl.ejectTubeHolder();
}
@Override public Boolean checkCondition() {
Boolean cond1 = !gstate.mainFlowCtrlState.workState.equals(gstate.getWorkState());
Boolean cond2 = gstate.getWorkState().equals(A8kWorkState.WORKING);
return cond1 & cond2;
Boolean cond1 = gstate.mainFlowCtrlState.workStateChangeFlag;
Boolean cond2 = gstate.mainFlowCtrlState.lastWorkState.equals(A8kWorkState.IDLE);
Boolean cond3 = gstate.mainFlowCtrlState.workState.equals(A8kWorkState.WORKING);
return cond1 & cond2 & cond3;
}
@Override public List<A8kPublicResourceType> getResourceList() {

10
src/main/java/a8k/service/appctrl/action/DO_STOP.java

@ -29,14 +29,16 @@ public class DO_STOP extends A8kStepAction {
void init() {
}
@Override public void doaction() throws AppException {
gstate.mainFlowCtrlState.workState = A8kWorkState.IDLE;
gstate.mainFlowCtrlState.workStateChangeFlag = false;
}
@Override public Boolean checkCondition() {
Boolean cond1 = !gstate.mainFlowCtrlState.workState.equals(gstate.getWorkState());
Boolean cond2 = gstate.getWorkState().equals(A8kWorkState.IDLE);
return cond1 & cond2;
Boolean cond1 = gstate.mainFlowCtrlState.workStateChangeFlag;
Boolean cond2 = gstate.mainFlowCtrlState.lastWorkState.equals(A8kWorkState.WORKING) || gstate.mainFlowCtrlState.lastWorkState.equals(A8kWorkState.PAUSE);
Boolean cond3 = gstate.mainFlowCtrlState.workState.equals(A8kWorkState.IDLE);
return cond1 & cond2 & cond3;
}
@Override public List<A8kPublicResourceType> getResourceList() {

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

@ -4,12 +4,14 @@ public enum A8kActionStepType {
DO_START,//启动
DO_PAUSE,//暂停
DO_STOP, //停止
DO_RESUME,//恢复
SEQ1_ENTER_TUBEHOLDER_AND_SCAN, //入料并扫描
SEQ2_SWITCH_TO_THE_NEXT_TUBE,// 切换到下一个试管
SEQ3_PRE_PROCESS,
// SEQ4_PROCESS,
// SEQ5_POS_PROCESS_TUBE,
// SEQ4_PROCESS,
// SEQ5_POS_PROCESS_TUBE,
DO_EJECT_TUBEHOLDER, //弹出试管架

3
src/main/java/a8k/service/appctrl/action/base/A8kStepAction.java

@ -29,9 +29,6 @@ public class A8kStepAction {
public void doaction() throws AppException {
}
public void doactions() throws AppException {
}
public Boolean isMutiLineAction() {
return false;
}

37
src/main/java/a8k/service/appctrl/action/mainflow/SEQ3_PRE_PROCESS.java

@ -11,6 +11,7 @@ import a8k.service.appstate.GStateService;
import a8k.service.appstate.IncubationPlateMgrService;
import a8k.service.appstate.TubeProcessContextMgrService;
import a8k.service.appstate.resource.A8kPublicResourceType;
import a8k.service.appstate.type.Tube;
import a8k.service.appstate.type.state.TubeState;
import a8k.service.devicedriver.ctrl.HbotControlService;
import a8k.service.devicedriver.ctrl.ReactionPlatesTransmitCtrl;
@ -19,6 +20,7 @@ import a8k.service.devicedriver.ctrl.SamplesPreProcesCtrl;
import a8k.type.Consumable;
import a8k.type.ConsumableGroup;
import a8k.type.IncubatorPos;
import a8k.type.TipPos;
import a8k.type.exception.AppException;
import a8k.type.projecttype.a8kidcard.A8kIdCardInfo;
import jakarta.annotation.PostConstruct;
@ -27,6 +29,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
@ -210,15 +213,35 @@ public class SEQ3_PRE_PROCESS extends A8kStepAction {
//
// 根据要做的项目申请耗材
//
//
//
//
List<Integer> projs = gstate.getCurProcessingTube().projIndex;
// List<Consumable> consumable = consumablesMgrService.takeConsumables(projs);
// List<IncubatorPos> incubatorPoss = incubationPlateMgrService.takeIncubationIDLEPos(projs.size());
// List<A8kIdCardInfo> a8kIdCardInfo =
//申请项目耗材
List<Consumable> consumables = consumablesMgrService.takeConsumables(projs);
//申请孵育盘位置
List<IncubatorPos> incubatorPoss = incubationPlateMgrService.takeIncubationIDLEPos(projs.size());
assert consumables != null;
assert incubatorPoss != null;
//找到项目对应的A8kIdCardInfo
List<A8kIdCardInfo> a8kIdCardInfo = new ArrayList<>();
for (Consumable consumable : consumables) {
A8kIdCardInfo idcardInfo = appProjInfoMgrService.getA8kIdCardInfoByLotId(consumable.lotId);
assert idcardInfo != null;
a8kIdCardInfo.add(idcardInfo);
}
//申请tip头
List<List<TipPos>> tipPos = new ArrayList<>();
for (int i = 0; i < projs.size(); i++) {
List<TipPos> tips = consumablesMgrService.takeTip(a8kIdCardInfo.get(i).reactionFlowType);
tipPos.add(tips);
}
assert tipPos.size() == projs.size();
Tube tube = gstate.getCurProcessingTube();
for (int i = 0; i < projs.size(); i++) {
tubeProcessContextMgrService.createProjProcessContext(tube, projs.get(i), consumables.get(i), incubatorPoss.get(i));
}
// List<TipPos> tipPos
// consumablesMgrService.getChannelNumByProjIndex(projIndex);

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

@ -53,11 +53,14 @@ public class MainFlowCtrlScheduler {
MainFlowCtrlState state = null;
Thread workThread;
ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 5, 0, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(10));
Thread workThread;
ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 5, 0, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(10));
Runnable checkBeforeGuess;
A8kEcodePostProcesser ecodePostProcesser;
A8kEcodeClearProcesser ecodeClearProcesser;
Boolean clearErrorPendingFlag = false; //清除错误请求标志
Boolean clearErrorPendingFlag = false; //清除错误请求标志
List<A8kStepAction> stepActionList = new ArrayList<>();
@ -78,6 +81,11 @@ public class MainFlowCtrlScheduler {
this.ecodePostProcesser = ecodePostProcesser;
}
public void regCheckBeforeGuess(Runnable checkBeforeGuess) {
this.checkBeforeGuess = checkBeforeGuess;
}
public void regFn(A8kStepAction action) {
stepActionList.add(action);
}
@ -109,6 +117,10 @@ public class MainFlowCtrlScheduler {
//
List<A8kStepAction> guessWhatToDo() {
if (this.checkBeforeGuess != null) {
this.checkBeforeGuess.run();
}
try {
List<A8kStepAction> dowhatList = new ArrayList<>();
@ -252,7 +264,6 @@ public class MainFlowCtrlScheduler {
this.state.errorFlag = true;
this.state.ecodeList = ecodeList;
this.state.workState = A8kWorkState.PAUSE;
gstate.setWorkState(A8kWorkState.PAUSE);
}
void threadLoopFn() {

67
src/main/java/a8k/service/appstate/ConsumablesMgrService.java

@ -1,11 +1,13 @@
package a8k.service.appstate;
import a8k.constant.AppConstant;
import a8k.controler.extapi.pagecontrol.ExtApiTabConfig;
import a8k.controler.extapi.utils.ExtApiFn;
import a8k.controler.extapi.utils.ExtApiTab;
import a8k.type.Consumable;
import a8k.type.ConsumableGroup;
import a8k.type.TipPos;
import a8k.type.projecttype.A8kReactionFlowType;
import a8k.type.type.TipGroup;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;
@ -54,7 +56,6 @@ public class ConsumablesMgrService {
synchronized Integer priGetConsumableRemainNum(ConsumableGroup ch) {
var cState = gstate.getConsumableState();
assert cState != null;
return cState.reactionPlateGroup[ch.off].num;
}
@ -81,7 +82,6 @@ public class ConsumablesMgrService {
synchronized void priSetConsumableGroupNum(ConsumableGroup group, Integer num) {
var cState = gstate.getConsumableState();
assert cState != null;
cState.reactionPlateGroup[group.off].num = num;
if (cState.littBSGroup[group.off].enable) {
cState.littBSGroup[group.off].num = num;
@ -91,27 +91,24 @@ public class ConsumablesMgrService {
}
}
synchronized void priTakeOneConsumable(ConsumableGroup group) {
synchronized Integer priTakeOneConsumable(ConsumableGroup group) {
var cState = gstate.getConsumableState();
assert cState != null;
cState.reactionPlateGroup[group.off].num--;
return AppConstant.CONSUMABLE_NUM - cState.reactionPlateGroup[group.off].num + 1;
}
synchronized void priBakOneConsumable(ConsumableGroup group) {
var cState = gstate.getConsumableState();
assert cState != null;
cState.reactionPlateGroup[group.off].num++;
}
synchronized String priGetLotId(ConsumableGroup group) {
var cState = gstate.getConsumableState();
assert cState != null;
return cState.reactionPlateGroup[group.off].lotId;
}
synchronized Integer priGetProjIndex(ConsumableGroup group) {
var cState = gstate.getConsumableState();
assert cState != null;
return cState.reactionPlateGroup[group.off].projIndex;
}
@ -172,40 +169,53 @@ public class ConsumablesMgrService {
return null;
}
synchronized public void bakOneTip(TipPos tip) {
var cState = gstate.getConsumableState();
cState.tips[tip.group.ordinal()].tipNum++;
}
synchronized public List<TipPos> takeTip(A8kReactionFlowType flow) {
int takeCnt = flow.tipUseNum;
List<TipPos> ret = new ArrayList<>();
for (int i = 0; i < takeCnt; i++) {
TipPos tipPos = takeNextTipPos();
ret.add(tipPos);
}
if (ret.size() != takeCnt) {
for (TipPos tipPos : ret) {
bakOneTip(tipPos);
}
return null;
}
return ret;
}
/**
* 申请耗材
* @param projIndex 项目索引
* @return 耗材组
*/
synchronized public List<ConsumableGroup> takeConsumablePos(List<Integer> projIndex) {
List<ConsumableGroup> ret = new ArrayList<>();
synchronized public List<Consumable> takeConsumables(List<Integer> projIndex) {
List<Consumable> consumables = new ArrayList<>();
for (Integer index : projIndex) {
var ch = priGetConsumableGroupByProjIndex(index);
if (ch != null) {
priTakeOneConsumable(ch);
ret.add(ch);
Integer pos = priTakeOneConsumable(ch);
Consumable consumable = new Consumable(ch, pos, priGetLotId(ch), priGetProjIndex(ch));
consumables.add(consumable);
}
}
if (ret.size() != projIndex.size()) {
for (ConsumableGroup ch : ret) {
priBakOneConsumable(ch);
if (consumables.size() != projIndex.size()) {
for (Consumable consumable : consumables) {
priBakOneConsumable(consumable.group);
}
return null;
}
return ret;
}
public List<Consumable> takeConsumables(List<Integer> projIndex) {
var cg = takeConsumablePos(projIndex);
if (cg == null) {
return null;
}
List<Consumable> ret = new ArrayList<>();
for (ConsumableGroup ch : cg) {
ret.add(new Consumable(ch, priGetLotId(ch), priGetProjIndex(ch)));
}
return ret;
return consumables;
}
@ -217,7 +227,6 @@ public class ConsumablesMgrService {
@ExtApiFn(name = "设置Tip数量")
synchronized public void setTipNum(Integer group, Integer num) {
var cState = gstate.getConsumableState();
assert cState != null;
cState.tips[group].tipNum = num;
}

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

@ -23,7 +23,7 @@ public class GStateService {
//设备是否初始化过
Boolean deviceInited = false;
//设备工作状态标识位
A8kWorkState workState = A8kWorkState.IDLE; //
//当前正在被处理的试管架状态
TubeHolder tubeHolder = new TubeHolder();
@ -68,7 +68,7 @@ public class GStateService {
}
public Boolean isWorking() {
return workState.equals(A8kWorkState.WORKING) && mainFlowCtrlState.workState.equals(A8kWorkState.WORKING);
return mainFlowCtrlState.workState.equals(A8kWorkState.WORKING);
}
public TubeHolderState getTubeHolderState() {

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

@ -1,9 +1,12 @@
package a8k.service.appstate;
import a8k.dbservice.type.SampleRecord;
import a8k.service.appstate.type.ProjProcessContext;
import a8k.service.appstate.type.Tube;
import a8k.service.appstate.type.TubeProcessContext;
import a8k.service.appstate.type.state.TubeState;
import a8k.type.Consumable;
import a8k.type.IncubatorPos;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;
@ -11,6 +14,7 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import a8k.dbservice.SampleRecordDBService;
@ -73,7 +77,7 @@ public class TubeProcessContextMgrService {
private void addEmergencySampleRecord(Tube state) {
Date intertime = new Date();
SampleRecord record = new SampleRecord();
state.isEmergency = true;
state.isEmergency = true;
record.bloodType = state.bloodType;
record.sampleBarcode = state.sampleBarcode;
@ -121,4 +125,13 @@ public class TubeProcessContextMgrService {
}
}
synchronized public void createProjProcessContext(Tube tube, Integer projIndex, Consumable consumable, IncubatorPos incubatorPos) {
ProjProcessContext context = new ProjProcessContext();
context.projIndex = projIndex;
context.consumable = consumable;
context.incubatorPos = incubatorPos;
context.sampleId = tube.sampleid;
context.uuid = UUID.randomUUID().toString();
tube.projProcessContexts.add(context);
}
}

8
src/main/java/a8k/service/appstate/type/MainFlowCtrlState.java

@ -11,4 +11,12 @@ public class MainFlowCtrlState {
public Boolean errorFlag = false; //错误标志
public Boolean fatalErrorFlag = false; //致命错误标志
public List<A8kErrorContext> ecodeList = new ArrayList<>();
public Boolean workStateChangeFlag = false; //工作状态变化标志
public A8kWorkState lastWorkState = A8kWorkState.IDLE; //上一个工作状态
public Boolean stopActionPending = false; //停止动作等待
public Boolean pauseActionPending = false; //暂停动作等待
public Boolean resumeActionPending = false; //恢复动作等待
public Boolean startActionPending = false; //开始动作等待
}

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

@ -4,11 +4,10 @@ import a8k.type.Consumable;
import a8k.type.IncubatorPos;
public class ProjProcessContext {
public String projProcessId; //项目流程ID-系统生成-唯一标识一个项目流程
public String uuid;
public String sampleId; //样本ID-系统生成-唯一标识一个样本
public Integer projIndex;//项目代码
public Consumable consumable;//耗材绑定的通道号
public Integer consumablePos;//耗材索引
public IncubatorPos incubatorPos;//孵育位置
}

3
src/main/java/a8k/type/Consumable.java

@ -2,10 +2,11 @@ package a8k.type;
public class Consumable {
public ConsumableGroup group;
public Integer pos;
public String lotId;
public Integer projIndex;
public Consumable(ConsumableGroup group, String lotId, Integer projIndex) {
public Consumable(ConsumableGroup group, Integer pos,String lotId, Integer projIndex) {
this.group = group;
this.lotId = lotId;
this.projIndex = projIndex;

12
src/main/java/a8k/utils/ZASSERT.java

@ -0,0 +1,12 @@
package a8k.utils;
import a8k.type.ecode.AppCodeError;
import a8k.type.exception.AppException;
public class ZASSERT {
static void zassert(Boolean condition, String exmsg) throws AppException {
if (!condition) {
throw new AppException(new AppCodeError(exmsg));
}
}
}
Loading…
Cancel
Save