From 39440640035aa6a9514eb73a23b2f44d355d942d Mon Sep 17 00:00:00 2001 From: zhaohe Date: Tue, 22 Oct 2024 13:37:21 +0800 Subject: [PATCH] update --- README2.md | 41 ++++++++++++++++++++++ .../a8k/hardware/type/a8kcanprotocol/A8kEcode.java | 1 + .../service/app/appctrl/AppDeviceCtrlService.java | 10 ++++++ .../app/appctrl/AppMainFlowCtrlService.java | 3 ++ .../mainflowctrl/MainFlowCtrlScheduler.java | 12 +++++++ .../mainflowctrl/action/SEQ4_PRE_PROCESS.java | 16 +++++---- .../a8k/service/test/MainflowCtrlTestService.java | 29 +++++++++++---- src/main/java/a8k/type/ecode/AppCodeError.java | 3 ++ src/main/java/a8k/type/ecode/AppError.java | 7 ++-- src/main/java/a8k/type/exception/AppException.java | 11 ++++++ .../java/a8k/type/exception/MutiAppException.java | 14 ++++++++ src/main/java/a8k/utils/AppExceptionBuilder.java | 8 ++--- src/main/java/a8k/utils/ZFnCall.java | 6 ++-- 13 files changed, 138 insertions(+), 23 deletions(-) create mode 100644 src/main/java/a8k/type/exception/MutiAppException.java diff --git a/README2.md b/README2.md index 6bb8fdf..f192b5f 100644 --- a/README2.md +++ b/README2.md @@ -76,4 +76,45 @@ TestMode 衔接点: +``` + + +``` +TODO: + 1. Mainflow测试页面添加 按钮设备初始化 OK + 2. 添加完善的异常和错误打印机制 OK + 2. 添加一个数据库用来备份坐标数据 + 3. 每个页面添加一个恢复配置的按钮 + 4. 添加一个页面,放置一个按键,保存当前坐标数据,添加一个坐标校验检测功能 + 5. 分离hbot坐标 + 6. 打印完善的错误信息 + 7. 校准预处理坐标 + 8. 校准其他坐标 + 10. 加热功能 + 9. 添加一个页面用来管理移液枪相关参数。 + 1. 液面探测,液面探测方式,c阈值,p阈值 + 2. 吸空检测 + + 采用混合(电容阈值调成比较敏感) + llf_v(容器) 耗材/样本 + 样本-液体类型 c_thr,p_thr 耗材/样本/默认, + get耗材(固定的写死代码) + 样本(已定义枚举,通过参数获得。) + 1. UI选择---> 全血,血清,血浆,尿液,粪便 + + + 1.根据样本类型来进行血清,血浆,全血的选择 + 2. + + 添加一个类,用来获取当前样本是否要进行,吸空检测和液面探测。 + 1. 如果进行,则从数据库中获取对应的参数 + 2. 如果不进行,则直接返回默认值。 +``` + +``` +1. 记录打印功能? +2. 支持通过U盘更新项目信息excel +3. 支持鼠标? + + ``` \ No newline at end of file diff --git a/src/main/java/a8k/hardware/type/a8kcanprotocol/A8kEcode.java b/src/main/java/a8k/hardware/type/a8kcanprotocol/A8kEcode.java index 0a494fc..4e259e9 100644 --- a/src/main/java/a8k/hardware/type/a8kcanprotocol/A8kEcode.java +++ b/src/main/java/a8k/hardware/type/a8kcanprotocol/A8kEcode.java @@ -3,6 +3,7 @@ package a8k.hardware.type.a8kcanprotocol; public enum A8kEcode { SUC(0), + MUTI_APPEXCEPTIONS(1),//内置,无需关心 /* * 代码错误,代码没有BUG的情况下,不应该出现的错误 */ diff --git a/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java b/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java index c7e8092..470ebfc 100644 --- a/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java +++ b/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java @@ -16,12 +16,14 @@ import a8k.type.consumables.ConsumableState; import a8k.type.exception.AppException; import a8k.type.type.TipGroup; import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; @Component +@Slf4j @ExtApiTab(cfg = ExtApiTabConfig.AppDeviceCtrlService) public class AppDeviceCtrlService { @@ -57,21 +59,25 @@ public class AppDeviceCtrlService { +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ @ExtApiFn(name = "开始工作", group = "设备控制") public void startWork() throws AppException { + log.info("开始工作"); mainFlowCtrlSampleScanService.startWork(); } @ExtApiFn(name = "停止工作", group = "设备控制") public void stopWork() { + log.info("停止工作"); mainFlowCtrlSampleScanService.stopWork(); } @ExtApiFn(name = "暂停工作", group = "设备控制") public void pauseWork() { + log.info("暂停工作"); mainFlowCtrlSampleScanService.pauseWork(); } @ExtApiFn(name = "继续工作", group = "设备控制") public void continueWork() { + log.info("继续工作"); mainFlowCtrlSampleScanService.continueWork(); } @@ -80,11 +86,13 @@ public class AppDeviceCtrlService { +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ @ExtApiFn(name = "扫描耗材", group = "耗材扫描") public Map scanConsumables() throws AppException { + log.info("扫描耗材"); return appConsumablesScanService.scanConsumables(); } @ExtApiFn(name = "扫描某一组耗材", group = "耗材扫描") public Map scanOneGroupConsumables(ConsumableGroup group) throws AppException { + log.info("扫描某一组耗材"); return appConsumablesScanService.scanOneGroupConsumables(group); } @@ -188,11 +196,13 @@ public class AppDeviceCtrlService { @ExtApiFn(name = "打开蜂鸣器", group = "主机") public void startBeepWarning() { + log.info("打开蜂鸣器"); beepState = true; } @ExtApiFn(name = "关闭蜂鸣器", group = "主机") public void stopBeepWarning() { + log.info("关闭蜂鸣器"); beepState = false; } diff --git a/src/main/java/a8k/service/app/appctrl/AppMainFlowCtrlService.java b/src/main/java/a8k/service/app/appctrl/AppMainFlowCtrlService.java index df8e5b8..667fa84 100644 --- a/src/main/java/a8k/service/app/appctrl/AppMainFlowCtrlService.java +++ b/src/main/java/a8k/service/app/appctrl/AppMainFlowCtrlService.java @@ -134,6 +134,9 @@ public class AppMainFlowCtrlService { state.errorFlag = true; state.ecodeList = ecodeList; state.workState = A8kWorkState.PAUSE; + }else{ + state.errorFlag = false; + state.ecodeList = ecodeList; } } 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 6e19ad6..00dc2d9 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/MainFlowCtrlScheduler.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/MainFlowCtrlScheduler.java @@ -14,6 +14,7 @@ import a8k.service.app.appstate.type.state.A8kWorkState; import a8k.type.ecode.AppError; import a8k.type.ecode.UnkownExceptionError; import a8k.type.exception.AppException; +import a8k.type.exception.MutiAppException; import a8k.utils.ZStringUtils; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; @@ -127,7 +128,18 @@ public class MainFlowCtrlScheduler { try { key.doaction(); return null; + } catch (MutiAppException mutiAppe) { + List appExceptions = mutiAppe.bindExceptions; + for (AppException appe : appExceptions) { + appe.print(); + } + if(appExceptions.size() > 1){ + logger.warn("发生多个错误,只报告第一个错误"); + } + return new A8kErrorContext(key.step, appExceptions.get(0).error); + } catch (AppException appe) { + appe.print(); return new A8kErrorContext(key.step, appe.error); } catch (Exception exception) { logger.error("Catch unkown exception "); diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java index f987729..e49ec12 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java @@ -167,20 +167,22 @@ public class SEQ4_PRE_PROCESS extends A8kStepAction { wait(doShakeAndTakeCapFuture); wait(doHbotPrepareTipFuture); - List errors = new java.util.ArrayList<>(List.of()); + List exceptions = new java.util.ArrayList<>(List.of()); + List errors = new java.util.ArrayList<>(List.of()); try { - errors.add(doPrepareReactionPlateFuture.get()); - errors.add(doShakeAndTakeCapFuture.get()); - errors.add(doHbotPrepareTipFuture.get()); + exceptions.add(doPrepareReactionPlateFuture.get()); + exceptions.add(doShakeAndTakeCapFuture.get()); + exceptions.add(doHbotPrepareTipFuture.get()); } catch (InterruptedException | ExecutionException ignored) { - } - errors.removeIf(Objects::isNull); + exceptions.removeIf(Objects::isNull); + exceptions.forEach(e -> errors.add(e.getError())); + //如果依然有错误,将试管状态设置为错误,同时抛出异常 if (!errors.isEmpty()) { projectProcessContextMgrService.changeTubeStateToError(gstate.getCurProcessingTube(), errors); logger.error("准备工作出现错误:{}", errors); - throw ebuilder.buildMutiErrorAppException(errors); + throw ebuilder.buildMutiErrorAppException(exceptions); } projectProcessContextMgrService.tubePreProcessingOK(); } diff --git a/src/main/java/a8k/service/test/MainflowCtrlTestService.java b/src/main/java/a8k/service/test/MainflowCtrlTestService.java index 6199981..fdb0293 100644 --- a/src/main/java/a8k/service/test/MainflowCtrlTestService.java +++ b/src/main/java/a8k/service/test/MainflowCtrlTestService.java @@ -1,5 +1,6 @@ package a8k.service.test; +import a8k.OS; import a8k.constant.AppConstant; import a8k.extapi_controler.utils.ExtApiFn; import a8k.extapi_controler.utils.ExtApiTab; @@ -8,6 +9,7 @@ import a8k.service.app.appctrl.AppDeviceCtrlService; import a8k.service.app.appctrl.AppTubeSettingMgrService; import a8k.service.app.appstate.ConsumablesMgrService; import a8k.service.app.appstate.GStateService; +import a8k.service.app.appstate.type.state.A8kWorkState; import a8k.service.app.devicectrl.ctrlservice.ConsumablesScanCtrlService; import a8k.service.db.A8kProjIdCardDBService; import a8k.service.db.A8kProjInfoDBService; @@ -125,13 +127,16 @@ public class MainflowCtrlTestService { // SIMPLE_TEST private List DO_SIMPLE_TEST() throws AppException { log.info("DO_SIMPLE_TEST"); - //启动工作 - List checkResults = appDeviceCtrlService.initDevice(); - for (CheckResult checkResult : checkResults) { - if (!checkResult.pass) { - return checkResults; + + //停止工作 + if (!appDeviceCtrlService.getDeviceWorkState().workState.equals(A8kWorkState.IDLE)) { + appDeviceCtrlService.stopWork(); + while (appDeviceCtrlService.deviceWorkStateIsChanging()) { + log.info("等待设备停止工作...."); + OS.forceSleep(1000); } } + //清空项目的数据库配置 resetProjDB(); //添加项目信息 @@ -151,7 +156,18 @@ public class MainflowCtrlTestService { return null; } - @ExtApiFn(name = "开始测试") + @ExtApiFn(name = "设备初始化", order = 1) + public Object deviceInit() throws AppException { + List checkResults = appDeviceCtrlService.initDevice(); + for (CheckResult checkResult : checkResults) { + if (!checkResult.pass) { + return checkResults; + } + } + return checkResults; + } + + @ExtApiFn(name = "开始测试", order = 2) public Object startTest(MainFlowCtrlTestCaseType castType, Boolean virtualDevice, Boolean virtualTubeScanResult, Boolean noCheck) throws AppException { if (gstate.isWorking()) { throw new AppException(new AppCodeError("设备正在工作中,请先停止工作")); @@ -167,4 +183,5 @@ public class MainflowCtrlTestService { return null; } + } diff --git a/src/main/java/a8k/type/ecode/AppCodeError.java b/src/main/java/a8k/type/ecode/AppCodeError.java index 00b6256..789c403 100644 --- a/src/main/java/a8k/type/ecode/AppCodeError.java +++ b/src/main/java/a8k/type/ecode/AppCodeError.java @@ -1,6 +1,7 @@ package a8k.type.ecode; import a8k.hardware.type.a8kcanprotocol.A8kEcode; +import a8k.utils.ZJsonHelper; public class AppCodeError extends AppError { public String exmsg; @@ -9,4 +10,6 @@ public class AppCodeError extends AppError { super(A8kEcode.CODEERROR); this.exmsg = exmsg; } + + } diff --git a/src/main/java/a8k/type/ecode/AppError.java b/src/main/java/a8k/type/ecode/AppError.java index 78620e0..5270d34 100644 --- a/src/main/java/a8k/type/ecode/AppError.java +++ b/src/main/java/a8k/type/ecode/AppError.java @@ -1,17 +1,18 @@ package a8k.type.ecode; import a8k.hardware.type.a8kcanprotocol.A8kEcode; +import a8k.utils.ZJsonHelper; public class AppError { public A8kEcode code; - public String errorType; + public String errorType; public AppError(A8kEcode errorCode) { - this.code = errorCode; + this.code = errorCode; this.errorType = this.getClass().getSimpleName(); } public String toString() { - return String.format("%s", code); + return ZJsonHelper.objectToJson(this); } } \ No newline at end of file diff --git a/src/main/java/a8k/type/exception/AppException.java b/src/main/java/a8k/type/exception/AppException.java index 2433ba7..3b05341 100644 --- a/src/main/java/a8k/type/exception/AppException.java +++ b/src/main/java/a8k/type/exception/AppException.java @@ -6,10 +6,13 @@ import a8k.hardware.type.a8kcanprotocol.MId; import a8k.type.ecode.AppError; import a8k.type.ecode.HardwareError; import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +@Slf4j @Getter public class AppException extends Exception { // 构造函数 + public AppError error; @@ -39,4 +42,12 @@ public class AppException extends Exception { } + public void print() { + log.error("Apperror: {}", error); + log.error("exception {}", this.toString()); + for (StackTraceElement ste : this.getStackTrace()) { + log.error(ste.toString()); + } + } + } diff --git a/src/main/java/a8k/type/exception/MutiAppException.java b/src/main/java/a8k/type/exception/MutiAppException.java new file mode 100644 index 0000000..86dadbc --- /dev/null +++ b/src/main/java/a8k/type/exception/MutiAppException.java @@ -0,0 +1,14 @@ +package a8k.type.exception; + +import a8k.hardware.type.a8kcanprotocol.A8kEcode; + +import java.util.List; + +public class MutiAppException extends AppException { + public List bindExceptions; + + public MutiAppException(List exceptions) { + super(A8kEcode.MUTI_APPEXCEPTIONS); + bindExceptions = exceptions; + } +} diff --git a/src/main/java/a8k/utils/AppExceptionBuilder.java b/src/main/java/a8k/utils/AppExceptionBuilder.java index 08ff57d..0aeff4c 100644 --- a/src/main/java/a8k/utils/AppExceptionBuilder.java +++ b/src/main/java/a8k/utils/AppExceptionBuilder.java @@ -5,6 +5,7 @@ import a8k.type.ecode.AppCodeError; import a8k.type.ecode.AppError; import a8k.type.ecode.ConsumeNotEnoughError; import a8k.type.exception.AppException; +import a8k.type.exception.MutiAppException; import jakarta.annotation.Resource; import org.slf4j.Logger; import org.springframework.stereotype.Component; @@ -25,11 +26,8 @@ public class AppExceptionBuilder { return new AppException(new ConsumeNotEnoughError(projName)); } - public AppException buildMutiErrorAppException(List errors) { - if (errors.size() > 1) { - logger.error("buildMutiErrorAppException errors size > 1,drop all errors except the first one"); - } - return new AppException(errors.get(0)); + public AppException buildMutiErrorAppException(List exceptions) { + return new MutiAppException(exceptions); } public AppException buildAppCodeErrorException(String extraMsg) { diff --git a/src/main/java/a8k/utils/ZFnCall.java b/src/main/java/a8k/utils/ZFnCall.java index e108863..e4f9f2d 100644 --- a/src/main/java/a8k/utils/ZFnCall.java +++ b/src/main/java/a8k/utils/ZFnCall.java @@ -3,7 +3,9 @@ package a8k.utils; import a8k.type.ecode.AppError; import a8k.type.exception.AppException; +import lombok.extern.slf4j.Slf4j; +@Slf4j public class ZFnCall { @FunctionalInterface @@ -11,11 +13,11 @@ public class ZFnCall { void call() throws AppException; } - public static AppError callfn(Fn fn) { + public static AppException callfn(Fn fn) { try { fn.call(); } catch (AppException e) { - return e.error; + return e; } return null; }