Browse Source

update

tags/v0
zhaohe 7 months ago
parent
commit
6d47a412a5
  1. 72
      src/main/java/a8k/app/a8kproj/A8kReactionResultComputer.java
  2. 4
      src/main/java/a8k/app/a8ktype/exception/AppException.java
  3. 3
      src/main/java/a8k/app/service/data/ProjIdCardInfoMgrService.java
  4. 2
      src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/PLATE_OPT_SCAN.java
  5. 218
      src/main/java/a8k/extui/mgr/ExtApiTabCfgMgr.java
  6. 2
      src/main/java/a8k/extui/page/data/DeviceActionParameterSettingPage.java
  7. 31
      src/main/java/a8k/extui/page/data/ProjInfoMgrPage.java
  8. 124
      src/main/java/a8k/extui/page/test/OptFormulaTestPage.java
  9. 27
      src/main/java/a8k/extui/type/ExUIFunction.java
  10. 11
      src/main/java/a8k/extui/type/ExtUITab.java
  11. 19
      src/main/java/a8k/extui/type/TabCfg.java
  12. 5
      src/main/java/a8k/extui/type/ret/AppRetV1.java
  13. 2
      src/main/java/a8k/unittest/TestOptAnalyzer.java

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

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

3
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<A8kEcode> verifyOptNum(ProjExtInfoCard projExtInfoCard) throws AppException {
ProjBuildinInfo projBuildinInfo;

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

218
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<Config> 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<Config> 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);
}
}

2
src/main/java/a8k/extui/page/DeviceActionParameterSettingPage.java → src/main/java/a8k/extui/page/data/DeviceActionParameterSettingPage.java

@ -1,4 +1,4 @@
package a8k.extui.page;
package a8k.extui.page.data;
import a8k.app.controler.filemgr.StorageControler;
import a8k.app.dao.db.DeviceActionParameterDao;

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

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

27
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));

11
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<TabCfg> tabCfgList = new ArrayList<>();
}

19
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;
}
}

5
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();

2
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;
}

Loading…
Cancel
Save