From 6d47a412a5c37d254bdbd63b118cfffc702366d7 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Tue, 24 Dec 2024 21:07:14 +0800 Subject: [PATCH] update --- .../a8k/app/a8kproj/A8kReactionResultComputer.java | 72 +++++-- .../a8k/app/a8ktype/exception/AppException.java | 4 + .../app/service/data/ProjIdCardInfoMgrService.java | 3 + .../mainflowctrl/action/PLATE_OPT_SCAN.java | 2 +- src/main/java/a8k/extui/mgr/ExtApiTabCfgMgr.java | 218 ++++++--------------- .../page/DeviceActionParameterSettingPage.java | 42 ---- .../data/DeviceActionParameterSettingPage.java | 42 ++++ .../java/a8k/extui/page/data/ProjInfoMgrPage.java | 31 +++ .../a8k/extui/page/test/OptFormulaTestPage.java | 124 ++++++++++++ src/main/java/a8k/extui/type/ExUIFunction.java | 27 +++ src/main/java/a8k/extui/type/ExtUITab.java | 11 ++ src/main/java/a8k/extui/type/TabCfg.java | 19 ++ src/main/java/a8k/extui/type/ret/AppRetV1.java | 5 + src/main/java/a8k/unittest/TestOptAnalyzer.java | 2 +- 14 files changed, 384 insertions(+), 218 deletions(-) delete mode 100644 src/main/java/a8k/extui/page/DeviceActionParameterSettingPage.java create mode 100644 src/main/java/a8k/extui/page/data/DeviceActionParameterSettingPage.java create mode 100644 src/main/java/a8k/extui/page/data/ProjInfoMgrPage.java create mode 100644 src/main/java/a8k/extui/page/test/OptFormulaTestPage.java create mode 100644 src/main/java/a8k/extui/type/ExtUITab.java create mode 100644 src/main/java/a8k/extui/type/TabCfg.java diff --git a/src/main/java/a8k/app/a8kproj/A8kReactionResultComputer.java b/src/main/java/a8k/app/a8kproj/A8kReactionResultComputer.java index 19ea5e0..83537f9 100644 --- a/src/main/java/a8k/app/a8kproj/A8kReactionResultComputer.java +++ b/src/main/java/a8k/app/a8kproj/A8kReactionResultComputer.java @@ -35,10 +35,18 @@ public class A8kReactionResultComputer { if (fn.toUint2FnA == null) { return null; } + + double A = fn.toUint2FnA; double B = fn.toUint2FnB != null ? fn.toUint2FnB : 0; - return A * firstResult + B; + double result2 = A * firstResult + B; + log.info("======Compute 2nd Result======"); + log.info("-Fromula : Y = {}X+{}", fmt(fn.toUint2FnA), fmt(fn.toUint2FnB)); + log.info("-Unit :{}", fn.ret2Unit); + log.info("- Input :{}", fmt(firstResult)); + log.info("-Result :{}", fmt(result2)); + return result2; } static private Double compute3rdResult(A8kResultBuilderFn fn, Double firstResult) { @@ -48,35 +56,73 @@ public class A8kReactionResultComputer { if (fn.toUint3FnA == null) { return null; } - double A = fn.toUint3FnA; - double B = fn.toUint3FnB != null ? fn.toUint3FnB : 0; - return A * firstResult + B; + double A = fn.toUint3FnA; + double B = fn.toUint3FnB != null ? fn.toUint3FnB : 0; + double result = A * firstResult + B; + log.info("======Compute 3rd Result======"); + log.info("+Fromula : Y = {}X+{}", fmt(fn.toUint3FnA), fmt(fn.toUint3FnB)); + log.info("+Unit :{}", fn.ret3Unit); + log.info("+ Input :{}", fmt(firstResult)); + log.info("+Result :{}", fmt(result)); + return result; } - // + // + static String fmt(Double val) { + return val == null ? "null" : String.format("%.4f", val); + } //普通函数 static Double callNorFn(OptAnalyzeContext optcxt, A8kNormalFn fn, OptAlgoAnalysResult optAlgoAnalysResult) throws A8kOptProcessException { + log.info("==========NormalFn=========="); + log.info("-XType : {}", fn.x); + log.info("-Fromula : Y = {}X^2+{}X+{}", fmt(fn.A), fmt(fn.B), fmt(fn.C)); + log.info("-XRange : [{}:{}]", fmt(fn.xMin), fmt(fn.xMax)); + log.info("-ResultRange: [{}:{}]", fmt(fn.lowLimit), fmt(fn.upLimit)); + + log.info("-==========Result=========="); Double X = A8kOptXGetter.getX(fn.x, optcxt.getProjOptInfo(), optAlgoAnalysResult); + log.info("-Result:X = {}", fmt(X)); OptChecker.checkX(X, fn.xMin, fn.xMax); Double result1 = fn.A * X * X + fn.B * X + fn.C; + log.info("-Result:{}", fmt(result1)); OptChecker.checkResult1(result1, fn.lowLimit, fn.upLimit); return result1; } + // 分段函数系数 static Double callPiecewiseFn(OptAnalyzeContext optcxt, A8kPiecewiseFn fn, OptAlgoAnalysResult optAlgoAnalysResult) throws A8kOptProcessException { - Double pwFnJudeX = A8kOptXGetter.getX(fn.judeX, optcxt.getProjOptInfo(), optAlgoAnalysResult); - Double X = null; - Double result1 = null; + log.info("==========PiecewiseFn=========="); + log.info("+JudeX :{}", fn.judeX); + log.info("+JudeThres :{}", fmt(fn.judeThres)); + log.info("+lxType :{}", fn.lX); + log.info("+hxType :{}", fn.hX); + log.info("+LX : Y = {}X^2+{}X+{}", fmt(fn.A0), fmt(fn.B0), fmt(fn.C0)); + log.info("+HX : Y = {}X^2+{}X+{}", fmt(fn.A1), fmt(fn.B1), fmt(fn.C1)); + log.info("+XRange : [{}:{}]", fmt(fn.xMin), fmt(fn.xMax)); + log.info("+ResultRange : [{}:{}]", fmt(fn.lowLimit), fmt(fn.upLimit)); + + + Double pwFnJudeX = A8kOptXGetter.getX(fn.judeX, optcxt.getProjOptInfo(), optAlgoAnalysResult); + Double X = null; + Double result1 = null; + boolean isHX = false; if (pwFnJudeX < fn.judeThres) { X = A8kOptXGetter.getX(fn.lX, optcxt.getProjOptInfo(), optAlgoAnalysResult); result1 = fn.A0 * X * X + fn.B0 * X + fn.C0; } else { X = A8kOptXGetter.getX(fn.hX, optcxt.getProjOptInfo(), optAlgoAnalysResult); result1 = fn.A1 * X * X + fn.B1 * X + fn.C1; + isHX = true; } + log.info("+==========Result=========="); + log.info("+XType :{}", isHX ? "HX" : "LX"); + log.info("+XVal :{}", fmt(X)); + log.info("+Result :{}", fmt(result1)); + + OptChecker.checkX(X, fn.xMin, fn.xMax); OptChecker.checkResult1(result1, fn.lowLimit, fn.upLimit); return result1; @@ -93,10 +139,10 @@ public class A8kReactionResultComputer { } static private ReactionResult analyzeResult(OptAnalyzeContext optcxt, OptAlgoAnalysResult optAlgoAnalysResult) throws A8kOptProcessException { -// A8kOptFnFormula fnFormual = optcxt.projInfoCxt.getA8kOptFnFormula(optcxt.subProjIndex); + // A8kOptFnFormula fnFormual = optcxt.projInfoCxt.getA8kOptFnFormula(optcxt.subProjIndex); A8kOptFnFormula fnFormual = ProjInfoUtils.getA8kOptFnFormula(optcxt.projInfoCxt.projExtInfoCard, optcxt.subProjIndex); Assert.isTrue(fnFormual != null, "fnFormual must not be null"); - Double result1 = null; + Double result1 = null; if (fnFormual.fnType.equals(A8kFnType.NormalFn)) { result1 = switch (optcxt.sampleInfo.bloodType) { case WHOLE_BLOOD -> callNorFn(optcxt, fnFormual.bloodNorFn, optAlgoAnalysResult); @@ -112,12 +158,14 @@ public class A8kReactionResultComputer { return buildResult(optcxt, fnFormual.resultBuilderFn, result1); } - static public ReactionResult compute(SampleInfo sampleInfo, ProjInfo projInfoCxt, int subProjIndex, OptAlgoAnalysResult optAlgoAnalysResult) { - log.info("compute: {} proj:[{}:{}]", sampleInfo.sampleId, projInfoCxt.projBaseInfo.projId, subProjIndex); + static public ReactionResult optComputeResult(SampleInfo sampleInfo, ProjInfo projInfoCxt, int subProjIndex, OptAlgoAnalysResult optAlgoAnalysResult) { + log.info("============================================OPT COMPUTE RESULT============================================"); + log.info("optComputeResult:{} proj:{}({}) sub-proj:{}", sampleInfo.sampleId, projInfoCxt.projBaseInfo.projId, projInfoCxt.projBaseInfo.projName, subProjIndex); OptAnalyzeContext optAnalyzeContext = new OptAnalyzeContext(sampleInfo, projInfoCxt, subProjIndex); try { return analyzeResult(optAnalyzeContext, optAlgoAnalysResult); } catch (A8kOptProcessException e) { + log.error("optComputeResult fail:{},{} ", e.status, e.errorMsg); return new ReactionResult(optAnalyzeContext.getProjOptInfo().subProjName, optAnalyzeContext.getProjOptInfo().subProjShortName, e.status, e.errorMsg); } } diff --git a/src/main/java/a8k/app/a8ktype/exception/AppException.java b/src/main/java/a8k/app/a8ktype/exception/AppException.java index 2534298..d900685 100644 --- a/src/main/java/a8k/app/a8ktype/exception/AppException.java +++ b/src/main/java/a8k/app/a8ktype/exception/AppException.java @@ -40,6 +40,10 @@ public class AppException extends Exception { return new AppException(new AEHardwareError(errorCode, mid, null)); } + public static AppException of(A8kEcode errorCode, String exmsg, Object... args) { + return new AppException(new AppError(errorCode, exmsg, args)); + } + public static AppException of(AEHardwareError AEHardwareError) { return new AppException(AEHardwareError); } diff --git a/src/main/java/a8k/app/service/data/ProjIdCardInfoMgrService.java b/src/main/java/a8k/app/service/data/ProjIdCardInfoMgrService.java index 6b99cde..4d8af3a 100644 --- a/src/main/java/a8k/app/service/data/ProjIdCardInfoMgrService.java +++ b/src/main/java/a8k/app/service/data/ProjIdCardInfoMgrService.java @@ -44,6 +44,9 @@ public class ProjIdCardInfoMgrService { a8KProjExtInfoCardDao.addIdCard(projIDCardCtrlAndMonitorService.getMountedIdCardInfo()); } + public ProjExtInfoCard getMountedProjInfoCard() { + return projIDCardCtrlAndMonitorService.getMountedIdCardInfo(); + } public List verifyOptNum(ProjExtInfoCard projExtInfoCard) throws AppException { ProjBuildinInfo projBuildinInfo; diff --git a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/PLATE_OPT_SCAN.java b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/PLATE_OPT_SCAN.java index 01c184d..1dcef5b 100644 --- a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/PLATE_OPT_SCAN.java +++ b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/PLATE_OPT_SCAN.java @@ -97,7 +97,7 @@ public class PLATE_OPT_SCAN extends A8kStepAction { cxt.setOptScanResult(optType, optScanResult); } - ReactionResult result = A8kReactionResultComputer.compute(cxt.getSampleInfo(), ProjInfoUtils.buildProjInfo(cxt), i, optScanResult.analysResult); + ReactionResult result = A8kReactionResultComputer.optComputeResult(cxt.getSampleInfo(), ProjInfoUtils.buildProjInfo(cxt), i, optScanResult.analysResult); reactionResults.add(result); } diff --git a/src/main/java/a8k/extui/mgr/ExtApiTabCfgMgr.java b/src/main/java/a8k/extui/mgr/ExtApiTabCfgMgr.java index e7fd28a..5e80f7c 100644 --- a/src/main/java/a8k/extui/mgr/ExtApiTabCfgMgr.java +++ b/src/main/java/a8k/extui/mgr/ExtApiTabCfgMgr.java @@ -16,211 +16,105 @@ import java.util.List; @Component public class ExtApiTabCfgMgr { - - static int index; - - public enum TabType { - CodeTest, - Verify,//验证 - LowLevelApi,//底层API - - Data, - - + public enum PageGroupType { Public, PosCalibration,//位置标定 OptCalibrationAndVerify,//光学校准和验证 Test, } - //1. 坐标标定与校准 - //2. 光学标定与校准 - //3. 移液枪标定与校准 - //4. 测试 - //5. 过检测试 - //6. 代码测试 - - - ; @Data - public class Config { - public TabType tabType; - public Class service; + public static class Config { + static int staticIndex; + public PageGroupType pageGroupType; + public Class service; public String chName; public Boolean display; - public int index = ExtApiTabCfgMgr.index++; + public int index = staticIndex++; - - public Config(Class service, String chName, TabType tabType) { - this.service = service; - this.display = true; - this.chName = chName; - this.tabType = tabType; + public Config(PageGroupType pageGroupType, Class service, String chName) { + this.service = service; + this.display = true; + this.chName = chName; + this.pageGroupType = pageGroupType; } } - @Resource - ExtApiPageMgr extApiPageMgr; - - - List cfgList = new ArrayList<>(); - - private void reg() { - // /* - // * Calibration - // */ - // cfgList.add(new Config(MiniServoReferencePointIniter.class, "舵机参考点设置", TabType.Calibration)); - // cfgList.add(new Config(ReactionPlatesTransmitControlerCalibration.class, "反应板相关位置校准", TabType.Calibration)); - // cfgList.add(new Config(TubeFeedingModulePosCalibration.class, "试管入料校准", TabType.Calibration)); - // cfgList.add(new Config(TubePreProcesPosCalibration.class, "试管预处理校准", TabType.Calibration)); - // cfgList.add(new Config(Hbot2DCodeScanPosCalibration.class, "耗材扫描校准", TabType.Calibration)); - // cfgList.add(new Config(HbotTipPosCalibration.class, "Tip耗材位置校准", TabType.Calibration)); - // cfgList.add(new Config(HbotLittleBSPosCalibration.class, "小瓶BS耗材位置校准", TabType.Calibration)); - // cfgList.add(new Config(HbotProbeSubstancePosCalibration.class, "探测物质位置校准", TabType.Calibration)); - // cfgList.add(new Config(HbotLargeBottleBSPosCalibration.class, "大瓶BS耗材位置校准", TabType.Calibration)); - // cfgList.add(new Config(HbotSamplePosCalibration.class, "样本位置校准", TabType.Calibration)); - // cfgList.add(new Config(PipetteGunLLDParamCalibration.class, "移液枪LLD参数校准", TabType.Calibration)); - // cfgList.add(new Config(PipetteGunLLFParamCalibration.class, "移液枪LLF参数校准", TabType.Calibration)); - // cfgList.add(new Config(TemperatureCtrlParamCalibration.class, "温度控制参数校准", TabType.Calibration)); - // /* - // * Data - // */ - // cfgList.add(new Config(DeviceActionParameterSettingPage.class, "动作参数配置", TabType.Data)); - // /* - // * Verify - // */ - // cfgList.add(new Config(A8kVerificationUtils.class, "验证.工具", TabType.Verify)); - // cfgList.add(new Config(PipetteGunVerification.class, "验证.移液枪验证", TabType.Verify)); - // cfgList.add(new Config(A8kTemperaturaVerfication.class, "验证.温度控制验证", TabType.Verify)); - // /* - // * LowLevelApi - // */ - // cfgList.add(new Config(PosMeasureUtilsPage.class, "测试.坐标测量", TabType.LowLevelApi)); - // cfgList.add(new Config(PipetteCtrlDriver.class, "硬件驱动.移液枪测试", TabType.LowLevelApi)); - // cfgList.add(new Config(StepMotorCtrlDriver.class, "硬件驱动.步进电机测试", TabType.LowLevelApi)); - // /* - // * CodeTest - // */ - // cfgList.add(new Config(VirtualDeviceSimulationTestPage.class, "虚拟设备测试", TabType.CodeTest)); - // cfgList.add(new Config(MainflowCtrlTestServicePage.class, "主流程控制测试", TabType.CodeTest)); - // - // - // /* - // * OptCalibrationAndVerify - // */ - // cfgList.add(new Config(OptModuleParamCalibration.class, "校准.光学模块参数校准", TabType.OptCalibrationAndVerify)); - // cfgList.add(new Config(A8kOptVerification.class, "验证.光学模组", TabType.OptCalibrationAndVerify)); + public Config getCfg(Class service) { + for (Config cfg : cfgList) { + if (cfg.service == service) { + return cfg; + } + } + return null; } - void regPublicTab() { - cfgList.add(new Config(ExtApiTabCfgMgr.class, "导航", TabType.Public)); - } - /** - * 测试 - */ - private void regTestPage() { - cfgList.add(new Config(DeviceInitTestPage.class, "设备初始化", TabType.Test)); - cfgList.add(new Config(SamplePreProcessTestPage.class, "试管入料", TabType.Test)); - cfgList.add(new Config(LiquidOperationTestPage.class, "液体操作", TabType.Test)); - cfgList.add(new Config(ProjejIDCardTestPage.class, "项目卡校验", TabType.Test)); - } + List cfgList = new ArrayList<>(); - private void regCalibrationPage() { - cfgList.add(new Config(MiniServoReferencePointIniter.class, "舵机参考点设置", TabType.PosCalibration)); - cfgList.add(new Config(ReactionPlatesTransmitControlerCalibration.class, "反应板相关位置校准", TabType.PosCalibration)); - cfgList.add(new Config(TubeFeedingModulePosCalibration.class, "试管入料校准", TabType.PosCalibration)); - cfgList.add(new Config(TubePreProcesPosCalibration.class, "试管预处理校准", TabType.PosCalibration)); - cfgList.add(new Config(Hbot2DCodeScanPosCalibration.class, "耗材扫描校准", TabType.PosCalibration)); - cfgList.add(new Config(HbotTipPosCalibration.class, "Tip耗材位置校准", TabType.PosCalibration)); - cfgList.add(new Config(HbotLittleBSPosCalibration.class, "小瓶BS耗材位置校准", TabType.PosCalibration)); - cfgList.add(new Config(HbotProbeSubstancePosCalibration.class, "探测物质位置校准", TabType.PosCalibration)); - cfgList.add(new Config(HbotLargeBottleBSPosCalibration.class, "大瓶BS耗材位置校准", TabType.PosCalibration)); - cfgList.add(new Config(HbotSamplePosCalibration.class, "样本位置校准", TabType.PosCalibration)); - // cfgList.add(new Config(PipetteGunLLDParamCalibration.class, "移液枪LLD参数校准", TabType.Calibration)); - // cfgList.add(new Config(PipetteGunLLFParamCalibration.class, "移液枪LLF参数校准", TabType.Calibration)); - // cfgList.add(new Config(TemperatureCtrlParamCalibration.class, "温度控制参数校准", TabType.Calibration)); - } + @PostConstruct + void init() { + cfgList.add(new Config(PageGroupType.Public, ExtApiTabCfgMgr.class, "导航")); - private void regOptCalibrationAndVerifyPage() { - cfgList.add(new Config(OptModuleParamCalibration.class, "光学模块参数校准", TabType.OptCalibrationAndVerify)); - cfgList.add(new Config(A8kOptVerification.class, "光学模组验证", TabType.OptCalibrationAndVerify)); + cfgList.add(new Config(PageGroupType.Test, DeviceInitTestPage.class, "设备初始化")); + cfgList.add(new Config(PageGroupType.Test, SamplePreProcessTestPage.class, "试管入料")); + cfgList.add(new Config(PageGroupType.Test, LiquidOperationTestPage.class, "液体操作")); + cfgList.add(new Config(PageGroupType.Test, ProjejIDCardTestPage.class, "项目卡校验")); - } + cfgList.add(new Config(PageGroupType.PosCalibration, MiniServoReferencePointIniter.class, "舵机参考点设置")); + cfgList.add(new Config(PageGroupType.PosCalibration, ReactionPlatesTransmitControlerCalibration.class, "反应板相关位置校准")); + cfgList.add(new Config(PageGroupType.PosCalibration, TubeFeedingModulePosCalibration.class, "试管入料校准")); + cfgList.add(new Config(PageGroupType.PosCalibration, TubePreProcesPosCalibration.class, "试管预处理校准")); + cfgList.add(new Config(PageGroupType.PosCalibration, Hbot2DCodeScanPosCalibration.class, "耗材扫描校准")); + cfgList.add(new Config(PageGroupType.PosCalibration, HbotTipPosCalibration.class, "Tip耗材位置校准")); + cfgList.add(new Config(PageGroupType.PosCalibration, HbotLittleBSPosCalibration.class, "小瓶BS耗材位置校准")); + cfgList.add(new Config(PageGroupType.PosCalibration, HbotProbeSubstancePosCalibration.class, "探测物质位置校准")); + cfgList.add(new Config(PageGroupType.PosCalibration, HbotLargeBottleBSPosCalibration.class, "大瓶BS耗材位置校准")); + cfgList.add(new Config(PageGroupType.PosCalibration, HbotSamplePosCalibration.class, "样本位置校准")); + cfgList.add(new Config(PageGroupType.OptCalibrationAndVerify, OptModuleParamCalibration.class, "光学模块参数校准")); + cfgList.add(new Config(PageGroupType.OptCalibrationAndVerify, A8kOptVerification.class, "光学模组验证")); - @PostConstruct - void init() { - regPublicTab(); - regCalibrationPage(); - regOptCalibrationAndVerifyPage(); - regTestPage(); - displayRefreshPage(TabType.Public); + displayRefreshPage(PageGroupType.Public); regChangePageButton(); } - public Config getCfg(Class service) { + + public void displayRefreshPage(PageGroupType type) { for (Config cfg : cfgList) { - if (cfg.service == service) { - return cfg; - } + cfg.display = cfg.pageGroupType.equals(type) || cfg.pageGroupType.equals(PageGroupType.Public); } - return null; } + // + // CHANGE PAGE BUTTON + // - public void displayRefreshPage(TabType type) { - for (Config cfg : cfgList) { - cfg.display = cfg.tabType.equals(type) || cfg.tabType.equals(TabType.Public); - } - } + @Resource + ExtApiPageMgr extApiPageMgr; - public void changePageToCalibrationRefreshPage() { - displayRefreshPage(TabType.PosCalibration); + public void changePage2PosCalibrationRefreshPage() { + displayRefreshPage(PageGroupType.PosCalibration); } - public void changePageToOptCalibrationAndVerifyRefreshPage() { - displayRefreshPage(TabType.OptCalibrationAndVerify); + public void changePage2OptOptCalibrationAndVerifyRefreshPage() { + displayRefreshPage(PageGroupType.OptCalibrationAndVerify); } - public void changePageToTestRefreshPage() { - displayRefreshPage(TabType.Test); + public void changePage2TestRefreshPage() { + displayRefreshPage(PageGroupType.Test); } private void regChangePageButton() { ExtUIPageCfg page = extApiPageMgr.newPage(this); - // page.addFunction("验证", this::changePageToVerifyRefreshPage); - // page.addFunction("光学校准和验证", this::changePageToOptCalibrationAndVerifyRefreshPage); - // page.addFunction("底层API", this::changePageToLowLevelApiRefreshPage); - // page.addFunction("代码测试", this::changePageToCodeTestRefreshPage); - // page.addFunction("数据", this::changePageToDataRefreshPage); - - page.addFunction("位置标定", this::changePageToCalibrationRefreshPage); - page.addFunction("光学标定与验证", this::changePageToOptCalibrationAndVerifyRefreshPage); - page.addFunction("测试", this::changePageToTestRefreshPage); + page.addFunction("位置标定", this::changePage2PosCalibrationRefreshPage); + page.addFunction("光学标定与验证", this::changePage2OptOptCalibrationAndVerifyRefreshPage); + page.addFunction("测试", this::changePage2TestRefreshPage); extApiPageMgr.addPage(page); } - public void changePageToVerifyRefreshPage() { - displayRefreshPage(TabType.Verify); - } - - - public void changePageToLowLevelApiRefreshPage() { - displayRefreshPage(TabType.LowLevelApi); - } - - public void changePageToCodeTestRefreshPage() { - displayRefreshPage(TabType.CodeTest); - } - - public void changePageToDataRefreshPage() { - displayRefreshPage(TabType.Data); - } - - } diff --git a/src/main/java/a8k/extui/page/DeviceActionParameterSettingPage.java b/src/main/java/a8k/extui/page/DeviceActionParameterSettingPage.java deleted file mode 100644 index 5519b4a..0000000 --- a/src/main/java/a8k/extui/page/DeviceActionParameterSettingPage.java +++ /dev/null @@ -1,42 +0,0 @@ -package a8k.extui.page; - -import a8k.app.controler.filemgr.StorageControler; -import a8k.app.dao.db.DeviceActionParameterDao; -import a8k.extui.mgr.ExtApiPageMgr; -import a8k.extui.type.ExtUIPageCfg; -import a8k.extui.type.ret.FileToBeDownload; -import a8k.extui.type.param.ExtUIFile; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@Slf4j -public class DeviceActionParameterSettingPage { - @Resource - ExtApiPageMgr extApiPageMgr; - - @Resource - DeviceActionParameterDao deviceActionParameterDao; - - public FileToBeDownload exportDeviceActionParam() { - deviceActionParameterDao.export(); - return new FileToBeDownload(StorageControler.getDoloadPath(deviceActionParameterDao.getExportPATH())); - } - - public void importDeviceActionParam(ExtUIFile file) { - String filecontent = new String(file.bytes); - deviceActionParameterDao.importFromCSV(filecontent, true); - } - - - @PostConstruct - void init() throws NoSuchMethodException { - ExtUIPageCfg page = new ExtUIPageCfg(this); - page.addFunction("导出设备动作参数", this::exportDeviceActionParam); - page.addFunction("导入设备动作参数", this::importDeviceActionParam); - - extApiPageMgr.addPage(page); - } -} diff --git a/src/main/java/a8k/extui/page/data/DeviceActionParameterSettingPage.java b/src/main/java/a8k/extui/page/data/DeviceActionParameterSettingPage.java new file mode 100644 index 0000000..7ce427b --- /dev/null +++ b/src/main/java/a8k/extui/page/data/DeviceActionParameterSettingPage.java @@ -0,0 +1,42 @@ +package a8k.extui.page.data; + +import a8k.app.controler.filemgr.StorageControler; +import a8k.app.dao.db.DeviceActionParameterDao; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtUIPageCfg; +import a8k.extui.type.ret.FileToBeDownload; +import a8k.extui.type.param.ExtUIFile; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class DeviceActionParameterSettingPage { + @Resource + ExtApiPageMgr extApiPageMgr; + + @Resource + DeviceActionParameterDao deviceActionParameterDao; + + public FileToBeDownload exportDeviceActionParam() { + deviceActionParameterDao.export(); + return new FileToBeDownload(StorageControler.getDoloadPath(deviceActionParameterDao.getExportPATH())); + } + + public void importDeviceActionParam(ExtUIFile file) { + String filecontent = new String(file.bytes); + deviceActionParameterDao.importFromCSV(filecontent, true); + } + + + @PostConstruct + void init() throws NoSuchMethodException { + ExtUIPageCfg page = new ExtUIPageCfg(this); + page.addFunction("导出设备动作参数", this::exportDeviceActionParam); + page.addFunction("导入设备动作参数", this::importDeviceActionParam); + + extApiPageMgr.addPage(page); + } +} diff --git a/src/main/java/a8k/extui/page/data/ProjInfoMgrPage.java b/src/main/java/a8k/extui/page/data/ProjInfoMgrPage.java new file mode 100644 index 0000000..6b367f1 --- /dev/null +++ b/src/main/java/a8k/extui/page/data/ProjInfoMgrPage.java @@ -0,0 +1,31 @@ +package a8k.extui.page.data; + +import a8k.app.controler.filemgr.StorageControler; +import a8k.app.dao.db.DeviceActionParameterDao; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtUIPageCfg; +import a8k.extui.type.param.ExtUIFile; +import a8k.extui.type.ret.FileToBeDownload; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class ProjInfoMgrPage { + @Resource + ExtApiPageMgr extApiPageMgr; + + // + // 1. 查询设备支持的项目信息 + // 2. 查询设备支持的单位范围 + // 3. 查询设备支持的未知数X的范围 + + + @PostConstruct + void init() throws NoSuchMethodException { + ExtUIPageCfg page = new ExtUIPageCfg(this); + extApiPageMgr.addPage(page); + } +} diff --git a/src/main/java/a8k/extui/page/test/OptFormulaTestPage.java b/src/main/java/a8k/extui/page/test/OptFormulaTestPage.java new file mode 100644 index 0000000..8504818 --- /dev/null +++ b/src/main/java/a8k/extui/page/test/OptFormulaTestPage.java @@ -0,0 +1,124 @@ +package a8k.extui.page.test; + + +import a8k.app.a8kproj.A8kReactionResultComputer; +import a8k.app.a8kproj.optalgo.type.OptAlgoAnalysResult; +import a8k.app.a8ktype.device.BloodType; +import a8k.app.a8ktype.exception.AppException; +import a8k.app.a8ktype.state.SampleInfo; +import a8k.app.a8ktype.type.ReactionResult; +import a8k.app.hardware.type.a8kcanprotocol.A8kEcode; +import a8k.app.service.data.ProjIdCardInfoMgrService; +import a8k.app.service.data.ProjInfoMgrService; +import a8k.app.utils.ProjInfo; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtUIPageCfg; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class OptFormulaTestPage { + + @Resource + ProjInfoMgrService projInfoMgrService; + @Resource + ProjIdCardInfoMgrService projIdCardInfoMgrService; + + @FunctionalInterface + public interface TEST { + Boolean test(); + } + + OptAlgoAnalysResult optAlgoAnalysResult = new OptAlgoAnalysResult(); + + + public void setR(Double val) { + optAlgoAnalysResult.pdR = val; + } + + public void setAR(Double val) { + optAlgoAnalysResult.pdAR = val; + } + + public void setATR(Double val) { + optAlgoAnalysResult.pdATR = val; + } + + public void setRFR(Double val) { + optAlgoAnalysResult.pdRFR = val; + } + + public void setT4R(Double val) { + optAlgoAnalysResult.pdT4R = val; + } + + public void setT4T3R(Double val) { + optAlgoAnalysResult.pdT4T3R = val; + } + + public ProjInfo getProjInfo() throws AppException { + ProjInfo projInfoContext = new ProjInfo(); + var extProjInfo = projIdCardInfoMgrService.getMountedProjInfoCard(); + if (extProjInfo == null) { + throw AppException.of(A8kEcode.APPE_A8K_ID_CARD_NOT_MOUNTED); + } + + projInfoContext.projExtInfoCard = extProjInfo; + projInfoContext.projOptInfoList = projInfoMgrService.getProjBuildInInfo(extProjInfo.projId).projOptInfos; + projInfoContext.projBaseInfo = projInfoMgrService.getProjBuildInInfo(extProjInfo.projId).projBaseInfo; + return projInfoContext; + } + + + public ReactionResult computeResult(BloodType bloodType, Integer optIndex) throws AppException { + SampleInfo sampleInfo = new SampleInfo(); + sampleInfo.sampleId = "TEST_SAMPLE"; + sampleInfo.sampleBarcode = "TEST_BARCODE"; + sampleInfo.bloodType = bloodType; + + ProjInfo projInfoContext = getProjInfo(); + + if (projInfoContext.projOptInfoList.size() <= optIndex) { + throw AppException.of(A8kEcode.CODEERROR, "当前项目没有第%s个子项目", optIndex); + } + return A8kReactionResultComputer.optComputeResult(sampleInfo, projInfoContext, optIndex, optAlgoAnalysResult); + } + + @Resource + ExtApiPageMgr extApiPageMgr; + + @PostConstruct + void init() { + optAlgoAnalysResult.pdR = 0.0; + optAlgoAnalysResult.pdAR = 0.0; + optAlgoAnalysResult.pdATR = 0.0; + optAlgoAnalysResult.pdRFR = 0.0; + optAlgoAnalysResult.pdT4R = 0.0; + optAlgoAnalysResult.pdT4T3R = 0.0; + + + ExtUIPageCfg cfg = extApiPageMgr.newPage(this); + + + cfg.newGroup("项目信息"); + cfg.addFunction("打印项目信息", this::getProjInfo); + + cfg.newGroup("设置参数"); + cfg.addFunction("设置R", this::setR).setParamVal("val", () -> optAlgoAnalysResult.pdR); + cfg.addFunction("设置AR", this::setAR).setParamVal("val", () -> optAlgoAnalysResult.pdAR); + cfg.addFunction("设置ATR", this::setATR).setParamVal("val", () -> optAlgoAnalysResult.pdATR); + cfg.addFunction("设置RFR", this::setRFR).setParamVal("val", () -> optAlgoAnalysResult.pdRFR); + cfg.addFunction("设置T4R", this::setT4R).setParamVal("val", () -> optAlgoAnalysResult.pdT4R); + cfg.addFunction("设置T4T3R", this::setT4T3R).setParamVal("val", () -> optAlgoAnalysResult.pdT4T3R); + + cfg.newGroup("计算"); + cfg.addFunction("计算结果", this::computeResult); + extApiPageMgr.addPage(cfg); + + + } + +} diff --git a/src/main/java/a8k/extui/type/ExUIFunction.java b/src/main/java/a8k/extui/type/ExUIFunction.java index 1068b32..0ec58db 100644 --- a/src/main/java/a8k/extui/type/ExUIFunction.java +++ b/src/main/java/a8k/extui/type/ExUIFunction.java @@ -50,11 +50,38 @@ public class ExUIFunction { return param; } + public void addParam(String paraName) { params.add(newParameter(paraName, getDefauleInitVal(method.getParameters()[params.size()].getType()))); } + ExUIParam getParam(String paraName) { + for (ExUIParam param : params) { + if (param.keyName.equals(paraName)) { + return param; + } + } + return null; + } + + + public ExUIFunction setParamVal(String paraName, Object defaultVal) { + ExUIParam param = getParam(paraName); + param.initValue = defaultVal; + return this; + } + + public ExUIFunction setParamVal(String paraName, ExUIParamGetInitValFnType1 getInitValFn) { + ExUIParam param = getParam(paraName); + param.getInitValFn1 = getInitValFn; + return this; + } + public ExUIFunction setParamVal(String paraName, ExUIParamGetInitValFnType2 getInitValFn) { + ExUIParam param = getParam(paraName); + param.getInitValFn2 = getInitValFn; + return this; + } // public ExUIFunction addParam(String paraName, Object defaultVal) { // params.add(newParameter(paraName, defaultVal)); diff --git a/src/main/java/a8k/extui/type/ExtUITab.java b/src/main/java/a8k/extui/type/ExtUITab.java new file mode 100644 index 0000000..54741bd --- /dev/null +++ b/src/main/java/a8k/extui/type/ExtUITab.java @@ -0,0 +1,11 @@ +package a8k.extui.type; + +import java.util.ArrayList; +import java.util.List; + +public class ExtUITab { + public String tabName; + public List tabCfgList = new ArrayList<>(); + + +} diff --git a/src/main/java/a8k/extui/type/TabCfg.java b/src/main/java/a8k/extui/type/TabCfg.java new file mode 100644 index 0000000..e66e4c7 --- /dev/null +++ b/src/main/java/a8k/extui/type/TabCfg.java @@ -0,0 +1,19 @@ +package a8k.extui.type; + +import lombok.Data; + +@Data +public class TabCfg { + static int staticIndex; + + public Class service; + public String chName; + public Boolean display; + public int index = staticIndex++; + + public TabCfg(Class service, String chName) { + this.service = service; + this.display = true; + this.chName = chName; + } +} diff --git a/src/main/java/a8k/extui/type/ret/AppRetV1.java b/src/main/java/a8k/extui/type/ret/AppRetV1.java index 0eb2293..3fa6dbe 100644 --- a/src/main/java/a8k/extui/type/ret/AppRetV1.java +++ b/src/main/java/a8k/extui/type/ret/AppRetV1.java @@ -3,6 +3,7 @@ package a8k.extui.type.ret; import a8k.app.a8ktype.error.AECodeError; import a8k.app.a8ktype.error.AppError; import a8k.app.a8ktype.exception.AppException; +import a8k.app.hardware.type.a8kcanprotocol.A8kEcode; import a8k.app.i18n.Internationalization; import jakarta.validation.ValidationException; import lombok.Getter; @@ -44,6 +45,10 @@ public class AppRetV1 { if (e instanceof AppException hexcep) { r.ecode = hexcep.error; r.message = Internationalization.A8kEcode2String(r.ecode.code); + if (r.ecode.code.equals(A8kEcode.CODEERROR)) { + r.message = r.ecode.exmsg; + } + } else if (e instanceof ValidationException ex) { r.ecode = new AECodeError(ex.getLocalizedMessage()); r.message = ex.getMessage(); diff --git a/src/main/java/a8k/unittest/TestOptAnalyzer.java b/src/main/java/a8k/unittest/TestOptAnalyzer.java index 00193e8..85adb6d 100644 --- a/src/main/java/a8k/unittest/TestOptAnalyzer.java +++ b/src/main/java/a8k/unittest/TestOptAnalyzer.java @@ -34,7 +34,7 @@ public class TestOptAnalyzer { optAlgoAnalysResult.pdT4R = 1.0; optAlgoAnalysResult.pdT4T3R = 1.0; - ReactionResult result = A8kReactionResultComputer.compute(sampleInfo, projInfoContext, 0, optAlgoAnalysResult); + ReactionResult result = A8kReactionResultComputer.optComputeResult(sampleInfo, projInfoContext, 0, optAlgoAnalysResult); log.info("result: {}", result); return true; }