19 changed files with 354 additions and 99 deletions
-
2appresource/static/engineer/css/app.ae9236bd.css
-
2appresource/static/engineer/index.html
-
2appresource/static/engineer/js/app.15f44a8f.js
-
1appresource/static/engineer/js/app.15f44a8f.js.map
-
2appresource/static/engineer/js/app.c4a7361a.js
-
1appresource/static/engineer/js/app.c4a7361a.js.map
-
6appresource/static/engineer/js/chunk-vendors.5158647c.js
-
2appresource/static/engineer/js/chunk-vendors.5158647c.js.map
-
90src/main/java/a8k/app/a8kproj/A8kReactionResultComputer.java
-
16src/main/java/a8k/app/a8kproj/optalgo/A8kOptAlgoV2.java
-
19src/main/java/a8k/app/a8kproj/optalgo/type/A8kOptPeaks.java
-
23src/main/java/a8k/app/a8kproj/optalgo/type/OptAlgoAnalysResult.java
-
7src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java
-
3src/main/java/a8k/extui/page/opt_calibration/OptFormulaTestPage.java
-
176src/main/java/a8k/extui/page/opt_calibration/OptFormulaTestPageV2.java
-
33src/main/java/a8k/utils/ZloggerRecorder.java
@ -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 |
@ -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
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
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
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
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
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
File diff suppressed because it is too large
View File
@ -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); |
|||
|
|||
|
|||
} |
|||
|
|||
} |
@ -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"; |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue