From 9899a6e203afe825ac78ecffd12d8a5c9c44e23c Mon Sep 17 00:00:00 2001 From: zhaohe Date: Sat, 4 Jan 2025 17:18:27 +0800 Subject: [PATCH] update --- .../device/consumables/PreReactionAreaState.java | 17 ++ .../device/consumables/PreReactionGrid.java | 20 ++ .../device/consumables/PreReactionGridGroup.java | 19 ++ .../app/service/mainctrl/AppDeviceCtrlService.java | 26 +- .../mainflowctrl/MainFlowCtrlScheduler.java | 273 +++++++++++++++++++++ .../MainFlowCtrlSchedulerSignalThread.java | 273 --------------------- .../mainflowctrl/action/P30ScanTubeHolderTask.java | 1 - .../mainflowctrl/action/P40ApplyRresoure.java | 1 - .../statemgr/PreReactionAreaStateMgrService.java | 53 ++++ 9 files changed, 384 insertions(+), 299 deletions(-) create mode 100644 src/main/java/a8k/app/a8ktype/device/consumables/PreReactionAreaState.java create mode 100644 src/main/java/a8k/app/a8ktype/device/consumables/PreReactionGrid.java create mode 100644 src/main/java/a8k/app/a8ktype/device/consumables/PreReactionGridGroup.java create mode 100644 src/main/java/a8k/app/service/mainctrl/mainflowctrl/MainFlowCtrlScheduler.java delete mode 100644 src/main/java/a8k/app/service/mainctrl/mainflowctrl/MainFlowCtrlSchedulerSignalThread.java create mode 100644 src/main/java/a8k/app/service/statemgr/PreReactionAreaStateMgrService.java diff --git a/src/main/java/a8k/app/a8ktype/device/consumables/PreReactionAreaState.java b/src/main/java/a8k/app/a8ktype/device/consumables/PreReactionAreaState.java new file mode 100644 index 0000000..08c3d37 --- /dev/null +++ b/src/main/java/a8k/app/a8ktype/device/consumables/PreReactionAreaState.java @@ -0,0 +1,17 @@ +package a8k.app.a8ktype.device.consumables; + +import a8k.app.a8ktype.device.ConsumableGroup; + +import java.util.ArrayList; +import java.util.List; + +public class PreReactionAreaState { + public List gridGroups; + + public PreReactionAreaState() { + gridGroups = new ArrayList<>(); + for (int i = 0; i < 6; i++) { + gridGroups.add(new PreReactionGridGroup(ConsumableGroup.values()[i])); + } + } +} diff --git a/src/main/java/a8k/app/a8ktype/device/consumables/PreReactionGrid.java b/src/main/java/a8k/app/a8ktype/device/consumables/PreReactionGrid.java new file mode 100644 index 0000000..20f318f --- /dev/null +++ b/src/main/java/a8k/app/a8ktype/device/consumables/PreReactionGrid.java @@ -0,0 +1,20 @@ +package a8k.app.a8ktype.device.consumables; + +import a8k.app.a8ktype.device.ConsumableGroup; + +public class PreReactionGrid { + public ConsumableGroup group; + public Integer off; + public Boolean inUse; + + public String projectTaskCxtId; + public Integer preReactionTotleTimeS; + public Long startTime; + public Integer remainTimeS; + + public PreReactionGrid(ConsumableGroup group, Integer off) { + this.group = group; + this.off = off; + + } +} diff --git a/src/main/java/a8k/app/a8ktype/device/consumables/PreReactionGridGroup.java b/src/main/java/a8k/app/a8ktype/device/consumables/PreReactionGridGroup.java new file mode 100644 index 0000000..643f96d --- /dev/null +++ b/src/main/java/a8k/app/a8ktype/device/consumables/PreReactionGridGroup.java @@ -0,0 +1,19 @@ +package a8k.app.a8ktype.device.consumables; + +import a8k.app.a8ktype.device.ConsumableGroup; + +import java.util.ArrayList; +import java.util.List; + +public class PreReactionGridGroup { + public ConsumableGroup group; + public List grids; + + public PreReactionGridGroup(ConsumableGroup group) { + grids = new ArrayList<>(); + this.group = group; + for (int i = 0; i < 6; i++) { + grids.add(new PreReactionGrid(group, i)); + } + } +} diff --git a/src/main/java/a8k/app/service/mainctrl/AppDeviceCtrlService.java b/src/main/java/a8k/app/service/mainctrl/AppDeviceCtrlService.java index 95dc835..d0d2bbf 100644 --- a/src/main/java/a8k/app/service/mainctrl/AppDeviceCtrlService.java +++ b/src/main/java/a8k/app/service/mainctrl/AppDeviceCtrlService.java @@ -1,6 +1,6 @@ package a8k.app.service.mainctrl; -import a8k.app.service.mainctrl.mainflowctrl.MainFlowCtrlSchedulerSignalThread; +import a8k.app.service.mainctrl.mainflowctrl.MainFlowCtrlScheduler; import a8k.app.service.statemgr.ConsumablesMgrService; import a8k.app.service.statemgr.ProjectContextMgrService; @@ -18,29 +18,7 @@ public class AppDeviceCtrlService { GStateMgrService gstate; @Resource - MainFlowCtrlSchedulerSignalThread mainFlowCtrlScheduler; //主流程控制模块 - @Resource - AppConsumablesScanService appConsumablesScanService; //耗材扫描模块 - @Resource - ConsumablesMgrService consumablesMgrService; //耗材管理模块 - @Resource - ProjectContextMgrService projectContextMgrService; //项目处理上下文管理模块 - - // - // /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - // * 设备初始化 - // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - // public List checkBeforeInitDevice() throws AppException { - // return deviceInitializationModule.checkBeforeInitDevice(); - // } - // - // public void initDeviceAsync() throws AppException { - // deviceInitializationModule.initDeviceAsync(); - // backgroudProcessCtrlService.startProcess(); //TODO:将这段代码绑定login事件 - // } - - - + MainFlowCtrlScheduler mainFlowCtrlScheduler; //主流程控制模块 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * 设备控制 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ diff --git a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/MainFlowCtrlScheduler.java b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/MainFlowCtrlScheduler.java new file mode 100644 index 0000000..8e559e8 --- /dev/null +++ b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/MainFlowCtrlScheduler.java @@ -0,0 +1,273 @@ +package a8k.app.service.mainctrl.mainflowctrl; + +import a8k.OS; +import a8k.SpringBootBeanUtil; +import a8k.app.a8ktype.DeviceRunMode; +import a8k.app.a8ktype.appevent.A8kEcodeContextListPromptEvent; +import a8k.app.a8ktype.appevent.A8kErrorsPromptEvent; +import a8k.app.a8ktype.error.AECodeError; +import a8k.app.a8ktype.error.AppError; +import a8k.app.a8ktype.exception.AppException; +import a8k.app.a8ktype.state.DeviceWorkState; +import a8k.app.a8ktype.state.enumtype.A8kWorkState; +import a8k.app.hardware.type.a8kcanprotocol.A8kEcode; +import a8k.app.service.bases.AppEventBusService; +import a8k.app.service.mainctrl.mainflowctrl.base.*; +import a8k.app.service.statemgr.DeviceWorkStateMgrService; +import a8k.app.service.statemgr.GStateMgrService; +import a8k.app.utils.ZStringUtils; +import jakarta.annotation.Resource; +import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.context.event.ApplicationStartedEvent; +import org.springframework.context.ApplicationListener; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +@Component +public class MainFlowCtrlScheduler implements ApplicationListener { + static Logger logger = LoggerFactory.getLogger(MainFlowCtrlScheduler.class); + + + @FunctionalInterface + public interface A8kEcodePostProcesser { + void process(DeviceWorkState state, List ecodeList); + } + + @Resource + GStateMgrService gstate; + @Resource + DeviceWorkStateMgrService deviceWorkStateMgrService; + @Resource + AppEventBusService ebus; + + + List allActions = new ArrayList<>(); + + IMainFlowStateChangeProcesser stateChangeProcesser; + Thread workThread; + + + @Override public void onApplicationEvent(@NotNull ApplicationStartedEvent event) { + //注册所有的action + var classes = SpringBootBeanUtil.getBeans(); + for (var clazz : classes) { + var action = clazz.getAnnotation(MainFlowProcesser.class); + if (null == action) { + continue; + } + + var actionIns = SpringBootBeanUtil.getBean(clazz); + if (actionIns instanceof A8kActionTask obj) { + allActions.add(obj); + + } else if (actionIns instanceof IMainFlowStateChangeProcesser obj) { + stateChangeProcesser = obj; + } + + //根据类的名字对齐排序,对allActions进行排序 + + + } + + allActions.sort((o1, o2) -> { + String name1 = o1.getClass().getSimpleName(); + String name2 = o2.getClass().getSimpleName(); + return name1.compareTo(name2); + }); + + for (var actionTask : allActions) { + logger.info("register action {}", actionTask.getClass().getSimpleName()); + } + workThread = new Thread(this::workFn); + workThread.setName("MainFlowCtrlScheduler"); + workThread.start(); + } + + void checkBeforeCall() throws AppException { + if (!gstate.isInMode(DeviceRunMode.RealMode, DeviceRunMode.VirtualMode, DeviceRunMode.RunOnlyMode)) { + throw AppException.of(A8kEcode.ERROR_WORK_MODE); + } + if (deviceWorkStateMgrService.getDeviceWorkState().fatalErrorFlag) { + deviceWorkStateMgrService.clearPending(); + throw new AppException(A8kEcode.APPE_DEVICE_IS_IN_FATAL_ERROR); + } + } + + synchronized public void startWork() throws AppException { + checkBeforeCall(); + deviceWorkStateMgrService.setStartActionPending(true); + } + + synchronized public void stopWork() throws AppException { + + checkBeforeCall(); + deviceWorkStateMgrService.setStopActionPending(true); + } + + synchronized public void pauseWork() throws AppException { + checkBeforeCall(); + deviceWorkStateMgrService.setPauseActionPending(true); + } + + synchronized public void continueWork() throws AppException { + checkBeforeCall(); + deviceWorkStateMgrService.setResumeActionPending(true); + } + + A8kActionTask guessNextAction() { + for (A8kActionTask action : allActions) { + if (action.isReady()) { + return action; + } + } + return null; + } + + + void tryDoAction(A8kActionTask nextToDo) { + //BEFORE:执行动作 + logger.info("=================={}===================", ZStringUtils.centerStr(nextToDo.toString(), ' ', 30)); + logger.info("= {} -> BEFORE DO:", String.format("%-15s", nextToDo)); + nextToDo.beforeDoAction(); + + //DO:执行动作 + logger.info("= {} -> DO ACTION:", String.format("%-15s", nextToDo)); + List errors = nextToDo.doAction(); + if (errors == null) { + errors = new ArrayList<>(); + } + errors.removeIf(Objects::isNull); + logger.info("= {} -> AFTER ACTION", String.format("%-15s", nextToDo)); + + //AFTER:执行动作 + errors = nextToDo.afterDoAction(errors); + errors.removeIf(Objects::isNull); + deviceWorkStateMgrService.addError(AppActionErrorContext.ofList(nextToDo, errors)); + } + + + void onWorking() { + while (workThread.isAlive()) { + A8kActionTask nextToDo = guessNextAction(); + if (nextToDo != null) { + try { + tryDoAction(nextToDo); + } catch (Exception e) { + logger.error("error {}", e.getMessage(), e); + deviceWorkStateMgrService.addError(AppActionErrorContext.of(nextToDo, new AECodeError(e))); + } + } + // + var state = deviceWorkStateMgrService.getDeviceWorkState(); + if (state.isPending() || !state.ecodeList.isEmpty() || state.manualInterventionFlag) + break; + + if (state.humanInterventionReq) + break; + OS.forceSleep(100); + } + } + + void onPause() { + //DO_NOTHING + } + + void onIDLE() { + //DO_NOTHING + } + + void changeWorkState(A8kWorkState workState) { + deviceWorkStateMgrService.updateWorkState(workState); + var state = deviceWorkStateMgrService.getDeviceWorkState(); + state.lastWorkState = state.workState; + state.workState = workState; + + try { + if (stateChangeProcesser != null) { + switch (workState) { + case IDLE -> stateChangeProcesser.onStop(); + case WORKING -> { + if (state.lastWorkState == A8kWorkState.IDLE) { + stateChangeProcesser.onStart(); + } else { + stateChangeProcesser.onResume(); + } + } + case PAUSE -> stateChangeProcesser.onPause(); + } + } + } catch (AppException e) { + logger.error("catch error do idle,working,pause {}", e.getMessage(), e); + deviceWorkStateMgrService.setFatalErrorFlag(true); + ebus.pushEvent(new A8kErrorsPromptEvent((e.getError()))); + } + } + + void onPostProcessing() { + // + // 如果这里接收到了错误,说明是硬件错误,设备重新启动前无法再继续工作了 + // + var state = deviceWorkStateMgrService.getDeviceWorkState(); + List errorList = state.ecodeList; + if (!errorList.isEmpty()) { + deviceWorkStateMgrService.setFatalErrorFlag(true); + deviceWorkStateMgrService.clearPending(); + deviceWorkStateMgrService.clearHumanInterventionReq(); + ebus.pushEvent(new A8kEcodeContextListPromptEvent(errorList)); + return; + } + + if (state.humanInterventionReq) { + deviceWorkStateMgrService.clearHumanInterventionReq(); + deviceWorkStateMgrService.setPauseActionPending(true); ; + } + // + // 切换状态 + // + if (state.startActionPending) { + if (state.workState == A8kWorkState.IDLE) { + changeWorkState(A8kWorkState.WORKING); + } + } else if (state.pauseActionPending) { + if (state.workState == A8kWorkState.WORKING) { + changeWorkState(A8kWorkState.PAUSE); + } + } else if (state.resumeActionPending) { + if (state.workState == A8kWorkState.PAUSE) { + changeWorkState(A8kWorkState.WORKING); + } + } else if (state.stopActionPending) { + if (state.workState != A8kWorkState.IDLE) { + changeWorkState(A8kWorkState.IDLE); + } + } + deviceWorkStateMgrService.clearPending(); + } + + + void workFn() { + while (workThread.isAlive()) { + var state = deviceWorkStateMgrService.getDeviceWorkState(); + if (state.fatalErrorFlag) { + OS.forceSleep(500); + continue; + } + + switch (state.workState) { + case IDLE -> onIDLE(); + case WORKING -> onWorking(); + case PAUSE -> onPause(); + } + + onPostProcessing(); + OS.forceSleep(500); + } + } + + +} diff --git a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/MainFlowCtrlSchedulerSignalThread.java b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/MainFlowCtrlSchedulerSignalThread.java deleted file mode 100644 index 5731ff8..0000000 --- a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/MainFlowCtrlSchedulerSignalThread.java +++ /dev/null @@ -1,273 +0,0 @@ -package a8k.app.service.mainctrl.mainflowctrl; - -import a8k.OS; -import a8k.SpringBootBeanUtil; -import a8k.app.a8ktype.DeviceRunMode; -import a8k.app.a8ktype.appevent.A8kEcodeContextListPromptEvent; -import a8k.app.a8ktype.appevent.A8kErrorsPromptEvent; -import a8k.app.a8ktype.error.AECodeError; -import a8k.app.a8ktype.error.AppError; -import a8k.app.a8ktype.exception.AppException; -import a8k.app.a8ktype.state.DeviceWorkState; -import a8k.app.a8ktype.state.enumtype.A8kWorkState; -import a8k.app.hardware.type.a8kcanprotocol.A8kEcode; -import a8k.app.service.bases.AppEventBusService; -import a8k.app.service.mainctrl.mainflowctrl.base.*; -import a8k.app.service.statemgr.DeviceWorkStateMgrService; -import a8k.app.service.statemgr.GStateMgrService; -import a8k.app.utils.ZStringUtils; -import jakarta.annotation.Resource; -import org.jetbrains.annotations.NotNull; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.context.event.ApplicationStartedEvent; -import org.springframework.context.ApplicationListener; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -@Component -public class MainFlowCtrlSchedulerSignalThread implements ApplicationListener { - static Logger logger = LoggerFactory.getLogger(MainFlowCtrlSchedulerSignalThread.class); - - - @FunctionalInterface - public interface A8kEcodePostProcesser { - void process(DeviceWorkState state, List ecodeList); - } - - @Resource - GStateMgrService gstate; - @Resource - DeviceWorkStateMgrService deviceWorkStateMgrService; - @Resource - AppEventBusService ebus; - - - List allActions = new ArrayList<>(); - - IMainFlowStateChangeProcesser stateChangeProcesser; - Thread workThread; - - - @Override public void onApplicationEvent(@NotNull ApplicationStartedEvent event) { - //注册所有的action - var classes = SpringBootBeanUtil.getBeans(); - for (var clazz : classes) { - var action = clazz.getAnnotation(MainFlowProcesser.class); - if (null == action) { - continue; - } - - var actionIns = SpringBootBeanUtil.getBean(clazz); - if (actionIns instanceof A8kActionTask obj) { - allActions.add(obj); - - } else if (actionIns instanceof IMainFlowStateChangeProcesser obj) { - stateChangeProcesser = obj; - } - - //根据类的名字对齐排序,对allActions进行排序 - - - } - - allActions.sort((o1, o2) -> { - String name1 = o1.getClass().getSimpleName(); - String name2 = o2.getClass().getSimpleName(); - return name1.compareTo(name2); - }); - - for (var actionTask : allActions) { - logger.info("register action {}", actionTask.getClass().getSimpleName()); - } - workThread = new Thread(this::workFn); - workThread.setName("MainFlowCtrlScheduler"); - workThread.start(); - } - - void checkBeforeCall() throws AppException { - if (!gstate.isInMode(DeviceRunMode.RealMode, DeviceRunMode.VirtualMode, DeviceRunMode.RunOnlyMode)) { - throw AppException.of(A8kEcode.ERROR_WORK_MODE); - } - if (deviceWorkStateMgrService.getDeviceWorkState().fatalErrorFlag) { - deviceWorkStateMgrService.clearPending(); - throw new AppException(A8kEcode.APPE_DEVICE_IS_IN_FATAL_ERROR); - } - } - - synchronized public void startWork() throws AppException { - checkBeforeCall(); - deviceWorkStateMgrService.setStartActionPending(true); - } - - synchronized public void stopWork() throws AppException { - - checkBeforeCall(); - deviceWorkStateMgrService.setStopActionPending(true); - } - - synchronized public void pauseWork() throws AppException { - checkBeforeCall(); - deviceWorkStateMgrService.setPauseActionPending(true); - } - - synchronized public void continueWork() throws AppException { - checkBeforeCall(); - deviceWorkStateMgrService.setResumeActionPending(true); - } - - A8kActionTask guessNextAction() { - for (A8kActionTask action : allActions) { - if (action.isReady()) { - return action; - } - } - return null; - } - - - void tryDoAction(A8kActionTask nextToDo) { - //BEFORE:执行动作 - logger.info("=================={}===================", ZStringUtils.centerStr(nextToDo.toString(), ' ', 30)); - logger.info("= {} -> BEFORE DO:", String.format("%-15s", nextToDo)); - nextToDo.beforeDoAction(); - - //DO:执行动作 - logger.info("= {} -> DO ACTION:", String.format("%-15s", nextToDo)); - List errors = nextToDo.doAction(); - if (errors == null) { - errors = new ArrayList<>(); - } - errors.removeIf(Objects::isNull); - logger.info("= {} -> AFTER ACTION", String.format("%-15s", nextToDo)); - - //AFTER:执行动作 - errors = nextToDo.afterDoAction(errors); - errors.removeIf(Objects::isNull); - deviceWorkStateMgrService.addError(AppActionErrorContext.ofList(nextToDo, errors)); - } - - - void onWorking() { - while (workThread.isAlive()) { - A8kActionTask nextToDo = guessNextAction(); - if (nextToDo != null) { - try { - tryDoAction(nextToDo); - } catch (Exception e) { - logger.error("error {}", e.getMessage(), e); - deviceWorkStateMgrService.addError(AppActionErrorContext.of(nextToDo, new AECodeError(e))); - } - } - - var state = deviceWorkStateMgrService.getDeviceWorkState(); - if (state.isPending() || !state.ecodeList.isEmpty() || state.manualInterventionFlag) - break; - - if (state.humanInterventionReq) - break; - OS.forceSleep(100); - } - } - - void onPause() { - //DO_NOTHING - } - - void onIDLE() { - //DO_NOTHING - } - - void changeWorkState(A8kWorkState workState) { - deviceWorkStateMgrService.updateWorkState(workState); - var state = deviceWorkStateMgrService.getDeviceWorkState(); - state.lastWorkState = state.workState; - state.workState = workState; - - try { - if (stateChangeProcesser != null) { - switch (workState) { - case IDLE -> stateChangeProcesser.onStop(); - case WORKING -> { - if (state.lastWorkState == A8kWorkState.IDLE) { - stateChangeProcesser.onStart(); - } else { - stateChangeProcesser.onResume(); - } - } - case PAUSE -> stateChangeProcesser.onPause(); - } - } - } catch (AppException e) { - logger.error("catch error do idle,working,pause {}", e.getMessage(), e); - deviceWorkStateMgrService.setFatalErrorFlag(true); - ebus.pushEvent(new A8kErrorsPromptEvent((e.getError()))); - } - } - - void onPostProcessing() { - // - // 如果这里接收到了错误,说明是硬件错误,设备重新启动前无法再继续工作了 - // - var state = deviceWorkStateMgrService.getDeviceWorkState(); - List errorList = state.ecodeList; - if (!errorList.isEmpty()) { - deviceWorkStateMgrService.setFatalErrorFlag(true); - deviceWorkStateMgrService.clearPending(); - deviceWorkStateMgrService.clearHumanInterventionReq(); - ebus.pushEvent(new A8kEcodeContextListPromptEvent(errorList)); - return; - } - - if (state.humanInterventionReq) { - deviceWorkStateMgrService.clearHumanInterventionReq(); - deviceWorkStateMgrService.setPauseActionPending(true); ; - } - // - // 切换状态 - // - if (state.startActionPending) { - if (state.workState == A8kWorkState.IDLE) { - changeWorkState(A8kWorkState.WORKING); - } - } else if (state.pauseActionPending) { - if (state.workState == A8kWorkState.WORKING) { - changeWorkState(A8kWorkState.PAUSE); - } - } else if (state.resumeActionPending) { - if (state.workState == A8kWorkState.PAUSE) { - changeWorkState(A8kWorkState.WORKING); - } - } else if (state.stopActionPending) { - if (state.workState != A8kWorkState.IDLE) { - changeWorkState(A8kWorkState.IDLE); - } - } - deviceWorkStateMgrService.clearPending(); - } - - - void workFn() { - while (workThread.isAlive()) { - var state = deviceWorkStateMgrService.getDeviceWorkState(); - if (state.fatalErrorFlag) { - OS.forceSleep(500); - continue; - } - - switch (state.workState) { - case IDLE -> onIDLE(); - case WORKING -> onWorking(); - case PAUSE -> onPause(); - } - - onPostProcessing(); - OS.forceSleep(500); - } - } - - -} diff --git a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/P30ScanTubeHolderTask.java b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/P30ScanTubeHolderTask.java index 6d9e911..bcbfe5f 100644 --- a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/P30ScanTubeHolderTask.java +++ b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/P30ScanTubeHolderTask.java @@ -277,5 +277,4 @@ public class P30ScanTubeHolderTask extends A8kActionTask { newTubeHolder = null; return new ArrayList<>(); } - } diff --git a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/P40ApplyRresoure.java b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/P40ApplyRresoure.java index adbd1be..fe44e18 100644 --- a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/P40ApplyRresoure.java +++ b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/P40ApplyRresoure.java @@ -94,7 +94,6 @@ public class P40ApplyRresoure extends A8kActionTask { List errors = prePareResource(); if (errors != null && !errors.isEmpty()) { log.warn("申请耗材失败,请求人工干预"); - backProjectResource(tube); deviceWorkStateMgrService.setHumanInterventionReq(true); ebus.pushEvent(new A8kErrorsPromptEvent(errors)); diff --git a/src/main/java/a8k/app/service/statemgr/PreReactionAreaStateMgrService.java b/src/main/java/a8k/app/service/statemgr/PreReactionAreaStateMgrService.java new file mode 100644 index 0000000..187e87d --- /dev/null +++ b/src/main/java/a8k/app/service/statemgr/PreReactionAreaStateMgrService.java @@ -0,0 +1,53 @@ +package a8k.app.service.statemgr; + +import a8k.app.a8ktype.device.ConsumableGroup; +import a8k.app.a8ktype.device.consumables.PreReactionAreaState; +import a8k.app.a8ktype.device.consumables.PreReactionGridGroup; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class PreReactionAreaStateMgrService { + public PreReactionAreaState preReactionAreaState = new PreReactionAreaState(); + + public synchronized PreReactionAreaState getState() { + return preReactionAreaState; + } + + public synchronized void takeAwayMixLiquid(ConsumableGroup group, Integer posoff) { + var grid = preReactionAreaState.gridGroups.get(group.ordinal()).grids.get(posoff); + grid.inUse = false; + grid.projectTaskCxtId = null; + grid.startTime = 0l; + grid.remainTimeS = 0; + grid.preReactionTotleTimeS = 0; + } + + public synchronized void startPreIncubation(ConsumableGroup group, Integer posoff, String projectTaskCxtId, Integer preIncubationTotleTimeS) { + var grid = preReactionAreaState.gridGroups.get(group.ordinal()).grids.get(posoff); + grid.inUse = true; + grid.projectTaskCxtId = projectTaskCxtId; + grid.startTime = System.currentTimeMillis(); + grid.remainTimeS = preIncubationTotleTimeS; + grid.preReactionTotleTimeS = preIncubationTotleTimeS; + } + + + @Scheduled(fixedDelay = 500) + synchronized public void updateRemainTime() { + for (PreReactionGridGroup group : preReactionAreaState.gridGroups) { + group.grids.forEach(grid -> { + if (grid.inUse) { + grid.remainTimeS = (int) ((grid.preReactionTotleTimeS * 1000 - (System.currentTimeMillis() - grid.startTime)) / 1000); + if (grid.remainTimeS <= 0) { + grid.remainTimeS = 0; + } + } + }); + } + } + + +}