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;
}
action.beforeDoAction();
action.doActionInLine();
action.future = executor.submit(() -> {
try {
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;
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,13 +66,16 @@ public class SEQ3_APPLAY_RESOURCE extends A8kStepAction {
ProjInfoMgrService projConfigMgrService;
@Resource
IncubationPlateStateMgrService incubationPlateStateMgrService;
@Resource
TubeStateMgrService tubeStateMgrService;
@Resource
MainFlowCtrlScheduler mainFlowCtrlScheduler;
DeviceWorkStateMgrService deviceWorkStateMgrService;
//
// OVERRID
//
public Boolean isReady() {
Tube tube = tubeStateMgrService.getCurProcessingTube();
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();
Assert.isTrue(tube != null, "tube != null");
//如果试管待做项目为空则直接跳过
if (tube.getProjIds().isEmpty()) {
logger.warn("试管待做项目为空,skip");
log.warn("试管待做项目为空,skip");
tubeStateMgrService.changeTubeStateToProcessComplete();
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()) {
Consumable consumable = consumablesMgrService.takeConsumable(toDoProj.getProjId());
List<TipPos> 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,11 +148,17 @@ 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());
void backProjectResource(ProjectContext cxt) {
var consumable = cxt.getConsumable();
var tipPos = cxt.getTipPos();
var incubatorPos = cxt.getIncubatorPos();
@ -170,12 +175,30 @@ public class SEQ3_APPLAY_RESOURCE extends A8kStepAction {
cxt.setTipPos(null);
cxt.setIncubatorPos(null);
cxt.setProjInfoStorageCard(null);
//因为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();
}
//
// 执行动作(串行)
//
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);
eventBus.pushEvent(new AppIDCardMountEvent(mountedIdCardInfo));
} 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)
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);
}

4
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<T> {
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();
}

Loading…
Cancel
Save