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. 74
      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. 2
      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. 13
      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. 13
      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 = "设备控制") @ExtApiFn(name = "开始工作", group = "设备控制")
public void startWork() { public void startWork() {
gstate.setWorkState(A8kWorkState.WORKING);
mainFlowCtrlSampleScanService.setClearErrorPendingFlag();
mainFlowCtrlSampleScanService.startWork();
} }
@ExtApiFn(name = "停止工作", group = "设备控制") @ExtApiFn(name = "停止工作", group = "设备控制")
public void stopWork() { public void stopWork() {
gstate.setWorkState(A8kWorkState.IDLE);
mainFlowCtrlSampleScanService.stopWork();
} }
@ExtApiFn(name = "暂停工作", group = "设备控制") @ExtApiFn(name = "暂停工作", group = "设备控制")
public void pauseWork() { public void pauseWork() {
gstate.setWorkState(A8kWorkState.PAUSE);
mainFlowCtrlSampleScanService.pauseWork();
} }
@ExtApiFn(name = "继续工作", group = "设备控制") @ExtApiFn(name = "继续工作", group = "设备控制")
public void continueWork() { public void continueWork() {
gstate.setWorkState(A8kWorkState.WORKING);
// mainFlowCtrlSampleScanService.setClearErrorPendingFlag();
mainFlowCtrlSampleScanService.continueWork();
} }
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

74
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.scheduler.MainFlowCtrlScheduler;
import a8k.service.appctrl.type.A8kErrorContext; import a8k.service.appctrl.type.A8kErrorContext;
import a8k.service.appstate.GStateService; import a8k.service.appstate.GStateService;
import a8k.service.appstate.type.MainFlowCtrlState;
import a8k.service.appstate.type.state.A8kWorkState;
import com.iflytop.a800.SpringBootBeanUtil; import com.iflytop.a800.SpringBootBeanUtil;
import jakarta.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
@ -39,6 +41,7 @@ public class MainFlowCtrlService {
scheduler.regClearErrorProcesser(this::clearErrorcodeBeforeContinueDo); scheduler.regClearErrorProcesser(this::clearErrorcodeBeforeContinueDo);
scheduler.regEcodePostProcesser(this::postPorcessA8kEcode); scheduler.regEcodePostProcesser(this::postPorcessA8kEcode);
scheduler.regCheckBeforeGuess(this::checkBeforeGuess);
logger.info("className {}", DO_STOP.class.getName()); logger.info("className {}", DO_STOP.class.getName());
@ -54,18 +57,42 @@ public class MainFlowCtrlService {
scheduler.startScheduler(); 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) { void postPorcessA8kEcode(List<A8kErrorContext> ecodeList) {
} }
@ -79,4 +106,35 @@ public class MainFlowCtrlService {
return true; 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.GStateService;
import a8k.service.appstate.resource.A8kPublicResourceType; import a8k.service.appstate.resource.A8kPublicResourceType;
import a8k.service.appstate.type.state.A8kWorkState; import a8k.service.appstate.type.state.A8kWorkState;
import a8k.service.devicedriver.ctrl.SampleScanTransportCtrl;
import a8k.type.exception.AppException; import a8k.type.exception.AppException;
import jakarta.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
@ -25,19 +26,22 @@ public class DO_PAUSE extends A8kStepAction {
@Resource @Resource
GStateService gstate; GStateService gstate;
@Resource
SampleScanTransportCtrl sampleScanTransportCtrl;
@PostConstruct @PostConstruct
void init() { void init() {
} }
@Override public void doaction() throws AppException { @Override public void doaction() throws AppException {
gstate.mainFlowCtrlState.workState = A8kWorkState.PAUSE;
gstate.mainFlowCtrlState.workStateChangeFlag = false;
} }
@Override public Boolean checkCondition() { @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() { @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; GStateService gstate;
@Resource @Resource
SampleScanTransportCtrl sstc;
SampleScanTransportCtrl sampleScanTransportCtrl;
@PostConstruct @PostConstruct
@ -37,18 +37,15 @@ public class DO_START extends A8kStepAction {
@Override public void doaction() throws AppException { @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() { @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() { @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() { void init() {
} }
@Override public void doaction() throws AppException { @Override public void doaction() throws AppException {
gstate.mainFlowCtrlState.workState = A8kWorkState.IDLE;
gstate.mainFlowCtrlState.workStateChangeFlag = false;
} }
@Override public Boolean checkCondition() { @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() { @Override public List<A8kPublicResourceType> getResourceList() {

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

@ -4,6 +4,8 @@ public enum A8kActionStepType {
DO_START,//启动 DO_START,//启动
DO_PAUSE,//暂停 DO_PAUSE,//暂停
DO_STOP, //停止 DO_STOP, //停止
DO_RESUME,//恢复
SEQ1_ENTER_TUBEHOLDER_AND_SCAN, //入料并扫描 SEQ1_ENTER_TUBEHOLDER_AND_SCAN, //入料并扫描
SEQ2_SWITCH_TO_THE_NEXT_TUBE,// 切换到下一个试管 SEQ2_SWITCH_TO_THE_NEXT_TUBE,// 切换到下一个试管
SEQ3_PRE_PROCESS, SEQ3_PRE_PROCESS,

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 doaction() throws AppException {
} }
public void doactions() throws AppException {
}
public Boolean isMutiLineAction() { public Boolean isMutiLineAction() {
return false; 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.IncubationPlateMgrService;
import a8k.service.appstate.TubeProcessContextMgrService; import a8k.service.appstate.TubeProcessContextMgrService;
import a8k.service.appstate.resource.A8kPublicResourceType; import a8k.service.appstate.resource.A8kPublicResourceType;
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;
@ -19,6 +20,7 @@ import a8k.service.devicedriver.ctrl.SamplesPreProcesCtrl;
import a8k.type.Consumable; import a8k.type.Consumable;
import a8k.type.ConsumableGroup; import a8k.type.ConsumableGroup;
import a8k.type.IncubatorPos; import a8k.type.IncubatorPos;
import a8k.type.TipPos;
import a8k.type.exception.AppException; import a8k.type.exception.AppException;
import a8k.type.projecttype.a8kidcard.A8kIdCardInfo; import a8k.type.projecttype.a8kidcard.A8kIdCardInfo;
import jakarta.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
@ -27,6 +29,7 @@ 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.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.*; import java.util.concurrent.*;
@ -210,15 +213,35 @@ public class SEQ3_PRE_PROCESS extends A8kStepAction {
// //
// 根据要做的项目申请耗材 // 根据要做的项目申请耗材
//
//
//
//
List<Integer> projs = gstate.getCurProcessingTube().projIndex; 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 // List<TipPos> tipPos
// consumablesMgrService.getChannelNumByProjIndex(projIndex); // consumablesMgrService.getChannelNumByProjIndex(projIndex);

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

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

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

@ -1,11 +1,13 @@
package a8k.service.appstate; package a8k.service.appstate;
import a8k.constant.AppConstant;
import a8k.controler.extapi.pagecontrol.ExtApiTabConfig; import a8k.controler.extapi.pagecontrol.ExtApiTabConfig;
import a8k.controler.extapi.utils.ExtApiFn; import a8k.controler.extapi.utils.ExtApiFn;
import a8k.controler.extapi.utils.ExtApiTab; import a8k.controler.extapi.utils.ExtApiTab;
import a8k.type.Consumable; import a8k.type.Consumable;
import a8k.type.ConsumableGroup; import a8k.type.ConsumableGroup;
import a8k.type.TipPos; import a8k.type.TipPos;
import a8k.type.projecttype.A8kReactionFlowType;
import a8k.type.type.TipGroup; import a8k.type.type.TipGroup;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -54,7 +56,6 @@ public class ConsumablesMgrService {
synchronized Integer priGetConsumableRemainNum(ConsumableGroup ch) { synchronized Integer priGetConsumableRemainNum(ConsumableGroup ch) {
var cState = gstate.getConsumableState(); var cState = gstate.getConsumableState();
assert cState != null;
return cState.reactionPlateGroup[ch.off].num; return cState.reactionPlateGroup[ch.off].num;
} }
@ -81,7 +82,6 @@ public class ConsumablesMgrService {
synchronized void priSetConsumableGroupNum(ConsumableGroup group, Integer num) { synchronized void priSetConsumableGroupNum(ConsumableGroup group, Integer num) {
var cState = gstate.getConsumableState(); var cState = gstate.getConsumableState();
assert cState != null;
cState.reactionPlateGroup[group.off].num = num; cState.reactionPlateGroup[group.off].num = num;
if (cState.littBSGroup[group.off].enable) { if (cState.littBSGroup[group.off].enable) {
cState.littBSGroup[group.off].num = num; 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(); var cState = gstate.getConsumableState();
assert cState != null;
cState.reactionPlateGroup[group.off].num--; cState.reactionPlateGroup[group.off].num--;
return AppConstant.CONSUMABLE_NUM - cState.reactionPlateGroup[group.off].num + 1;
} }
synchronized void priBakOneConsumable(ConsumableGroup group) { synchronized void priBakOneConsumable(ConsumableGroup group) {
var cState = gstate.getConsumableState(); var cState = gstate.getConsumableState();
assert cState != null;
cState.reactionPlateGroup[group.off].num++; cState.reactionPlateGroup[group.off].num++;
} }
synchronized String priGetLotId(ConsumableGroup group) { synchronized String priGetLotId(ConsumableGroup group) {
var cState = gstate.getConsumableState(); var cState = gstate.getConsumableState();
assert cState != null;
return cState.reactionPlateGroup[group.off].lotId; return cState.reactionPlateGroup[group.off].lotId;
} }
synchronized Integer priGetProjIndex(ConsumableGroup group) { synchronized Integer priGetProjIndex(ConsumableGroup group) {
var cState = gstate.getConsumableState(); var cState = gstate.getConsumableState();
assert cState != null;
return cState.reactionPlateGroup[group.off].projIndex; return cState.reactionPlateGroup[group.off].projIndex;
} }
@ -172,40 +169,53 @@ public class ConsumablesMgrService {
return null; 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 项目索引 * @param projIndex 项目索引
* @return 耗材组 * @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) { for (Integer index : projIndex) {
var ch = priGetConsumableGroupByProjIndex(index); var ch = priGetConsumableGroupByProjIndex(index);
if (ch != null) { 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 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数量") @ExtApiFn(name = "设置Tip数量")
synchronized public void setTipNum(Integer group, Integer num) { synchronized public void setTipNum(Integer group, Integer num) {
var cState = gstate.getConsumableState(); var cState = gstate.getConsumableState();
assert cState != null;
cState.tips[group].tipNum = num; cState.tips[group].tipNum = num;
} }

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

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

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

@ -1,9 +1,12 @@
package a8k.service.appstate; package a8k.service.appstate;
import a8k.dbservice.type.SampleRecord; import a8k.dbservice.type.SampleRecord;
import a8k.service.appstate.type.ProjProcessContext;
import a8k.service.appstate.type.Tube; import a8k.service.appstate.type.Tube;
import a8k.service.appstate.type.TubeProcessContext; import a8k.service.appstate.type.TubeProcessContext;
import a8k.service.appstate.type.state.TubeState; import a8k.service.appstate.type.state.TubeState;
import a8k.type.Consumable;
import a8k.type.IncubatorPos;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -11,6 +14,7 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.UUID;
import a8k.dbservice.SampleRecordDBService; import a8k.dbservice.SampleRecordDBService;
@ -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 errorFlag = false; //错误标志
public Boolean fatalErrorFlag = false; //致命错误标志 public Boolean fatalErrorFlag = false; //致命错误标志
public List<A8kErrorContext> ecodeList = new ArrayList<>(); 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; import a8k.type.IncubatorPos;
public class ProjProcessContext { public class ProjProcessContext {
public String projProcessId; //项目流程ID-系统生成-唯一标识一个项目流程
public String uuid;
public String sampleId; //样本ID-系统生成-唯一标识一个样本 public String sampleId; //样本ID-系统生成-唯一标识一个样本
public Integer projIndex;//项目代码 public Integer projIndex;//项目代码
public Consumable consumable;//耗材绑定的通道号 public Consumable consumable;//耗材绑定的通道号
public Integer consumablePos;//耗材索引
public IncubatorPos incubatorPos;//孵育位置 public IncubatorPos incubatorPos;//孵育位置
} }

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

@ -2,10 +2,11 @@ package a8k.type;
public class Consumable { public class Consumable {
public ConsumableGroup group; public ConsumableGroup group;
public Integer pos;
public String lotId; public String lotId;
public Integer projIndex; 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.group = group;
this.lotId = lotId; this.lotId = lotId;
this.projIndex = projIndex; 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