From e9d6c60532eeb056e83a0fab8f8988ae7d47a558 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Thu, 16 Jan 2025 16:16:46 +0800 Subject: [PATCH] update --- doc/TODO.md | 1 + .../a8k/app/a8ktype/state/DeviceWorkState.java | 32 ++++++++++---- .../java/a8k/app/a8ktype/ui/TubeHolderSetting.java | 2 - .../bases/FrontEndMessageBoxAndEventMgr.java | 2 +- .../lowerctrl/LiquidOperationCtrlService.java | 5 ++- .../mainflowctrl/MainFlowCtrlScheduler.java | 11 +++-- .../action/AC30ScanTubeHolderTask.java | 2 +- .../service/statemgr/ConsumablesMgrService.java | 11 +++++ .../statemgr/DeviceWorkStateMgrService.java | 51 +++++++++++++++------- .../statemgr/WarningAndErrorFlagMgrService.java | 27 ++++++++++++ .../verification/P51FullFlowVerificationPage.java | 25 +++++++---- 11 files changed, 125 insertions(+), 44 deletions(-) create mode 100644 src/main/java/a8k/app/service/statemgr/WarningAndErrorFlagMgrService.java diff --git a/doc/TODO.md b/doc/TODO.md index da40f24..c276312 100644 --- a/doc/TODO.md +++ b/doc/TODO.md @@ -30,4 +30,5 @@ 6. 配置页面支持配置设备名称 7. 配置好设备hostname,支持通过hostname访问设备 8. 设备启动任务之时检查一些光电标志位 +9. 解决取样品时,医生忘记打开TIP盖子导致的硬件错误 ``` \ No newline at end of file diff --git a/src/main/java/a8k/app/a8ktype/state/DeviceWorkState.java b/src/main/java/a8k/app/a8ktype/state/DeviceWorkState.java index 165dabb..52948d4 100644 --- a/src/main/java/a8k/app/a8ktype/state/DeviceWorkState.java +++ b/src/main/java/a8k/app/a8ktype/state/DeviceWorkState.java @@ -19,20 +19,36 @@ public class DeviceWorkState implements Serializable { @Schema(description = "错误列表") public List ecodeList = new ArrayList<>(); - public A8kWorkState lastWorkState = A8kWorkState.IDLE; //上一个工作状态 + @Schema(description = "当前状态是否切换完成") + public Boolean isPending() { + return stopActionPending || pauseActionPending || resumeActionPending || startActionPending; + } - public Boolean stopActionPending = false; //停止动作等待 - public Boolean pauseActionPending = false; //暂停动作等待 - public Boolean resumeActionPending = false; //恢复动作等待 - public Boolean startActionPending = false; //开始动作等待 public Boolean consumeNotEnoughErrorFlag = false; - @Schema(description = "当前状态是否切换完成") - public Boolean isPending() { - return stopActionPending || pauseActionPending || resumeActionPending || startActionPending; + public Boolean tipNotEnoughErrorFlag = false; + + public Boolean isWarning() { + return consumeNotEnoughErrorFlag || tipNotEnoughErrorFlag; } + + /** + * 以下状态是为了状态切换逻辑过程中准备的 + */ + @JsonIgnore + public A8kWorkState lastWorkState = A8kWorkState.IDLE; //上一个工作状态 + @JsonIgnore + public Boolean stopActionPending = false; //停止动作等待 + @JsonIgnore + public Boolean pauseActionPending = false; //暂停动作等待 + @JsonIgnore + public Boolean resumeActionPending = false; //恢复动作等待 + @JsonIgnore + public Boolean startActionPending = false; //开始动作等待 + + public void clearPending() { stopActionPending = false; pauseActionPending = false; diff --git a/src/main/java/a8k/app/a8ktype/ui/TubeHolderSetting.java b/src/main/java/a8k/app/a8ktype/ui/TubeHolderSetting.java index 2c4577f..562c4bb 100644 --- a/src/main/java/a8k/app/a8ktype/ui/TubeHolderSetting.java +++ b/src/main/java/a8k/app/a8ktype/ui/TubeHolderSetting.java @@ -18,12 +18,10 @@ public class TubeHolderSetting implements Serializable { @Schema(description = "唯一标识") public String uuid = UUID.randomUUID().toString(); //唯一标识 @Schema(description = "是否激活") - @JsonIgnore public Boolean active = false;//是否激活 @Schema(description = "试管配置") public TubeSetting[] tubeSettings = new TubeSetting[10]; @Schema(description = "是否锁定(锁住后,该配置不允许被修改)") - @JsonIgnore public Boolean lock = false;//如果后台已经使用,前端不允许修改 public TubeHolderSetting() { diff --git a/src/main/java/a8k/app/service/bases/FrontEndMessageBoxAndEventMgr.java b/src/main/java/a8k/app/service/bases/FrontEndMessageBoxAndEventMgr.java index 2c4225c..f3d17d1 100644 --- a/src/main/java/a8k/app/service/bases/FrontEndMessageBoxAndEventMgr.java +++ b/src/main/java/a8k/app/service/bases/FrontEndMessageBoxAndEventMgr.java @@ -51,7 +51,7 @@ public class FrontEndMessageBoxAndEventMgr { } else if (event instanceof AppIDCardUnmountEvent) { return event; //前端需要更新IDcard的状态 } else if (event instanceof AppTubeholderSettingUpdateEvent) { - return event;//前端需要更新试管架设置 + return null;//不再上报,直接从websocket上报消息 } else if (event instanceof DoA8kStepActionEvent) { // return new MessageBoxUpdateEvent(((DoA8kStepActionEvent) event).actionStepName); return null; diff --git a/src/main/java/a8k/app/service/lowerctrl/LiquidOperationCtrlService.java b/src/main/java/a8k/app/service/lowerctrl/LiquidOperationCtrlService.java index 9927cdd..2ff33ea 100644 --- a/src/main/java/a8k/app/service/lowerctrl/LiquidOperationCtrlService.java +++ b/src/main/java/a8k/app/service/lowerctrl/LiquidOperationCtrlService.java @@ -85,6 +85,9 @@ public class LiquidOperationCtrlService { } public void forceTakeTip() throws AppException { + if (hbotMoveExCtrlService.isHasTip()) { + return; + } while (true) { hbotMoveExCtrlService.takeTip(consumablesMgrService.takeNextTipPos()); if (gstate.isInMode(DeviceRunMode.RunOnlyMode)) { @@ -196,7 +199,7 @@ public class LiquidOperationCtrlService { public void takeSample(A8kSamplePos from, PreReactionPos pos, Integer ul) throws AppException { log.info("takeSampleToPreReactionPos: from={}, pos={}, ul={}ul", from, pos, ul); // 取TIP - forceTakeTip(); + forceTakeTip(); // 取样 takeSample(from, ul); diff --git a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/MainFlowCtrlScheduler.java b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/MainFlowCtrlScheduler.java index 501de1b..3f356a4 100644 --- a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/MainFlowCtrlScheduler.java +++ b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/MainFlowCtrlScheduler.java @@ -148,19 +148,19 @@ public class MainFlowCtrlScheduler implements ApplicationListener errorList) { + deviceWorkState.ecodeList.addAll(errorList); + } + + synchronized public void addError(AppActionErrorContext error) { + deviceWorkState.ecodeList.add(error); + } + + + // + // SETTER + // + synchronized public void setStopActionPending(Boolean stopActionPending) { deviceWorkState.stopActionPending = stopActionPending; } @@ -36,18 +50,19 @@ public class DeviceWorkStateMgrService { } - synchronized public void addError(List errorList) { - deviceWorkState.ecodeList.addAll(errorList); + synchronized public void setFatalErrorFlag(Boolean fatalErrorFlag) { + deviceWorkState.fatalErrorFlag = fatalErrorFlag; } - synchronized public void addError(AppActionErrorContext error) { - deviceWorkState.ecodeList.add(error); + synchronized public void setConsumeNotEnoughErrorFlag() { + deviceWorkState.consumeNotEnoughErrorFlag = true; } - synchronized public Boolean isPending() { - return deviceWorkState.isPending(); + synchronized public void clearConsumeNotEnoughErrorFlag() { + deviceWorkState.consumeNotEnoughErrorFlag = false; } + synchronized public void clearPending() { deviceWorkState.clearPending(); } @@ -58,28 +73,32 @@ public class DeviceWorkStateMgrService { deviceWorkState.workState = workState; } - synchronized public void setFatalErrorFlag(Boolean fatalErrorFlag) { - deviceWorkState.fatalErrorFlag = fatalErrorFlag; + synchronized public void setTipNotEnoughErrorFlag(Boolean tipNotEnoughErrorFlag) { + deviceWorkState.tipNotEnoughErrorFlag = tipNotEnoughErrorFlag; } - synchronized public void setConsumeNotEnoughErrorFlag(Boolean consumeNotEnoughErrorFlag) { - deviceWorkState.consumeNotEnoughErrorFlag = consumeNotEnoughErrorFlag; - } + + // + //GETTER + // synchronized public Boolean getConsumeNotEnoughErrorFlag() { return deviceWorkState.consumeNotEnoughErrorFlag; } - synchronized public Boolean isDeviceWorking() { if (isPending()) { return true; } - if (deviceWorkState.workState.equals(A8kWorkState.WORKING)) { - return true; - } + return deviceWorkState.workState.equals(A8kWorkState.WORKING); + } - return false; + synchronized public Boolean isPending() { + return deviceWorkState.isPending(); + } + synchronized public Boolean getTipNotEnoughErrorFlag() { + return deviceWorkState.tipNotEnoughErrorFlag; } + } diff --git a/src/main/java/a8k/app/service/statemgr/WarningAndErrorFlagMgrService.java b/src/main/java/a8k/app/service/statemgr/WarningAndErrorFlagMgrService.java new file mode 100644 index 0000000..b05cdaa --- /dev/null +++ b/src/main/java/a8k/app/service/statemgr/WarningAndErrorFlagMgrService.java @@ -0,0 +1,27 @@ +package a8k.app.service.statemgr; + +import a8k.app.a8ktype.error.AppError; +import a8k.app.a8ktype.ui.ZAppPromopt; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class WarningAndErrorFlagMgrService { + static class AppErrorCxt { + public AppError error; + public ZAppPromopt displayPrompt; + } + + static class ErrorAndWarningFlag { + + public Boolean fatalErrorFlag = false; + public List fatalErrorCxtList; + + + + + } + + +} diff --git a/src/main/java/a8k/extui/page/test/verification/P51FullFlowVerificationPage.java b/src/main/java/a8k/extui/page/test/verification/P51FullFlowVerificationPage.java index 2c92a1f..2555818 100644 --- a/src/main/java/a8k/extui/page/test/verification/P51FullFlowVerificationPage.java +++ b/src/main/java/a8k/extui/page/test/verification/P51FullFlowVerificationPage.java @@ -2,6 +2,7 @@ package a8k.extui.page.test.verification; import a8k.OS; import a8k.app.a8kproj.A8kReactionResultComputer; +import a8k.app.a8kproj.optalgo.type.OptScanResult; import a8k.app.a8ktype.device.*; import a8k.app.a8ktype.exception.AppException; import a8k.app.a8ktype.param.type.A8kSamplePos; @@ -17,6 +18,7 @@ import a8k.app.service.bases.AppEventBusService; import a8k.app.service.bases.FrontEndMessageBoxAndEventMgr; import a8k.app.service.data.ProjIdCardInfoMgrService; import a8k.app.service.data.ProjInfoMgrService; +import a8k.app.service.data.ReactionRecordMgrService; import a8k.app.service.lowerctrl.*; import a8k.app.utils.ProjBuildinInfo; import a8k.app.utils.ProjInfo; @@ -26,6 +28,7 @@ import a8k.extui.mgr.ExtApiPageMgr; import a8k.extui.type.ExtApiStatu; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.Assert; @@ -68,6 +71,8 @@ public class P51FullFlowVerificationPage { @Resource FrontEndMessageBoxAndEventMgr frontEndMessageBoxAndEventMgr; + @Autowired + private ReactionRecordMgrService reactionRecordMgrService; // @@ -162,7 +167,8 @@ public class P51FullFlowVerificationPage { void procesSample() throws AppException { liquidOperationCtrlService.setProjContext(cxt.projBuildinInfo, cxt.projExtInfoCard); - takeTip(); + if (!hbotMoveExCtrlService.isHasTip()) + takeTip(); if (cxt.projBuildinInfo.reactionFlowType.equals(A8kReactionFlowType.SampleAndBS)) { //param 小瓶缓冲液位置 var preReactionPos = new PreReactionPos(ConsumableType.SmallBottleBuffer, cxt.consumableGroup, cxt.consumablePosOff); @@ -209,20 +215,21 @@ public class P51FullFlowVerificationPage { void scanAndDrop() throws AppException { optScanModuleCtrlService.pullPlate(cxt.incubatorPos); + ProjInfo projInfo = new ProjInfo(); + projInfo.buildIn = cxt.projBuildinInfo; + projInfo.ext = cxt.projExtInfoCard; - for (int i = 0; i < cxt.projBuildinInfo.subProjNum; i++) { - A8kOptType optType = cxt.projBuildinInfo.getOptType(i); - var optScanResult = optScanModuleCtrlService.optScan(cxt.projBuildinInfo, i); - - - ProjInfo projInfo = new ProjInfo(); - projInfo.buildIn = cxt.projBuildinInfo; - projInfo.ext = cxt.projExtInfoCard; + List optScanResults = new ArrayList<>(); + for (int i = 0; i < cxt.projBuildinInfo.subProjNum; i++) { + var optScanResult = optScanModuleCtrlService.optScan(cxt.projBuildinInfo, i); ReactionResult result = A8kReactionResultComputer.optComputeResult(cxt.sampleInfo, projInfo, i, optScanResult.analysResult); cxt.results.add(result); + optScanResults.add(optScanResult); } + reactionRecordMgrService.addRecord(cxt.sampleInfo, projInfo, optScanResults, cxt.results); + }