Browse Source

update

tags/v0
zhaohe 9 months ago
parent
commit
0f3a8f4de3
  1. 1
      src/main/java/a8k/service/app/appctrl/mainflowctrl/MainFlowCtrlScheduler.java
  2. 123
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ3_APPLAY_RESOURCE.java
  3. 8
      src/main/java/a8k/service/app/appctrl/mainflowctrl/base/A8kStepAction.java
  4. 2
      src/main/java/a8k/service/app/background/ProjIDCardDectorService.java
  5. 22
      src/main/java/a8k/service/bases/appevent/A8kErrorPromptEvent.java
  6. 29
      src/main/java/a8k/service/bases/appevent/A8kErrorsPromptEvent.java
  7. 6
      src/main/java/a8k/service/test/VirtualDeviceSimulationTest.java
  8. 4
      src/main/java/a8k/utils/state_machine/AppStateMachine.java

1
src/main/java/a8k/service/app/appctrl/mainflowctrl/MainFlowCtrlScheduler.java

@ -159,6 +159,7 @@ public class MainFlowCtrlScheduler implements ApplicationListener<ApplicationSta
return; return;
} }
action.beforeDoAction(); action.beforeDoAction();
action.doActionInLine();
action.future = executor.submit(() -> { action.future = executor.submit(() -> {
try { try {
return action.doAction(); return action.doAction();

123
src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ3_APPLAY_RESOURCE.java

@ -1,20 +1,17 @@
package a8k.service.app.appctrl.mainflowctrl.action; package a8k.service.app.appctrl.mainflowctrl.action;
import a8k.constant.LogTopic;
import a8k.hardware.type.a8kcanprotocol.A8kEcode; 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.A8kActionStepType;
import a8k.service.app.appctrl.mainflowctrl.base.A8kStepAction; import a8k.service.app.appctrl.mainflowctrl.base.A8kStepAction;
import a8k.service.app.appctrl.mainflowctrl.base.MainFlowProcesser; import a8k.service.app.appctrl.mainflowctrl.base.MainFlowProcesser;
import a8k.service.app.appdata.ProjInfoMgrService; 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.ProjectContext;
import a8k.service.app.appstate.type.Tube; import a8k.service.app.appstate.type.Tube;
import a8k.service.app.appstate.type.state.TubeState; import a8k.service.app.appstate.type.state.TubeState;
import a8k.service.bases.AppEventBusService; 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.service.dao.type.ProjExtInfoCard;
import a8k.type.IncubatorPos; import a8k.type.IncubatorPos;
import a8k.type.ecode.AEConsumeNotEnoughError; import a8k.type.ecode.AEConsumeNotEnoughError;
@ -23,11 +20,13 @@ import a8k.type.pos.Consumable;
import a8k.type.pos.TipPos; import a8k.type.pos.TipPos;
import a8k.utils.ProjBuildinInfo; import a8k.utils.ProjBuildinInfo;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import java.util.ArrayList;
import java.util.List; import java.util.List;
/* /*
@ -44,17 +43,21 @@ import java.util.List;
*/ */
@Component @Component
@MainFlowProcesser @MainFlowProcesser
@Slf4j(topic = LogTopic.ACTION)
public class SEQ3_APPLAY_RESOURCE extends A8kStepAction { public class SEQ3_APPLAY_RESOURCE extends A8kStepAction {
static Logger logger = LoggerFactory.getLogger(SEQ3_APPLAY_RESOURCE.class);
SEQ3_APPLAY_RESOURCE() { SEQ3_APPLAY_RESOURCE() {
super(A8kActionStepType.SEQ3_APPLAY_RESOURCE); super(A8kActionStepType.SEQ3_APPLAY_RESOURCE);
} }
//
// BASE
//
@Resource @Resource
AppEventBusService ebus; AppEventBusService ebus;
//
// STATEMGR
//
@Resource @Resource
ProjectContextMgrService projectContextMgrService; ProjectContextMgrService projectContextMgrService;
@Resource @Resource
@ -63,13 +66,16 @@ public class SEQ3_APPLAY_RESOURCE extends A8kStepAction {
ProjInfoMgrService projConfigMgrService; ProjInfoMgrService projConfigMgrService;
@Resource @Resource
IncubationPlateStateMgrService incubationPlateStateMgrService; IncubationPlateStateMgrService incubationPlateStateMgrService;
@Resource @Resource
TubeStateMgrService tubeStateMgrService; TubeStateMgrService tubeStateMgrService;
@Resource @Resource
MainFlowCtrlScheduler mainFlowCtrlScheduler;
DeviceWorkStateMgrService deviceWorkStateMgrService;
//
// OVERRID
//
public Boolean isReady() { public Boolean isReady() {
Tube tube = tubeStateMgrService.getCurProcessingTube(); Tube tube = tubeStateMgrService.getCurProcessingTube();
return tube != null return tube != null
@ -78,66 +84,59 @@ public class SEQ3_APPLAY_RESOURCE extends A8kStepAction {
; ;
} }
@Override public List<AppError> doActionInLine() {
void bakResource(
Consumable consumable,
List<TipPos> tipPos,
IncubatorPos incubatorPos
) {
if (consumable != null) {
consumablesMgrService.backConsumable(consumable);
}
if (tipPos != null) {
consumablesMgrService.backTipList(tipPos);
}
if (incubatorPos != null) {
incubationPlateStateMgrService.resetIncubatorPos(incubatorPos);
}
}
/**
* 动作处理完成后的处理串行一般用于修改状态
*/
@Override
public List<AppError> afterDoAction(List<AppError> errors) {
Tube tube = tubeStateMgrService.getCurProcessingTube(); Tube tube = tubeStateMgrService.getCurProcessingTube();
Assert.isTrue(tube != null, "tube != null"); Assert.isTrue(tube != null, "tube != null");
//如果试管待做项目为空则直接跳过
if (tube.getProjIds().isEmpty()) { if (tube.getProjIds().isEmpty()) {
logger.warn("试管待做项目为空,skip");
log.warn("试管待做项目为空,skip");
tubeStateMgrService.changeTubeStateToProcessComplete(); tubeStateMgrService.changeTubeStateToProcessComplete();
return List.of(); return List.of();
} }
// //
List<AppError> errors = prePareResource();
if (errors != null && !errors.isEmpty()) {
backProjectResource(tube);
deviceWorkStateMgrService.setHumanInterventionReq(true);
ebus.pushEvent(new A8kErrorsPromptEvent(errors));
}
log.info("申请耗材完成");
return List.of();
}
//
// Impl
//
List<AppError> prePareResource() {
Tube tube = tubeStateMgrService.getCurProcessingTube();
Assert.isTrue(tube != null, "tube != null");
//
//申请耗材 //申请耗材
// //
boolean allySuc = true;
List<AppError> errors = new ArrayList<>();
//判断是哪个项目耗材不足 //判断是哪个项目耗材不足
for (var toDoProj : tube.getProjInfo()) { for (var toDoProj : tube.getProjInfo()) {
Consumable consumable = consumablesMgrService.takeConsumable(toDoProj.getProjId()); Consumable consumable = consumablesMgrService.takeConsumable(toDoProj.getProjId());
List<TipPos> tipPos = consumablesMgrService.takeTip(toDoProj.getReactionFlowType()); List<TipPos> tipPos = consumablesMgrService.takeTip(toDoProj.getReactionFlowType());
IncubatorPos incubatorPos = incubationPlateStateMgrService.takeOneIncubationIDLEPos(); IncubatorPos incubatorPos = incubationPlateStateMgrService.takeOneIncubationIDLEPos();
if (consumable == null || tipPos == null || incubatorPos == null) { if (consumable == null || tipPos == null || incubatorPos == null) {
if (consumable == 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) { 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, "申请孵育盘位置失败"); Assert.notNull(incubatorPos, "申请孵育盘位置失败");
bakResource(consumable, tipPos, incubatorPos); bakResource(consumable, tipPos, incubatorPos);
allySuc = false;
break; break;
} }
@ -149,11 +148,17 @@ public class SEQ3_APPLAY_RESOURCE extends A8kStepAction {
cxt.setProjInfoStorageCard(projInfo); 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());
void backProjectResource(ProjectContext cxt) {
var consumable = cxt.getConsumable(); var consumable = cxt.getConsumable();
var tipPos = cxt.getTipPos(); var tipPos = cxt.getTipPos();
var incubatorPos = cxt.getIncubatorPos(); var incubatorPos = cxt.getIncubatorPos();
@ -170,12 +175,30 @@ public class SEQ3_APPLAY_RESOURCE extends A8kStepAction {
cxt.setTipPos(null); cxt.setTipPos(null);
cxt.setIncubatorPos(null); cxt.setIncubatorPos(null);
cxt.setProjInfoStorageCard(null); cxt.setProjInfoStorageCard(null);
//因为incubatorPos只是打上标记并没有真的推到赋予盘中所以不需要执行机械动作
incubationPlateStateMgrService.resetIncubatorPos(incubatorPos); incubationPlateStateMgrService.resetIncubatorPos(incubatorPos);
} }
//
// Utils
//
void bakResource(
Consumable consumable,
List<TipPos> 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();
} }
} }

8
src/main/java/a8k/service/app/appctrl/mainflowctrl/base/A8kStepAction.java

@ -36,6 +36,14 @@ public class A8kStepAction {
return List.of(); return List.of();
} }
//
// 执行动作(串行)
//
public List<AppError> doActionInLine() {
return List.of();
}
/** /**
* 动作处理完成后的处理串行一般用于修改状态 * 动作处理完成后的处理串行一般用于修改状态
*/ */

2
src/main/java/a8k/service/app/background/ProjIDCardDectorService.java

@ -67,7 +67,7 @@ public class ProjIDCardDectorService {
gstate.setMountedIdCardInfo(mountedIdCardInfo); gstate.setMountedIdCardInfo(mountedIdCardInfo);
eventBus.pushEvent(new AppIDCardMountEvent(mountedIdCardInfo)); eventBus.pushEvent(new AppIDCardMountEvent(mountedIdCardInfo));
} catch (AppException e) { } catch (AppException e) {
eventBus.pushEvent(new A8kErrorPromptEvent(e.error));
eventBus.pushEvent(new A8kErrorsPromptEvent(e.error));
} }

22
src/main/java/a8k/service/bases/appevent/A8kErrorPromptEvent.java

@ -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);
}
}

29
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<AppError> 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<AppError> errors) {
super(A8kErrorsPromptEvent.class.getSimpleName());
this.errors = errors;
}
public String toString() {
return String.format("%s", errors);
}
}

6
src/main/java/a8k/service/test/VirtualDeviceSimulationTest.java

@ -247,11 +247,11 @@ public class VirtualDeviceSimulationTest {
@ExtApiFn(name = "A8kErrorPromptEvent", group = "虚拟事件", order = 402) @ExtApiFn(name = "A8kErrorPromptEvent", group = "虚拟事件", order = 402)
public void buildAndSendA8kErrorPromptEvent() { public void buildAndSendA8kErrorPromptEvent() {
A8kErrorPromptEvent event = new A8kErrorPromptEvent(new AEConsumeNotEnoughError("Hscrp"));
A8kErrorsPromptEvent event = new A8kErrorsPromptEvent(new AEConsumeNotEnoughError("Hscrp"));
eventBus.pushEvent(event); eventBus.pushEvent(event);
event = new A8kErrorPromptEvent(new AECodeError("XXXX额外的错误说明XXXX"));
event = new A8kErrorsPromptEvent(new AECodeError("XXXX额外的错误说明XXXX"));
eventBus.pushEvent(event); 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); eventBus.pushEvent(event);
} }

4
src/main/java/a8k/utils/state_machine/AppStateMachine.java

@ -1,7 +1,7 @@
package a8k.utils.state_machine; package a8k.utils.state_machine;
import a8k.service.bases.AppEventBusService; import a8k.service.bases.AppEventBusService;
import a8k.service.bases.appevent.A8kErrorPromptEvent;
import a8k.service.bases.appevent.A8kErrorsPromptEvent;
import a8k.type.exception.AppException; import a8k.type.exception.AppException;
import a8k.utils.state_machine.type.event.*; import a8k.utils.state_machine.type.event.*;
import a8k.utils.state_machine.type.event.base.AppStateMachineEvent; import a8k.utils.state_machine.type.event.base.AppStateMachineEvent;
@ -119,7 +119,7 @@ public class AppStateMachine<T> {
currentState.onStateProcess.processer(event); currentState.onStateProcess.processer(event);
} catch (AppException e) { } catch (AppException e) {
logger.error("Catch Exception: {},stop device", e.error); logger.error("Catch Exception: {},stop device", e.error);
ebus.pushEvent(new A8kErrorPromptEvent(e.error));
ebus.pushEvent(new A8kErrorsPromptEvent(e.error));
selfStop(); selfStop();
} }

Loading…
Cancel
Save