diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/MainFlowCtrlScheduler.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/MainFlowCtrlScheduler.java index bc8e93e..0d2a881 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/MainFlowCtrlScheduler.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/MainFlowCtrlScheduler.java @@ -37,9 +37,9 @@ public class MainFlowCtrlScheduler implements ApplicationListener allActions = new ArrayList<>(); List foregroundActions = new ArrayList<>(); @@ -159,6 +159,7 @@ public class MainFlowCtrlScheduler implements ApplicationListener { try { return action.doAction(); diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ3_APPLAY_RESOURCE.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ3_APPLAY_RESOURCE.java index e3c346d..2537e8e 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ3_APPLAY_RESOURCE.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ3_APPLAY_RESOURCE.java @@ -1,20 +1,17 @@ package a8k.service.app.appctrl.mainflowctrl.action; +import a8k.constant.LogTopic; import a8k.hardware.type.a8kcanprotocol.A8kEcode; -import a8k.service.app.appctrl.mainflowctrl.MainFlowCtrlScheduler; import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; import a8k.service.app.appctrl.mainflowctrl.base.A8kStepAction; import a8k.service.app.appctrl.mainflowctrl.base.MainFlowProcesser; import a8k.service.app.appdata.ProjInfoMgrService; -import a8k.service.app.appstate.statemgr.ConsumablesMgrService; -import a8k.service.app.appstate.statemgr.IncubationPlateStateMgrService; -import a8k.service.app.appstate.statemgr.ProjectContextMgrService; -import a8k.service.app.appstate.statemgr.TubeStateMgrService; +import a8k.service.app.appstate.statemgr.*; import a8k.service.app.appstate.type.ProjectContext; import a8k.service.app.appstate.type.Tube; import a8k.service.app.appstate.type.state.TubeState; import a8k.service.bases.AppEventBusService; -import a8k.service.bases.appevent.A8kErrorPromptEvent; +import a8k.service.bases.appevent.A8kErrorsPromptEvent; import a8k.service.dao.type.ProjExtInfoCard; import a8k.type.IncubatorPos; import a8k.type.ecode.AEConsumeNotEnoughError; @@ -23,11 +20,13 @@ import a8k.type.pos.Consumable; import a8k.type.pos.TipPos; import a8k.utils.ProjBuildinInfo; import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.util.Assert; +import java.util.ArrayList; import java.util.List; /* @@ -44,17 +43,21 @@ import java.util.List; */ @Component @MainFlowProcesser +@Slf4j(topic = LogTopic.ACTION) public class SEQ3_APPLAY_RESOURCE extends A8kStepAction { - static Logger logger = LoggerFactory.getLogger(SEQ3_APPLAY_RESOURCE.class); - SEQ3_APPLAY_RESOURCE() { super(A8kActionStepType.SEQ3_APPLAY_RESOURCE); } - + // + // BASE + // @Resource AppEventBusService ebus; + // + // STATEMGR + // @Resource ProjectContextMgrService projectContextMgrService; @Resource @@ -63,12 +66,15 @@ public class SEQ3_APPLAY_RESOURCE extends A8kStepAction { ProjInfoMgrService projConfigMgrService; @Resource IncubationPlateStateMgrService incubationPlateStateMgrService; - @Resource - TubeStateMgrService tubeStateMgrService; + TubeStateMgrService tubeStateMgrService; @Resource - MainFlowCtrlScheduler mainFlowCtrlScheduler; + DeviceWorkStateMgrService deviceWorkStateMgrService; + + // + // OVERRID + // public Boolean isReady() { Tube tube = tubeStateMgrService.getCurProcessingTube(); @@ -78,66 +84,59 @@ public class SEQ3_APPLAY_RESOURCE extends A8kStepAction { ; } + @Override public List doActionInLine() { - void bakResource( - Consumable consumable, - List tipPos, - IncubatorPos incubatorPos - ) { - if (consumable != null) { - consumablesMgrService.backConsumable(consumable); - } - if (tipPos != null) { - consumablesMgrService.backTipList(tipPos); - } - if (incubatorPos != null) { - incubationPlateStateMgrService.resetIncubatorPos(incubatorPos); - } - } - - - /** - * 动作处理完成后的处理(串行),一般用于修改状态 - */ - @Override - public List afterDoAction(List errors) { Tube tube = tubeStateMgrService.getCurProcessingTube(); Assert.isTrue(tube != null, "tube != null"); + //如果试管待做项目为空,则直接跳过 if (tube.getProjIds().isEmpty()) { - logger.warn("试管待做项目为空,skip"); + log.warn("试管待做项目为空,skip"); tubeStateMgrService.changeTubeStateToProcessComplete(); return List.of(); } // + List errors = prePareResource(); + if (errors != null && !errors.isEmpty()) { + backProjectResource(tube); + deviceWorkStateMgrService.setHumanInterventionReq(true); + ebus.pushEvent(new A8kErrorsPromptEvent(errors)); + } + log.info("申请耗材完成"); + return List.of(); + } + + + // + // Impl + // + List prePareResource() { + Tube tube = tubeStateMgrService.getCurProcessingTube(); + Assert.isTrue(tube != null, "tube != null"); + // //申请耗材 // - - boolean allySuc = true; + List errors = new ArrayList<>(); //判断是哪个项目耗材不足 for (var toDoProj : tube.getProjInfo()) { - Consumable consumable = consumablesMgrService.takeConsumable(toDoProj.getProjId()); List tipPos = consumablesMgrService.takeTip(toDoProj.getReactionFlowType()); IncubatorPos incubatorPos = incubationPlateStateMgrService.takeOneIncubationIDLEPos(); if (consumable == null || tipPos == null || incubatorPos == null) { if (consumable == null) { - mainFlowCtrlScheduler.reqHumanIntervention(); - logger.error("申请耗材失败,sampleId == {} projindex == {}", tube.getSampleId(), toDoProj.getProjId()); - ebus.pushEvent(new A8kErrorPromptEvent(new AEConsumeNotEnoughError(toDoProj.getProjName()))); + log.error("申请耗材失败,sampleId == {} projindex == {}", tube.getSampleId(), toDoProj.getProjId()); + errors.add(new AEConsumeNotEnoughError(toDoProj.getProjName())); } if (tipPos == null) { - mainFlowCtrlScheduler.reqHumanIntervention(); - logger.error("申请tip失败,sampleId == {} projindex == {}", tube.getSampleId(), toDoProj.getProjId()); - ebus.pushEvent(new A8kErrorPromptEvent(new AppError(A8kEcode.APPE_TIP_NOT_ENOUGH))); + log.error("申请tip失败,sampleId == {} projindex == {}", tube.getSampleId(), toDoProj.getProjId()); + errors.add(new AppError(A8kEcode.APPE_TIP_NOT_ENOUGH)); } Assert.notNull(incubatorPos, "申请孵育盘位置失败"); bakResource(consumable, tipPos, incubatorPos); - allySuc = false; break; } @@ -149,33 +148,57 @@ public class SEQ3_APPLAY_RESOURCE extends A8kStepAction { cxt.setProjInfoStorageCard(projInfo); } + return errors; + } - if (!allySuc) { - for (ProjBuildinInfo proj : tube.getProjInfo()) { + void backProjectResource(Tube tube) { + for (var toDoProj : tube.getProjInfo()) { + ProjectContext cxt = projectContextMgrService.findCxt(tube.getSampleId(), toDoProj.getProjId()); + backProjectResource(cxt); + } + } - ProjectContext cxt = projectContextMgrService.findCxt(tube.getSampleId(), proj.getProjId()); - var consumable = cxt.getConsumable(); - var tipPos = cxt.getTipPos(); - var incubatorPos = cxt.getIncubatorPos(); + void backProjectResource(ProjectContext cxt) { + var consumable = cxt.getConsumable(); + var tipPos = cxt.getTipPos(); + var incubatorPos = cxt.getIncubatorPos(); - if (consumable != null) { - consumablesMgrService.backConsumable(consumable); - } + if (consumable != null) { + consumablesMgrService.backConsumable(consumable); + } - if (tipPos != null) { - consumablesMgrService.backTipList(tipPos); - } + if (tipPos != null) { + consumablesMgrService.backTipList(tipPos); + } - cxt.setConsumable(null); - cxt.setTipPos(null); - cxt.setIncubatorPos(null); - cxt.setProjInfoStorageCard(null); - incubationPlateStateMgrService.resetIncubatorPos(incubatorPos); - } + cxt.setConsumable(null); + cxt.setTipPos(null); + cxt.setIncubatorPos(null); + cxt.setProjInfoStorageCard(null); + + //因为incubatorPos只是打上标记,并没有真的推到赋予盘中,所以不需要执行机械动作 + incubationPlateStateMgrService.resetIncubatorPos(incubatorPos); + } + + + // + // Utils + // + + void bakResource( + Consumable consumable, + List tipPos, + IncubatorPos incubatorPos + ) { + if (consumable != null) { + consumablesMgrService.backConsumable(consumable); + } + if (tipPos != null) { + consumablesMgrService.backTipList(tipPos); + } + if (incubatorPos != null) { + incubationPlateStateMgrService.resetIncubatorPos(incubatorPos); } - logger.info("申请资源成功"); - tubeStateMgrService.changeTubeStateToResourceIsReady(); - return List.of(); } } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/base/A8kStepAction.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/base/A8kStepAction.java index 4350833..cc6a79f 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/base/A8kStepAction.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/base/A8kStepAction.java @@ -36,6 +36,14 @@ public class A8kStepAction { return List.of(); } + // + // 执行动作(串行) + // + public List doActionInLine() { + return List.of(); + } + + /** * 动作处理完成后的处理(串行),一般用于修改状态 */ diff --git a/src/main/java/a8k/service/app/background/ProjIDCardDectorService.java b/src/main/java/a8k/service/app/background/ProjIDCardDectorService.java index 0c8bfe8..27bc45a 100644 --- a/src/main/java/a8k/service/app/background/ProjIDCardDectorService.java +++ b/src/main/java/a8k/service/app/background/ProjIDCardDectorService.java @@ -67,7 +67,7 @@ public class ProjIDCardDectorService { gstate.setMountedIdCardInfo(mountedIdCardInfo); eventBus.pushEvent(new AppIDCardMountEvent(mountedIdCardInfo)); } catch (AppException e) { - eventBus.pushEvent(new A8kErrorPromptEvent(e.error)); + eventBus.pushEvent(new A8kErrorsPromptEvent(e.error)); } diff --git a/src/main/java/a8k/service/bases/appevent/A8kErrorPromptEvent.java b/src/main/java/a8k/service/bases/appevent/A8kErrorPromptEvent.java deleted file mode 100644 index 7c88de4..0000000 --- a/src/main/java/a8k/service/bases/appevent/A8kErrorPromptEvent.java +++ /dev/null @@ -1,22 +0,0 @@ -package a8k.service.bases.appevent; - -import a8k.hardware.type.a8kcanprotocol.A8kEcode; -import a8k.type.ecode.AppError; - -public class A8kErrorPromptEvent extends AppEvent { - public AppError error; - - public A8kErrorPromptEvent(A8kEcode errorCode) { - super(A8kErrorPromptEvent.class.getSimpleName()); - this.error = new AppError(errorCode); - } - - public A8kErrorPromptEvent(AppError erro) { - super(A8kErrorPromptEvent.class.getSimpleName()); - this.error = erro; - } - - public String toString() { - return String.format("%s", error); - } -} diff --git a/src/main/java/a8k/service/bases/appevent/A8kErrorsPromptEvent.java b/src/main/java/a8k/service/bases/appevent/A8kErrorsPromptEvent.java new file mode 100644 index 0000000..e6e6f49 --- /dev/null +++ b/src/main/java/a8k/service/bases/appevent/A8kErrorsPromptEvent.java @@ -0,0 +1,29 @@ +package a8k.service.bases.appevent; + +import a8k.hardware.type.a8kcanprotocol.A8kEcode; +import a8k.type.ecode.AppError; + +import java.util.List; + +public class A8kErrorsPromptEvent extends AppEvent { + public List errors; + + public A8kErrorsPromptEvent(A8kEcode errorCode) { + super(A8kErrorsPromptEvent.class.getSimpleName()); + errors = List.of(new AppError(errorCode)); + } + + public A8kErrorsPromptEvent(AppError erro) { + super(A8kErrorsPromptEvent.class.getSimpleName()); + errors = List.of(erro); + } + + public A8kErrorsPromptEvent(List errors) { + super(A8kErrorsPromptEvent.class.getSimpleName()); + this.errors = errors; + } + + public String toString() { + return String.format("%s", errors); + } +} diff --git a/src/main/java/a8k/service/test/VirtualDeviceSimulationTest.java b/src/main/java/a8k/service/test/VirtualDeviceSimulationTest.java index 0e7904f..c59c222 100644 --- a/src/main/java/a8k/service/test/VirtualDeviceSimulationTest.java +++ b/src/main/java/a8k/service/test/VirtualDeviceSimulationTest.java @@ -247,11 +247,11 @@ public class VirtualDeviceSimulationTest { @ExtApiFn(name = "A8kErrorPromptEvent", group = "虚拟事件", order = 402) public void buildAndSendA8kErrorPromptEvent() { - A8kErrorPromptEvent event = new A8kErrorPromptEvent(new AEConsumeNotEnoughError("Hscrp")); + A8kErrorsPromptEvent event = new A8kErrorsPromptEvent(new AEConsumeNotEnoughError("Hscrp")); eventBus.pushEvent(event); - event = new A8kErrorPromptEvent(new AECodeError("XXXX额外的错误说明XXXX")); + event = new A8kErrorsPromptEvent(new AECodeError("XXXX额外的错误说明XXXX")); eventBus.pushEvent(event); - event = new A8kErrorPromptEvent(new AEHardwareError(A8kEcode.LOW_ERROR_CHECKCODE_IS_ERROR, MId.HbotM, CmdId.step_motor_read_pos)); + event = new A8kErrorsPromptEvent(new AEHardwareError(A8kEcode.LOW_ERROR_CHECKCODE_IS_ERROR, MId.HbotM, CmdId.step_motor_read_pos)); eventBus.pushEvent(event); } diff --git a/src/main/java/a8k/utils/state_machine/AppStateMachine.java b/src/main/java/a8k/utils/state_machine/AppStateMachine.java index c1f902d..97a3388 100644 --- a/src/main/java/a8k/utils/state_machine/AppStateMachine.java +++ b/src/main/java/a8k/utils/state_machine/AppStateMachine.java @@ -1,7 +1,7 @@ package a8k.utils.state_machine; import a8k.service.bases.AppEventBusService; -import a8k.service.bases.appevent.A8kErrorPromptEvent; +import a8k.service.bases.appevent.A8kErrorsPromptEvent; import a8k.type.exception.AppException; import a8k.utils.state_machine.type.event.*; import a8k.utils.state_machine.type.event.base.AppStateMachineEvent; @@ -119,7 +119,7 @@ public class AppStateMachine { currentState.onStateProcess.processer(event); } catch (AppException e) { logger.error("Catch Exception: {},stop device", e.error); - ebus.pushEvent(new A8kErrorPromptEvent(e.error)); + ebus.pushEvent(new A8kErrorsPromptEvent(e.error)); selfStop(); }