Browse Source

update

tags/v0
zhaohe 7 months ago
parent
commit
e9d6c60532
  1. 1
      doc/TODO.md
  2. 30
      src/main/java/a8k/app/a8ktype/state/DeviceWorkState.java
  3. 2
      src/main/java/a8k/app/a8ktype/ui/TubeHolderSetting.java
  4. 2
      src/main/java/a8k/app/service/bases/FrontEndMessageBoxAndEventMgr.java
  5. 3
      src/main/java/a8k/app/service/lowerctrl/LiquidOperationCtrlService.java
  6. 11
      src/main/java/a8k/app/service/mainctrl/mainflowctrl/MainFlowCtrlScheduler.java
  7. 2
      src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30ScanTubeHolderTask.java
  8. 11
      src/main/java/a8k/app/service/statemgr/ConsumablesMgrService.java
  9. 49
      src/main/java/a8k/app/service/statemgr/DeviceWorkStateMgrService.java
  10. 27
      src/main/java/a8k/app/service/statemgr/WarningAndErrorFlagMgrService.java
  11. 19
      src/main/java/a8k/extui/page/test/verification/P51FullFlowVerificationPage.java

1
doc/TODO.md

@ -30,4 +30,5 @@
6. 配置页面支持配置设备名称 6. 配置页面支持配置设备名称
7. 配置好设备hostname,支持通过hostname访问设备 7. 配置好设备hostname,支持通过hostname访问设备
8. 设备启动任务之时检查一些光电标志位 8. 设备启动任务之时检查一些光电标志位
9. 解决取样品时,医生忘记打开TIP盖子导致的硬件错误
``` ```

30
src/main/java/a8k/app/a8ktype/state/DeviceWorkState.java

@ -19,19 +19,35 @@ public class DeviceWorkState implements Serializable {
@Schema(description = "错误列表") @Schema(description = "错误列表")
public List<AppActionErrorContext> ecodeList = new ArrayList<>(); public List<AppActionErrorContext> ecodeList = new ArrayList<>();
public A8kWorkState lastWorkState = A8kWorkState.IDLE; //上一个工作状态
@Schema(description = "当前状态是否切换完成")
public Boolean isPending() {
return stopActionPending || pauseActionPending || resumeActionPending || startActionPending;
}
public Boolean consumeNotEnoughErrorFlag = false;
public Boolean tipNotEnoughErrorFlag = false;
public Boolean isWarning() {
return consumeNotEnoughErrorFlag || tipNotEnoughErrorFlag;
}
/**
* 以下状态是为了状态切换逻辑过程中准备的
*/
@JsonIgnore
public A8kWorkState lastWorkState = A8kWorkState.IDLE; //上一个工作状态
@JsonIgnore
public Boolean stopActionPending = false; //停止动作等待 public Boolean stopActionPending = false; //停止动作等待
@JsonIgnore
public Boolean pauseActionPending = false; //暂停动作等待 public Boolean pauseActionPending = false; //暂停动作等待
@JsonIgnore
public Boolean resumeActionPending = false; //恢复动作等待 public Boolean resumeActionPending = false; //恢复动作等待
@JsonIgnore
public Boolean startActionPending = false; //开始动作等待 public Boolean startActionPending = false; //开始动作等待
public Boolean consumeNotEnoughErrorFlag = false;
@Schema(description = "当前状态是否切换完成")
public Boolean isPending() {
return stopActionPending || pauseActionPending || resumeActionPending || startActionPending;
}
public void clearPending() { public void clearPending() {
stopActionPending = false; stopActionPending = false;

2
src/main/java/a8k/app/a8ktype/ui/TubeHolderSetting.java

@ -18,12 +18,10 @@ public class TubeHolderSetting implements Serializable {
@Schema(description = "唯一标识") @Schema(description = "唯一标识")
public String uuid = UUID.randomUUID().toString(); //唯一标识 public String uuid = UUID.randomUUID().toString(); //唯一标识
@Schema(description = "是否激活") @Schema(description = "是否激活")
@JsonIgnore
public Boolean active = false;//是否激活 public Boolean active = false;//是否激活
@Schema(description = "试管配置") @Schema(description = "试管配置")
public TubeSetting[] tubeSettings = new TubeSetting[10]; public TubeSetting[] tubeSettings = new TubeSetting[10];
@Schema(description = "是否锁定(锁住后,该配置不允许被修改)") @Schema(description = "是否锁定(锁住后,该配置不允许被修改)")
@JsonIgnore
public Boolean lock = false;//如果后台已经使用前端不允许修改 public Boolean lock = false;//如果后台已经使用前端不允许修改
public TubeHolderSetting() { public TubeHolderSetting() {

2
src/main/java/a8k/app/service/bases/FrontEndMessageBoxAndEventMgr.java

@ -51,7 +51,7 @@ public class FrontEndMessageBoxAndEventMgr {
} else if (event instanceof AppIDCardUnmountEvent) { } else if (event instanceof AppIDCardUnmountEvent) {
return event; //前端需要更新IDcard的状态 return event; //前端需要更新IDcard的状态
} else if (event instanceof AppTubeholderSettingUpdateEvent) { } else if (event instanceof AppTubeholderSettingUpdateEvent) {
return event;//前端需要更新试管架设置
return null;//不再上报直接从websocket上报消息
} else if (event instanceof DoA8kStepActionEvent) { } else if (event instanceof DoA8kStepActionEvent) {
// return new MessageBoxUpdateEvent(((DoA8kStepActionEvent) event).actionStepName); // return new MessageBoxUpdateEvent(((DoA8kStepActionEvent) event).actionStepName);
return null; return null;

3
src/main/java/a8k/app/service/lowerctrl/LiquidOperationCtrlService.java

@ -85,6 +85,9 @@ public class LiquidOperationCtrlService {
} }
public void forceTakeTip() throws AppException { public void forceTakeTip() throws AppException {
if (hbotMoveExCtrlService.isHasTip()) {
return;
}
while (true) { while (true) {
hbotMoveExCtrlService.takeTip(consumablesMgrService.takeNextTipPos()); hbotMoveExCtrlService.takeTip(consumablesMgrService.takeNextTipPos());
if (gstate.isInMode(DeviceRunMode.RunOnlyMode)) { if (gstate.isInMode(DeviceRunMode.RunOnlyMode)) {

11
src/main/java/a8k/app/service/mainctrl/mainflowctrl/MainFlowCtrlScheduler.java

@ -148,19 +148,19 @@ public class MainFlowCtrlScheduler implements ApplicationListener<ApplicationSta
checkBeforeCall(); checkBeforeCall();
checkBeforeStartOrContinueWork(); checkBeforeStartOrContinueWork();
deviceWorkStateMgrService.setStartActionPending(true); deviceWorkStateMgrService.setStartActionPending(true);
deviceWorkStateMgrService.setConsumeNotEnoughErrorFlag(false);
deviceWorkStateMgrService.clearConsumeNotEnoughErrorFlag();
} }
synchronized public void stopWork() throws AppException { synchronized public void stopWork() throws AppException {
checkBeforeCall(); checkBeforeCall();
deviceWorkStateMgrService.setStopActionPending(true); deviceWorkStateMgrService.setStopActionPending(true);
deviceWorkStateMgrService.setConsumeNotEnoughErrorFlag(false);
deviceWorkStateMgrService.clearConsumeNotEnoughErrorFlag();
} }
synchronized public void pauseWork() throws AppException { synchronized public void pauseWork() throws AppException {
checkBeforeCall(); checkBeforeCall();
deviceWorkStateMgrService.setPauseActionPending(true); deviceWorkStateMgrService.setPauseActionPending(true);
deviceWorkStateMgrService.setConsumeNotEnoughErrorFlag(false);
deviceWorkStateMgrService.clearConsumeNotEnoughErrorFlag();
} }
synchronized public void continueWork() throws AppException { synchronized public void continueWork() throws AppException {
@ -168,7 +168,7 @@ public class MainFlowCtrlScheduler implements ApplicationListener<ApplicationSta
checkBeforeStartOrContinueWork(); checkBeforeStartOrContinueWork();
deviceWorkStateMgrService.setResumeActionPending(true); deviceWorkStateMgrService.setResumeActionPending(true);
deviceWorkStateMgrService.setConsumeNotEnoughErrorFlag(false);
deviceWorkStateMgrService.clearConsumeNotEnoughErrorFlag();
} }
A8kActionTask guessNextAction() { A8kActionTask guessNextAction() {
@ -200,6 +200,7 @@ public class MainFlowCtrlScheduler implements ApplicationListener<ApplicationSta
try { try {
tryDoAction(nextToDo); tryDoAction(nextToDo);
} catch (Exception e) { } catch (Exception e) {
//正常情况下不会出现这种错误
logger.error("error {}", e.getMessage(), e); logger.error("error {}", e.getMessage(), e);
deviceWorkStateMgrService.addError(AppActionErrorContext.of(nextToDo, new AECodeError(e))); deviceWorkStateMgrService.addError(AppActionErrorContext.of(nextToDo, new AECodeError(e)));
} }
@ -257,8 +258,6 @@ public class MainFlowCtrlScheduler implements ApplicationListener<ApplicationSta
if (!errorList.isEmpty()) { if (!errorList.isEmpty()) {
deviceWorkStateMgrService.setFatalErrorFlag(true); deviceWorkStateMgrService.setFatalErrorFlag(true);
deviceWorkStateMgrService.clearPending(); deviceWorkStateMgrService.clearPending();
// ebus.pushEvent(new A8kEcodeContextListPromptEvent(errorList));
for (var error : errorList) { for (var error : errorList) {
ebus.pushEvent(ZAppPromoptFactory.buildAppPromoptEvent(error.ecode)); ebus.pushEvent(ZAppPromoptFactory.buildAppPromoptEvent(error.ecode));
} }

2
src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30ScanTubeHolderTask.java

@ -214,7 +214,7 @@ public class AC30ScanTubeHolderTask extends A8kActionTask {
AppError error = tubeStateMgrService.newTubeHolder(tubeholder); AppError error = tubeStateMgrService.newTubeHolder(tubeholder);
if (error != null) { if (error != null) {
if (error.eq(A8kEcode.APPE_CONSUME_NOT_ENOUGH, A8kEcode.APPE_TIP_NOT_ENOUGH)) { if (error.eq(A8kEcode.APPE_CONSUME_NOT_ENOUGH, A8kEcode.APPE_TIP_NOT_ENOUGH)) {
deviceWorkStateMgrService.setConsumeNotEnoughErrorFlag(true);
deviceWorkStateMgrService.setConsumeNotEnoughErrorFlag();
} }
ebus.pushEvent(new AppWarningNotifyEvent(error)); ebus.pushEvent(new AppWarningNotifyEvent(error));
doEjectHodler(); doEjectHodler();

11
src/main/java/a8k/app/service/statemgr/ConsumablesMgrService.java

@ -310,6 +310,17 @@ public class ConsumablesMgrService {
} }
private synchronized void priSetConsumableGroupNum(ConsumableGroup group, Integer num, Integer reserveNum) { private synchronized void priSetConsumableGroupNum(ConsumableGroup group, Integer num, Integer reserveNum) {
if (num < 0) {
log.error("设置耗材数量小于0", AppException.of(A8kEcode.CODEERROR, "耗材数量设置为零"));
num = 0;
}
if (reserveNum < 0) {
log.error("设置耗材数量小于0", AppException.of(A8kEcode.CODEERROR, "耗材ReserveNum设置为零"));
reserveNum = 0;
}
if (cState.reactionPlateGroup[group.off].isInstall) { if (cState.reactionPlateGroup[group.off].isInstall) {
cState.reactionPlateGroup[group.off].num = num; cState.reactionPlateGroup[group.off].num = num;
cState.reactionPlateGroup[group.off].reserveNum = reserveNum; cState.reactionPlateGroup[group.off].reserveNum = reserveNum;

49
src/main/java/a8k/app/service/statemgr/DeviceWorkStateMgrService.java

@ -19,6 +19,20 @@ public class DeviceWorkStateMgrService {
return deviceWorkState; return deviceWorkState;
} }
synchronized public void addError(List<AppActionErrorContext> errorList) {
deviceWorkState.ecodeList.addAll(errorList);
}
synchronized public void addError(AppActionErrorContext error) {
deviceWorkState.ecodeList.add(error);
}
//
// SETTER
//
synchronized public void setStopActionPending(Boolean stopActionPending) { synchronized public void setStopActionPending(Boolean stopActionPending) {
deviceWorkState.stopActionPending = stopActionPending; deviceWorkState.stopActionPending = stopActionPending;
} }
@ -36,18 +50,19 @@ public class DeviceWorkStateMgrService {
} }
synchronized public void addError(List<AppActionErrorContext> 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() { synchronized public void clearPending() {
deviceWorkState.clearPending(); deviceWorkState.clearPending();
} }
@ -58,28 +73,32 @@ public class DeviceWorkStateMgrService {
deviceWorkState.workState = workState; 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() { synchronized public Boolean getConsumeNotEnoughErrorFlag() {
return deviceWorkState.consumeNotEnoughErrorFlag; return deviceWorkState.consumeNotEnoughErrorFlag;
} }
synchronized public Boolean isDeviceWorking() { synchronized public Boolean isDeviceWorking() {
if (isPending()) { if (isPending()) {
return true; 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;
} }
} }

27
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<AppErrorCxt> fatalErrorCxtList;
}
}

19
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.OS;
import a8k.app.a8kproj.A8kReactionResultComputer; import a8k.app.a8kproj.A8kReactionResultComputer;
import a8k.app.a8kproj.optalgo.type.OptScanResult;
import a8k.app.a8ktype.device.*; import a8k.app.a8ktype.device.*;
import a8k.app.a8ktype.exception.AppException; import a8k.app.a8ktype.exception.AppException;
import a8k.app.a8ktype.param.type.A8kSamplePos; 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.bases.FrontEndMessageBoxAndEventMgr;
import a8k.app.service.data.ProjIdCardInfoMgrService; import a8k.app.service.data.ProjIdCardInfoMgrService;
import a8k.app.service.data.ProjInfoMgrService; import a8k.app.service.data.ProjInfoMgrService;
import a8k.app.service.data.ReactionRecordMgrService;
import a8k.app.service.lowerctrl.*; import a8k.app.service.lowerctrl.*;
import a8k.app.utils.ProjBuildinInfo; import a8k.app.utils.ProjBuildinInfo;
import a8k.app.utils.ProjInfo; import a8k.app.utils.ProjInfo;
@ -26,6 +28,7 @@ import a8k.extui.mgr.ExtApiPageMgr;
import a8k.extui.type.ExtApiStatu; import a8k.extui.type.ExtApiStatu;
import jakarta.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.Assert; import org.springframework.util.Assert;
@ -68,6 +71,8 @@ public class P51FullFlowVerificationPage {
@Resource @Resource
FrontEndMessageBoxAndEventMgr frontEndMessageBoxAndEventMgr; FrontEndMessageBoxAndEventMgr frontEndMessageBoxAndEventMgr;
@Autowired
private ReactionRecordMgrService reactionRecordMgrService;
// //
@ -162,6 +167,7 @@ public class P51FullFlowVerificationPage {
void procesSample() throws AppException { void procesSample() throws AppException {
liquidOperationCtrlService.setProjContext(cxt.projBuildinInfo, cxt.projExtInfoCard); liquidOperationCtrlService.setProjContext(cxt.projBuildinInfo, cxt.projExtInfoCard);
if (!hbotMoveExCtrlService.isHasTip())
takeTip(); takeTip();
if (cxt.projBuildinInfo.reactionFlowType.equals(A8kReactionFlowType.SampleAndBS)) { if (cxt.projBuildinInfo.reactionFlowType.equals(A8kReactionFlowType.SampleAndBS)) {
//param 小瓶缓冲液位置 //param 小瓶缓冲液位置
@ -209,20 +215,21 @@ public class P51FullFlowVerificationPage {
void scanAndDrop() throws AppException { void scanAndDrop() throws AppException {
optScanModuleCtrlService.pullPlate(cxt.incubatorPos); optScanModuleCtrlService.pullPlate(cxt.incubatorPos);
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 projInfo = new ProjInfo();
projInfo.buildIn = cxt.projBuildinInfo; projInfo.buildIn = cxt.projBuildinInfo;
projInfo.ext = cxt.projExtInfoCard; projInfo.ext = cxt.projExtInfoCard;
List<OptScanResult> 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); ReactionResult result = A8kReactionResultComputer.optComputeResult(cxt.sampleInfo, projInfo, i, optScanResult.analysResult);
cxt.results.add(result); cxt.results.add(result);
optScanResults.add(optScanResult);
} }
reactionRecordMgrService.addRecord(cxt.sampleInfo, projInfo, optScanResults, cxt.results);
} }

Loading…
Cancel
Save