Browse Source

update

tags/v0
zhaohe 7 months ago
parent
commit
b5d2ebe118
  1. 2
      appresource/static/engineer/css/app.ae9236bd.css
  2. 2
      appresource/static/engineer/index.html
  3. 2
      appresource/static/engineer/js/app.15f44a8f.js
  4. 1
      appresource/static/engineer/js/app.15f44a8f.js.map
  5. 2
      appresource/static/engineer/js/app.c4a7361a.js
  6. 1
      appresource/static/engineer/js/app.c4a7361a.js.map
  7. 6
      appresource/static/engineer/js/chunk-vendors.5158647c.js
  8. 2
      appresource/static/engineer/js/chunk-vendors.5158647c.js.map
  9. 90
      src/main/java/a8k/app/a8kproj/A8kReactionResultComputer.java
  10. 16
      src/main/java/a8k/app/a8kproj/optalgo/A8kOptAlgoV2.java
  11. 19
      src/main/java/a8k/app/a8kproj/optalgo/type/A8kOptPeaks.java
  12. 23
      src/main/java/a8k/app/a8kproj/optalgo/type/OptAlgoAnalysResult.java
  13. 7
      src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java
  14. 3
      src/main/java/a8k/extui/page/opt_calibration/OptFormulaTestPage.java
  15. 176
      src/main/java/a8k/extui/page/opt_calibration/OptFormulaTestPageV2.java
  16. 33
      src/main/java/a8k/utils/ZloggerRecorder.java

2
appresource/static/engineer/css/app.74a8cb1a.css → appresource/static/engineer/css/app.ae9236bd.css

@ -1,4 +1,4 @@
.vjs-tree-brackets{cursor:pointer}.vjs-tree-brackets:hover{color:#1890ff}.vjs-check-controller{position:absolute;left:0}.vjs-check-controller.is-checked .vjs-check-controller-inner{background-color:#1890ff;border-color:#0076e4}.vjs-check-controller.is-checked .vjs-check-controller-inner.is-checkbox:after{-webkit-transform:rotate(45deg) scaleY(1);transform:rotate(45deg) scaleY(1)}.vjs-check-controller.is-checked .vjs-check-controller-inner.is-radio:after{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}.vjs-check-controller .vjs-check-controller-inner{display:inline-block;position:relative;border:1px solid #bfcbd9;border-radius:2px;vertical-align:middle;-webkit-box-sizing:border-box;box-sizing:border-box;width:16px;height:16px;background-color:#fff;z-index:1;cursor:pointer;-webkit-transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46)}.vjs-check-controller .vjs-check-controller-inner:after{-webkit-box-sizing:content-box;box-sizing:content-box;content:"";border:2px solid #fff;border-left:0;border-top:0;height:8px;left:4px;position:absolute;top:1px;-webkit-transform:rotate(45deg) scaleY(0);transform:rotate(45deg) scaleY(0);width:4px;-webkit-transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) .05s;transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) .05s;transition:transform .15s cubic-bezier(.71,-.46,.88,.6) .05s;transition:transform .15s cubic-bezier(.71,-.46,.88,.6) .05s,-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) .05s;-webkit-transform-origin:center;transform-origin:center}.vjs-check-controller .vjs-check-controller-inner.is-radio{border-radius:100%}.vjs-check-controller .vjs-check-controller-inner.is-radio:after{border-radius:100%;height:4px;background-color:#fff;left:50%;top:50%}.vjs-check-controller .vjs-check-controller-original{opacity:0;outline:none;position:absolute;z-index:-1;top:0;left:0;right:0;bottom:0;margin:0}.vjs-carets{position:absolute;right:0;cursor:pointer}.vjs-carets svg{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.vjs-carets:hover{color:#1890ff}.vjs-carets-close{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.vjs-tree-node{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative;line-height:20px}.vjs-tree-node.has-carets{padding-left:15px}.vjs-tree-node.has-carets.has-selector,.vjs-tree-node.has-selector{padding-left:30px}.vjs-tree-node.is-highlight,.vjs-tree-node:hover{background-color:#e6f7ff}.vjs-tree-node .vjs-indent{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative}.vjs-tree-node .vjs-indent-unit{width:1em}.vjs-tree-node .vjs-indent-unit.has-line{border-left:1px dashed #bfcbd9}.vjs-tree-node.dark.is-highlight,.vjs-tree-node.dark:hover{background-color:#2e4558}.vjs-node-index{position:absolute;right:100%;margin-right:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vjs-colon{white-space:pre}.vjs-comment{color:#bfcbd9}.vjs-value{word-break:break-word}.vjs-value-null,.vjs-value-undefined{color:#d55fde}.vjs-value-boolean,.vjs-value-number{color:#1d8ce0}.vjs-value-string{color:#13ce66}.vjs-tree{font-family:Monaco,Menlo,Consolas,Bitstream Vera Sans Mono,monospace;font-size:14px;text-align:left}.vjs-tree.is-virtual{overflow:auto}.vjs-tree.is-virtual .vjs-tree-node{white-space:nowrap}.action-param-label[data-v-69612837]{font-size:.6rem;top:-8px;position:absolute;z-index:9;left:5px;padding:0 5px;color:#7b7b7b}.action-button[data-v-69612837],.fixed-length-button[data-v-69612837]{white-space:normal;word-break:break-word}.fixed-length-button[data-v-69612837]{min-width:230px}
.vjs-tree-brackets{cursor:pointer}.vjs-tree-brackets:hover{color:#1890ff}.vjs-check-controller{position:absolute;left:0}.vjs-check-controller.is-checked .vjs-check-controller-inner{background-color:#1890ff;border-color:#0076e4}.vjs-check-controller.is-checked .vjs-check-controller-inner.is-checkbox:after{-webkit-transform:rotate(45deg) scaleY(1);transform:rotate(45deg) scaleY(1)}.vjs-check-controller.is-checked .vjs-check-controller-inner.is-radio:after{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}.vjs-check-controller .vjs-check-controller-inner{display:inline-block;position:relative;border:1px solid #bfcbd9;border-radius:2px;vertical-align:middle;-webkit-box-sizing:border-box;box-sizing:border-box;width:16px;height:16px;background-color:#fff;z-index:1;cursor:pointer;-webkit-transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46);transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46)}.vjs-check-controller .vjs-check-controller-inner:after{-webkit-box-sizing:content-box;box-sizing:content-box;content:"";border:2px solid #fff;border-left:0;border-top:0;height:8px;left:4px;position:absolute;top:1px;-webkit-transform:rotate(45deg) scaleY(0);transform:rotate(45deg) scaleY(0);width:4px;-webkit-transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) .05s;transition:-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) .05s;transition:transform .15s cubic-bezier(.71,-.46,.88,.6) .05s;transition:transform .15s cubic-bezier(.71,-.46,.88,.6) .05s,-webkit-transform .15s cubic-bezier(.71,-.46,.88,.6) .05s;-webkit-transform-origin:center;transform-origin:center}.vjs-check-controller .vjs-check-controller-inner.is-radio{border-radius:100%}.vjs-check-controller .vjs-check-controller-inner.is-radio:after{border-radius:100%;height:4px;background-color:#fff;left:50%;top:50%}.vjs-check-controller .vjs-check-controller-original{opacity:0;outline:none;position:absolute;z-index:-1;top:0;left:0;right:0;bottom:0;margin:0}.vjs-carets{position:absolute;right:0;cursor:pointer}.vjs-carets svg{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.vjs-carets:hover{color:#1890ff}.vjs-carets-close{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.vjs-tree-node{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative;line-height:20px}.vjs-tree-node.has-carets{padding-left:15px}.vjs-tree-node.has-carets.has-selector,.vjs-tree-node.has-selector{padding-left:30px}.vjs-tree-node.is-highlight,.vjs-tree-node:hover{background-color:#e6f7ff}.vjs-tree-node .vjs-indent{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative}.vjs-tree-node .vjs-indent-unit{width:1em}.vjs-tree-node .vjs-indent-unit.has-line{border-left:1px dashed #bfcbd9}.vjs-tree-node.dark.is-highlight,.vjs-tree-node.dark:hover{background-color:#2e4558}.vjs-node-index{position:absolute;right:100%;margin-right:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vjs-colon{white-space:pre}.vjs-comment{color:#bfcbd9}.vjs-value{word-break:break-word}.vjs-value-null,.vjs-value-undefined{color:#d55fde}.vjs-value-boolean,.vjs-value-number{color:#1d8ce0}.vjs-value-string{color:#13ce66}.vjs-tree{font-family:Monaco,Menlo,Consolas,Bitstream Vera Sans Mono,monospace;font-size:14px;text-align:left}.vjs-tree.is-virtual{overflow:auto}.vjs-tree.is-virtual .vjs-tree-node{white-space:nowrap}.wrap-text[data-v-48bc040e]{white-space:pre-wrap;word-wrap:break-word}.max-height[data-v-48bc040e]{max-height:20vh;overflow-y:auto}.group-container[data-v-48bc040e]{height:100%;display:flex;flex-direction:column}.action-param-label[data-v-69612837]{font-size:.6rem;top:-8px;position:absolute;z-index:9;left:5px;padding:0 5px;color:#7b7b7b}.action-button[data-v-69612837],.fixed-length-button[data-v-69612837]{white-space:normal;word-break:break-word}.fixed-length-button[data-v-69612837]{min-width:230px}
/*
! tailwindcss v3.4.4 | MIT License | https://tailwindcss.com

2
appresource/static/engineer/index.html

@ -1 +1 @@
<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>a8k_webui</title><script defer="defer" src="js/chunk-vendors.a96a0e7f.js"></script><script defer="defer" src="js/app.c4a7361a.js"></script><link href="css/app.74a8cb1a.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but a8k_webui doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>
<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>a8k_webui</title><script defer="defer" src="js/chunk-vendors.5158647c.js"></script><script defer="defer" src="js/app.15f44a8f.js"></script><link href="css/app.ae9236bd.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but a8k_webui doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>

2
appresource/static/engineer/js/app.15f44a8f.js
File diff suppressed because it is too large
View File

1
appresource/static/engineer/js/app.15f44a8f.js.map
File diff suppressed because it is too large
View File

2
appresource/static/engineer/js/app.c4a7361a.js
File diff suppressed because it is too large
View File

1
appresource/static/engineer/js/app.c4a7361a.js.map
File diff suppressed because it is too large
View File

6
appresource/static/engineer/js/chunk-vendors.5158647c.js
File diff suppressed because it is too large
View File

2
appresource/static/engineer/js/chunk-vendors.5158647c.js.map
File diff suppressed because it is too large
View File

90
src/main/java/a8k/app/a8kproj/A8kReactionResultComputer.java

@ -15,7 +15,9 @@ import a8k.app.a8ktype.type.ReactionResult;
import a8k.app.a8ktype.opttype.ReactionResultStatus;
import a8k.app.utils.ProjInfo;
import a8k.app.utils.ProjInfoUtils;
import a8k.utils.ZloggerRecorder;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;
//
@ -27,6 +29,11 @@ import org.springframework.util.Assert;
@Slf4j
public class A8kReactionResultComputer {
static ZloggerRecorder zloggerRecorder = new ZloggerRecorder(LoggerFactory.getLogger(A8kReactionResultComputer.class));
static String fmt(Double val) {
return val == null ? "null" : String.format("%.5f", val);
}
static private Double compute2ndResult(A8kResultBuilderFn fn, Double firstResult) {
if (fn.ret2Unit == null) {
@ -41,11 +48,11 @@ public class A8kReactionResultComputer {
double B = fn.toUint2FnB != null ? fn.toUint2FnB : 0;
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));
zloggerRecorder.info("======Compute 2nd Result======");
zloggerRecorder.info("-Fromula : Y = %sX+%s", fmt(fn.toUint2FnA), fmt(fn.toUint2FnB));
zloggerRecorder.info("-Unit :%s", fn.ret2Unit);
zloggerRecorder.info("-Input :%s", fmt(firstResult));
zloggerRecorder.info("-Result :%s", fmt(result2));
return result2;
}
@ -59,34 +66,32 @@ public class A8kReactionResultComputer {
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));
zloggerRecorder.info("======Compute 3rd Result======");
zloggerRecorder.info("+Fromula : Y = %sX+%s", fmt(fn.toUint3FnA), fmt(fn.toUint3FnB));
zloggerRecorder.info("+Unit :%s", fn.ret3Unit);
zloggerRecorder.info("+ Input :%s", fmt(firstResult));
zloggerRecorder.info("+Result :%s", 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));
zloggerRecorder.info("==========NormalFn==========");
zloggerRecorder.info("-XType : %s", fn.x);
zloggerRecorder.info("-Fromula : Y = %sX^2+%sX+%s", fmt(fn.A), fmt(fn.B), fmt(fn.C));
zloggerRecorder.info("-XRange : [%s:%s]", fmt(fn.xMin), fmt(fn.xMax));
zloggerRecorder.info("-ResultRange: [%s:%s]", fmt(fn.lowLimit), fmt(fn.upLimit));
log.info("-==========Result==========");
zloggerRecorder.info("-==========Result==========");
Double X = A8kOptXGetter.getX(fn.x, optcxt.getProjOptInfo(), optAlgoAnalysResult);
log.info("-Result:X = {}", fmt(X));
zloggerRecorder.info("-Result:X = %s", 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));
zloggerRecorder.info("-Result:%s", fmt(result1));
OptChecker.checkResult1(result1, fn.lowLimit, fn.upLimit);
return result1;
}
@ -94,15 +99,15 @@ public class A8kReactionResultComputer {
// 分段函数系数
static Double callPiecewiseFn(OptAnalyzeContext optcxt, A8kPiecewiseFn fn, OptAlgoAnalysResult optAlgoAnalysResult) throws A8kOptProcessException {
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));
zloggerRecorder.info("==========PiecewiseFn==========");
zloggerRecorder.info("+JudeX :%s", fn.judeX);
zloggerRecorder.info("+JudeThres :%s", fmt(fn.judeThres));
zloggerRecorder.info("+lxType :%s", fn.lX);
zloggerRecorder.info("+hxType :%s", fn.hX);
zloggerRecorder.info("+LX : Y = %sX^3 + %sX^2 + %sX + %s", fmt(fn.A0), fmt(fn.B0), fmt(fn.C0), fmt(fn.D0));
zloggerRecorder.info("+HX : Y = %sX^3 + %sX^2 + %sX + %s", fmt(fn.A1), fmt(fn.B1), fmt(fn.C1), fmt(fn.D1));
zloggerRecorder.info("+XRange : [%s:%s]", fmt(fn.xMin), fmt(fn.xMax));
zloggerRecorder.info("+ResultRange : [%s:%s]", fmt(fn.lowLimit), fmt(fn.upLimit));
Double pwFnJudeX = A8kOptXGetter.getX(fn.judeX, optcxt.getProjOptInfo(), optAlgoAnalysResult);
@ -111,17 +116,17 @@ public class A8kReactionResultComputer {
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;
result1 = fn.A0 * X * X * X + fn.B0 * X * X + fn.C0 * X + fn.D0;
} else {
X = A8kOptXGetter.getX(fn.hX, optcxt.getProjOptInfo(), optAlgoAnalysResult);
result1 = fn.A1 * X * X + fn.B1 * X + fn.C1;
result1 = fn.A1 * X * X * X + fn.B1 * X * X + fn.C1 * X + fn.D1;
isHX = true;
}
log.info("+==========Result==========");
log.info("+JudeX :{}", fmt(pwFnJudeX));
log.info("+FnType :{}", isHX ? "HX" : "LX");
log.info("+XVal :{}", fmt(X));
log.info("+Result :{}", fmt(result1));
zloggerRecorder.info("+==========Result==========");
zloggerRecorder.info("+JudeX :%s", fmt(pwFnJudeX));
zloggerRecorder.info("+FnType :%s", isHX ? "HX" : "LX");
zloggerRecorder.info("+XVal :%s", fmt(X));
zloggerRecorder.info("+Result :%s", fmt(result1));
OptChecker.checkX(X, fn.xMin, fn.xMax);
@ -160,16 +165,21 @@ public class A8kReactionResultComputer {
}
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);
zloggerRecorder.clear();
zloggerRecorder.info("================OPT COMPUTE RESULT=============");
zloggerRecorder.info("optComputeResult:%s proj:%s(%s) sub-proj:%s", 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);
zloggerRecorder.error("optComputeResult fail:%s,%s ", e.status, e.errorMsg);
return new ReactionResult(optAnalyzeContext.getProjOptInfo().subProjName, optAnalyzeContext.getProjOptInfo().subProjShortName, e.status, e.errorMsg);
}
}
static public String getComputeContext() {
return zloggerRecorder.getRecord();
}
}

16
src/main/java/a8k/app/a8kproj/optalgo/A8kOptAlgoV2.java

@ -72,21 +72,7 @@ public class A8kOptAlgoV2 {
PeakNameAssigner.assignPeakName(projInfo.projId, projOptInfo.peakNameRefNum, peaks);
OptAlgoAnalysResult result = new OptAlgoAnalysResult();
result.resultData = afSubSampling;
result.rawData = rawData;
result.T4 = peaks.findPeak(PeakName.T4);
result.R = peaks.findPeak(PeakName.R);
result.H = peaks.findPeak(PeakName.H);
result.T = peaks.findPeak(PeakName.T);
result.C = peaks.findPeak(PeakName.C);
result.pdR = PeakDivisionComputer.computePeakDivision(PeakDivision.R, peaks);
result.pdAR = PeakDivisionComputer.computePeakDivision(PeakDivision.AR, peaks);
result.pdATR = PeakDivisionComputer.computePeakDivision(PeakDivision.ATR, peaks);
result.pdRFR = PeakDivisionComputer.computePeakDivision(PeakDivision.RFR, peaks);
result.pdT4R = PeakDivisionComputer.computePeakDivision(PeakDivision.T4R, peaks);
result.pdT4T3R = PeakDivisionComputer.computePeakDivision(PeakDivision.T4T3R, peaks);
return result;
return OptAlgoAnalysResult.build(rawData, afSubSampling, peaks);
}
double findAvgLine(double[] inputRaw) {

19
src/main/java/a8k/app/a8kproj/optalgo/type/A8kOptPeaks.java

@ -10,6 +10,25 @@ public class A8kOptPeaks {
public A8kOptPeak P160 = new A8kOptPeak();
public A8kOptPeak P200 = new A8kOptPeak();
public void trySetPeakArea(PeakName peakName, Double area) {
Assert.notNull(peakName, "peakName must not be null");
if (peakName.equals(P040.peakName)) {
P040.area = area;
}
if (peakName.equals(P080.peakName)) {
P080.area = area;
}
if (peakName.equals(P120.peakName)) {
P120.area = area;
}
if (peakName.equals(P160.peakName)) {
P160.area = area;
}
if (peakName.equals(P200.peakName)) {
P200.area = area;
}
}
public A8kOptPeak findPeak(PeakName peakName) {
Assert.notNull(peakName, "peakName must not be null");
if (peakName.equals(P040.peakName)) {

23
src/main/java/a8k/app/a8kproj/optalgo/type/OptAlgoAnalysResult.java

@ -1,5 +1,9 @@
package a8k.app.a8kproj.optalgo.type;
import a8k.app.a8kproj.optanalyzer.PeakDivisionComputer;
import a8k.app.a8ktype.opttype.PeakDivision;
import a8k.app.a8ktype.opttype.PeakName;
public class OptAlgoAnalysResult {
public Integer[] rawData;
@ -18,4 +22,23 @@ public class OptAlgoAnalysResult {
public Double pdT4R; //6
public Double pdT4T3R; //7
static public OptAlgoAnalysResult build(Integer[] rawData, double[] resultData, A8kOptPeaks peaks) {
OptAlgoAnalysResult result = new OptAlgoAnalysResult();
result.resultData = resultData;
result.rawData = rawData;
result.T4 = peaks.findPeak(PeakName.T4);
result.R = peaks.findPeak(PeakName.R);
result.H = peaks.findPeak(PeakName.H);
result.T = peaks.findPeak(PeakName.T);
result.C = peaks.findPeak(PeakName.C);
result.pdR = PeakDivisionComputer.computePeakDivision(PeakDivision.R, peaks);
result.pdAR = PeakDivisionComputer.computePeakDivision(PeakDivision.AR, peaks);
result.pdATR = PeakDivisionComputer.computePeakDivision(PeakDivision.ATR, peaks);
result.pdRFR = PeakDivisionComputer.computePeakDivision(PeakDivision.RFR, peaks);
result.pdT4R = PeakDivisionComputer.computePeakDivision(PeakDivision.T4R, peaks);
result.pdT4T3R = PeakDivisionComputer.computePeakDivision(PeakDivision.T4T3R, peaks);
return result;
}
}

7
src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java

@ -3,6 +3,8 @@ package a8k.extui.mgr;
import a8k.extui.page.data.DeviceActionParameterSettingPage;
import a8k.extui.page.data.ProjInfoMgrPage;
import a8k.extui.page.opt_calibration.OptFormulaTestPage;
import a8k.extui.page.opt_calibration.OptFormulaTestPageV2;
import a8k.extui.page.pos_calibration.MiniServoReferencePointIniter;
import a8k.extui.page.pos_calibration.*;
import a8k.extui.page.action_operation.*;
@ -124,8 +126,10 @@ public class ExtApiPageGroupCfgMgr {
cfgList.add(new Config(PageGroupType.PosCalibration, OptModuleParamPosCalibration.class, "光学模组位置设置"));
page.addFunction("光学标定与验证", this::optOptCalibrationAndVerifyRefreshPage);
cfgList.add(new Config(PageGroupType.OptCalibrationAndVerify, OptModuleParamCalibration.class, "光学模块参数校准"));
cfgList.add(new Config(PageGroupType.OptCalibrationAndVerify, A8kOptVerification.class, "光学模组验证"));
cfgList.add(new Config(PageGroupType.OptCalibrationAndVerify, OptModuleParamCalibration.class, "光学模块参数校准"));
cfgList.add(new Config(PageGroupType.OptCalibrationAndVerify, OptFormulaTestPageV2.class, "光学公式测试1"));
cfgList.add(new Config(PageGroupType.OptCalibrationAndVerify, OptFormulaTestPage.class, "光学公式测试2"));
page.addFunction("验证(过检专用)", this::verificationRefreshPage);
cfgList.add(new Config(PageGroupType.Verification, P01PipetteGunVerification.class, "移液枪验证"));
@ -168,6 +172,7 @@ public class ExtApiPageGroupCfgMgr {
cfgList.add(new Config(PageGroupType.FrontEndDebugUtils, VirtualEventGeneratorPage.class, "虚拟事件生成"));
displayRefreshPage(PageGroupType.Public);
regChangePageButton();
extApiPageMgr.addPage(page);

3
src/main/java/a8k/extui/page/opt_calibration/OptFormulaTestPage.java

@ -2,6 +2,7 @@ package a8k.extui.page.opt_calibration;
import a8k.app.a8kproj.A8kReactionResultComputer;
import a8k.app.a8kproj.optalgo.type.A8kOptPeak;
import a8k.app.a8kproj.optalgo.type.OptAlgoAnalysResult;
import a8k.app.a8ktype.device.BloodType;
import a8k.app.a8ktype.exception.AppException;
@ -90,6 +91,8 @@ public class OptFormulaTestPage {
@Resource
ExtApiPageMgr extApiPageMgr;
@PostConstruct
void init() {
optAlgoAnalysResult.pdR = 0.0;

176
src/main/java/a8k/extui/page/opt_calibration/OptFormulaTestPageV2.java

@ -0,0 +1,176 @@
package a8k.extui.page.opt_calibration;
import a8k.app.a8kproj.A8kReactionResultComputer;
import a8k.app.a8kproj.optalgo.type.A8kOptPeaks;
import a8k.app.a8kproj.optalgo.type.OptAlgoAnalysResult;
import a8k.app.a8kproj.optanalyzer.PeakNameAssigner;
import a8k.app.a8ktype.device.BloodType;
import a8k.app.a8ktype.exception.AppException;
import a8k.app.a8ktype.opttype.PeakName;
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.ExtApiStatu;
import a8k.extui.type.ExtUIPageCfg;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
@Slf4j
public class OptFormulaTestPageV2 {
@Resource
ProjInfoMgrService projInfoMgrService;
@Resource
ProjIdCardInfoMgrService projIdCardInfoMgrService;
@FunctionalInterface
public interface TEST {
Boolean test();
}
Double T4Area = 0.0;
Double RArea = 0.0;
Double HArea = 0.0;
Double TArea = 0.0;
Double CArea = 0.0;
@ExtApiStatu(name = "", group = "INPUT", order = 1)
synchronized public Map<String, Double> getArea() {
return Map.of("T4", T4Area, "R", RArea, "H", HArea, "T", TArea, "C", CArea);
}
@ExtApiStatu(name = "", group = "光学中间结果1", order = 2)
synchronized public Map<String, Double> getOptAlgoAnalysResult() {
if (optAlgoAnalysResult == null) {
return Map.of();
}
Map<String, Double> result = new HashMap<>();
if (optAlgoAnalysResult.pdR != null)
result.put("R", optAlgoAnalysResult.pdR);
if (optAlgoAnalysResult.pdAR != null)
result.put("AR", optAlgoAnalysResult.pdAR);
if (optAlgoAnalysResult.pdATR != null)
result.put("ATR", optAlgoAnalysResult.pdATR);
if (optAlgoAnalysResult.pdRFR != null)
result.put("RFR", optAlgoAnalysResult.pdRFR);
if (optAlgoAnalysResult.pdT4R != null)
result.put("T4R", optAlgoAnalysResult.pdT4R);
if (optAlgoAnalysResult.pdT4T3R != null)
result.put("T4T3R", optAlgoAnalysResult.pdT4T3R);
return result;
}
@ExtApiStatu(name = "", group = "光学中间结果2", order = 3, minWidth = "100%")
synchronized public String getComputedMidResult() {
return A8kReactionResultComputer.getComputeContext();
}
OptAlgoAnalysResult optAlgoAnalysResult;
synchronized public void setT4Area(Double val) {
T4Area = val;
}
synchronized public void setRArea(Double val) {
RArea = val;
}
synchronized public void setHArea(Double val) {
HArea = val;
}
synchronized public void setTArea(Double val) {
TArea = val;
}
synchronized public void setCArea(Double val) {
CArea = 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.projOptInfos = 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();
A8kOptPeaks peaks = new A8kOptPeaks();
PeakNameAssigner.assignPeakName(projInfoContext.projBaseInfo.projId, projInfoContext.projOptInfos.get(optIndex).peakNameRefNum, peaks);
peaks.trySetPeakArea(PeakName.T4, T4Area);
peaks.trySetPeakArea(PeakName.R, RArea);
peaks.trySetPeakArea(PeakName.H, HArea);
peaks.trySetPeakArea(PeakName.T, TArea);
peaks.trySetPeakArea(PeakName.C, CArea);
optAlgoAnalysResult = OptAlgoAnalysResult.build(new Integer[0], new double[0], peaks);
if (projInfoContext.projOptInfos.size() <= optIndex) {
throw AppException.of(A8kEcode.CODEERROR, "当前项目没有第%s个子项目", optIndex);
}
return A8kReactionResultComputer.optComputeResult(sampleInfo, projInfoContext, optIndex, optAlgoAnalysResult);
}
@Resource
ExtApiPageMgr extApiPageMgr;
@PostConstruct
void init() {
ExtUIPageCfg cfg = extApiPageMgr.newPage(this);
cfg.newGroup("项目信息");
cfg.addFunction("打印项目信息", this::getProjInfo);
cfg.newGroup("设置参数");
cfg.addFunction("设置T4面积", this::setT4Area).setParamVal("val", () -> T4Area);
cfg.addFunction("设置R面积", this::setRArea).setParamVal("val", () -> RArea);
cfg.addFunction("设置H面积", this::setHArea).setParamVal("val", () -> HArea);
cfg.addFunction("设置T面积", this::setTArea).setParamVal("val", () -> TArea);
cfg.addFunction("设置C面积", this::setCArea).setParamVal("val", () -> CArea);
cfg.newGroup("计算");
cfg.addFunction("计算结果", this::computeResult);
extApiPageMgr.addPage(cfg);
}
}

33
src/main/java/a8k/utils/ZloggerRecorder.java

@ -0,0 +1,33 @@
package a8k.utils;
import org.slf4j.Logger;
public class ZloggerRecorder {
Logger logger;
String record;
public ZloggerRecorder(Logger logger) {
this.logger = logger;
this.record = "";
}
synchronized public void clear() {
record = "";
}
synchronized public String getRecord() {
return record;
}
synchronized public void info(String fmt, Object... args) {
String info = String.format(fmt, args);
logger.info(info);
record += info + "\n";
}
synchronized public void error(String fmt, Object... args) {
String info = String.format(fmt, args);
logger.error(info);
record += info + "\n";
}
}
Loading…
Cancel
Save