From 3814278319059b31d53e5857784d3d7da1b5045f Mon Sep 17 00:00:00 2001 From: zhaohe Date: Tue, 8 Oct 2024 10:11:15 +0800 Subject: [PATCH] update --- src/main/java/a8k/constant/AppConstant.java | 8 +++ .../a8k/service/appctrl/AppDeviceCtrlService.java | 10 ++- .../a8k/service/appctrl/MainFlowCtrlService.java | 76 +++++++++++++++++++--- .../java/a8k/service/appctrl/action/DO_PAUSE.java | 14 ++-- .../java/a8k/service/appctrl/action/DO_RESUME.java | 46 +++++++++++++ .../java/a8k/service/appctrl/action/DO_START.java | 17 ++--- .../java/a8k/service/appctrl/action/DO_STOP.java | 10 +-- .../appctrl/action/base/A8kActionStepType.java | 6 +- .../service/appctrl/action/base/A8kStepAction.java | 3 - .../appctrl/action/mainflow/SEQ3_PRE_PROCESS.java | 37 +++++++++-- .../appctrl/scheduler/MainFlowCtrlScheduler.java | 19 ++++-- .../service/appstate/ConsumablesMgrService.java | 67 ++++++++++--------- .../java/a8k/service/appstate/GStateService.java | 4 +- .../appstate/TubeProcessContextMgrService.java | 15 ++++- .../service/appstate/type/MainFlowCtrlState.java | 8 +++ .../service/appstate/type/ProjProcessContext.java | 3 +- src/main/java/a8k/type/Consumable.java | 3 +- src/main/java/a8k/utils/ZASSERT.java | 12 ++++ 18 files changed, 273 insertions(+), 85 deletions(-) create mode 100644 src/main/java/a8k/constant/AppConstant.java create mode 100644 src/main/java/a8k/service/appctrl/action/DO_RESUME.java create mode 100644 src/main/java/a8k/utils/ZASSERT.java diff --git a/src/main/java/a8k/constant/AppConstant.java b/src/main/java/a8k/constant/AppConstant.java new file mode 100644 index 0000000..6baa1a9 --- /dev/null +++ b/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; +} diff --git a/src/main/java/a8k/service/appctrl/AppDeviceCtrlService.java b/src/main/java/a8k/service/appctrl/AppDeviceCtrlService.java index 3302c67..71eae97 100644 --- a/src/main/java/a8k/service/appctrl/AppDeviceCtrlService.java +++ b/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(); } /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ diff --git a/src/main/java/a8k/service/appctrl/MainFlowCtrlService.java b/src/main/java/a8k/service/appctrl/MainFlowCtrlService.java index c5fac17..e656e30 100644 --- a/src/main/java/a8k/service/appctrl/MainFlowCtrlService.java +++ b/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 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 ecodeList) { } @@ -79,4 +106,35 @@ public class MainFlowCtrlService { return true; } + + // + // EXT + // + public List 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; + } } diff --git a/src/main/java/a8k/service/appctrl/action/DO_PAUSE.java b/src/main/java/a8k/service/appctrl/action/DO_PAUSE.java index 1dc9144..54b94d0 100644 --- a/src/main/java/a8k/service/appctrl/action/DO_PAUSE.java +++ b/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 getResourceList() { diff --git a/src/main/java/a8k/service/appctrl/action/DO_RESUME.java b/src/main/java/a8k/service/appctrl/action/DO_RESUME.java new file mode 100644 index 0000000..c7f370a --- /dev/null +++ b/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 getResourceList() { + return List.of(); + } +} diff --git a/src/main/java/a8k/service/appctrl/action/DO_START.java b/src/main/java/a8k/service/appctrl/action/DO_START.java index e492f25..a26f132 100644 --- a/src/main/java/a8k/service/appctrl/action/DO_START.java +++ b/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 getResourceList() { diff --git a/src/main/java/a8k/service/appctrl/action/DO_STOP.java b/src/main/java/a8k/service/appctrl/action/DO_STOP.java index a627487..8c4c1a1 100644 --- a/src/main/java/a8k/service/appctrl/action/DO_STOP.java +++ b/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 getResourceList() { diff --git a/src/main/java/a8k/service/appctrl/action/base/A8kActionStepType.java b/src/main/java/a8k/service/appctrl/action/base/A8kActionStepType.java index 9acb8cf..d0e5d78 100644 --- a/src/main/java/a8k/service/appctrl/action/base/A8kActionStepType.java +++ b/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, //弹出试管架 diff --git a/src/main/java/a8k/service/appctrl/action/base/A8kStepAction.java b/src/main/java/a8k/service/appctrl/action/base/A8kStepAction.java index 1621729..c5796af 100644 --- a/src/main/java/a8k/service/appctrl/action/base/A8kStepAction.java +++ b/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; } diff --git a/src/main/java/a8k/service/appctrl/action/mainflow/SEQ3_PRE_PROCESS.java b/src/main/java/a8k/service/appctrl/action/mainflow/SEQ3_PRE_PROCESS.java index cf1fc92..ec256f5 100644 --- a/src/main/java/a8k/service/appctrl/action/mainflow/SEQ3_PRE_PROCESS.java +++ b/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 projs = gstate.getCurProcessingTube().projIndex; -// List consumable = consumablesMgrService.takeConsumables(projs); -// List incubatorPoss = incubationPlateMgrService.takeIncubationIDLEPos(projs.size()); -// List a8kIdCardInfo = + //申请项目耗材 + List consumables = consumablesMgrService.takeConsumables(projs); + //申请孵育盘位置 + List incubatorPoss = incubationPlateMgrService.takeIncubationIDLEPos(projs.size()); + assert consumables != null; + assert incubatorPoss != null; + //找到项目对应的A8kIdCardInfo + List a8kIdCardInfo = new ArrayList<>(); + for (Consumable consumable : consumables) { + A8kIdCardInfo idcardInfo = appProjInfoMgrService.getA8kIdCardInfoByLotId(consumable.lotId); + assert idcardInfo != null; + a8kIdCardInfo.add(idcardInfo); + } + //申请tip头 + List> tipPos = new ArrayList<>(); + for (int i = 0; i < projs.size(); i++) { + List 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 // consumablesMgrService.getChannelNumByProjIndex(projIndex); diff --git a/src/main/java/a8k/service/appctrl/scheduler/MainFlowCtrlScheduler.java b/src/main/java/a8k/service/appctrl/scheduler/MainFlowCtrlScheduler.java index 70add39..16882a2 100644 --- a/src/main/java/a8k/service/appctrl/scheduler/MainFlowCtrlScheduler.java +++ b/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 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 guessWhatToDo() { + if (this.checkBeforeGuess != null) { + this.checkBeforeGuess.run(); + } + try { List 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() { diff --git a/src/main/java/a8k/service/appstate/ConsumablesMgrService.java b/src/main/java/a8k/service/appstate/ConsumablesMgrService.java index 82bfa59..b00e4cf 100644 --- a/src/main/java/a8k/service/appstate/ConsumablesMgrService.java +++ b/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 takeTip(A8kReactionFlowType flow) { + int takeCnt = flow.tipUseNum; + List 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 takeConsumablePos(List projIndex) { - List ret = new ArrayList<>(); + synchronized public List takeConsumables(List projIndex) { + + List 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 takeConsumables(List projIndex) { - var cg = takeConsumablePos(projIndex); - if (cg == null) { - return null; - } - - List 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; } diff --git a/src/main/java/a8k/service/appstate/GStateService.java b/src/main/java/a8k/service/appstate/GStateService.java index fa40c22..2424add 100644 --- a/src/main/java/a8k/service/appstate/GStateService.java +++ b/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() { diff --git a/src/main/java/a8k/service/appstate/TubeProcessContextMgrService.java b/src/main/java/a8k/service/appstate/TubeProcessContextMgrService.java index 6545dbe..6196bc2 100644 --- a/src/main/java/a8k/service/appstate/TubeProcessContextMgrService.java +++ b/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); + } } diff --git a/src/main/java/a8k/service/appstate/type/MainFlowCtrlState.java b/src/main/java/a8k/service/appstate/type/MainFlowCtrlState.java index c6845d1..1427de6 100644 --- a/src/main/java/a8k/service/appstate/type/MainFlowCtrlState.java +++ b/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 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; //开始动作等待 } diff --git a/src/main/java/a8k/service/appstate/type/ProjProcessContext.java b/src/main/java/a8k/service/appstate/type/ProjProcessContext.java index 3ad2392..7a1b1b8 100644 --- a/src/main/java/a8k/service/appstate/type/ProjProcessContext.java +++ b/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;//孵育位置 } diff --git a/src/main/java/a8k/type/Consumable.java b/src/main/java/a8k/type/Consumable.java index 156e2c7..15e309f 100644 --- a/src/main/java/a8k/type/Consumable.java +++ b/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; diff --git a/src/main/java/a8k/utils/ZASSERT.java b/src/main/java/a8k/utils/ZASSERT.java new file mode 100644 index 0000000..89e51d9 --- /dev/null +++ b/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)); + } + } +}