Browse Source

update

tags/v0
zhaohe 7 months ago
parent
commit
6329f28c19
  1. 2
      src/main/java/a8k/app/controler/api/v1/app/data/ReactionResultControler.java
  2. 2
      src/main/java/a8k/app/dao/db/type/ReactionReport.java
  3. 11
      src/main/java/a8k/app/factory/FakeOptScanResultFactory.java
  4. 6
      src/main/java/a8k/app/service/data/ReactionRecordMgrService.java
  5. 24
      src/main/java/a8k/app/utils/ProjBuildinInfo.java
  6. 3
      src/main/java/a8k/app/utils/ZSqlite.java
  7. 25
      src/main/java/a8k/extui/factory/A8kScanCurveFactory.java
  8. 8
      src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java
  9. 17
      src/main/java/a8k/extui/page/extapp/A8kOptVerification.java
  10. 23
      src/main/java/a8k/extui/page/extapp/OptModuleParamCalibration.java
  11. 24
      src/main/java/a8k/extui/page/extsetting/db/ReactionRecordDebugPage.java
  12. 26
      src/main/java/a8k/extui/page/test/frond_end_test/FakeReactionRecordGeneratorPage.java
  13. 16
      src/main/java/a8k/extui/type/ExtUiTable.java

2
src/main/java/a8k/app/controler/api/v1/app/data/ReactionResultControler.java

@ -31,7 +31,7 @@ public class ReactionResultControler {
@PostMapping("/getAllRecords")
public ApiRet<List<ReactionReport>> getAllRecords() {
return ApiRet.success(reactionRecordMgrService.getAll());
return ApiRet.success(reactionRecordMgrService.getAllDesc());
}
@PostMapping("/deleteAllRecords")

2
src/main/java/a8k/app/dao/db/type/ReactionReport.java

@ -35,7 +35,7 @@ public class ReactionReport { //记录单个反应板的反应结果
public int id = 0;
@Schema(description = "记录创建时间(ms)")
public Long creatDate = ZDateUtils.getTimestamp();
public Date creatDate = new Date();
@Schema(description = "血液类型")
public BloodType sampleBloodType = BloodType.WHOLE_BLOOD; //血液类型

11
src/main/java/a8k/app/factory/FakeOptScanResultFactory.java

@ -21,9 +21,16 @@ public class FakeOptScanResultFactory {
rawData.lasterGain = 1;
rawData.scanGain = 1;
rawData.rawData = new Integer[1200];
if (optType.equals(A8kOptType.FOPT)) {
for (int i = 0; i < 1200; i++) {
rawData.rawData[i] = i;
}
} else {
for (int i = 0; i < 1200; i++) {
rawData.rawData[i] = 1200 - i;
}
}
optScanResult.rawData = rawData;
//OptAlgoAnalysResult
@ -41,8 +48,10 @@ public class FakeOptScanResultFactory {
optAlgoAnalysResult.pdT4T3R = 1.6;
optAlgoAnalysResult.resultData = new double[250];
for (int i = 0; i < 250; i++) {
optAlgoAnalysResult.resultData[i] = i;
optAlgoAnalysResult.resultData[i] = optType.equals(A8kOptType.FOPT) ? i : 250 - i;
}
optScanResult.analysResult = optAlgoAnalysResult;
//return

6
src/main/java/a8k/app/service/data/ReactionRecordMgrService.java

@ -83,10 +83,12 @@ public class ReactionRecordMgrService {
}
public List<ReactionReport> getAll() {
return reactionReportDao.getAll();
public List<ReactionReport> getAllDesc() {
return reactionReportDao.getAllDesc();
}
public void deleteAll() {
List<ReactionReport> records = reactionReportDao.getAll();
for (ReactionReport record : records) {

24
src/main/java/a8k/app/utils/ProjBuildinInfo.java

@ -4,6 +4,7 @@ import a8k.app.dao.db.type.OptCfg;
import a8k.app.dao.db.type.ProjectBaseInfo;
import a8k.app.dao.db.type.a8kidcard.zenum.A8kOptType;
import a8k.app.dao.db.type.a8kidcard.zenum.A8kReactionFlowType;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
@ -45,7 +46,7 @@ public class ProjBuildinInfo implements Serializable {
public List<OptCfg> optcfg;
public ProjBuildinInfo(){} //for json
public ProjBuildinInfo() {} //for json
public A8kOptType getOptType(Integer subProjIndex) {
for (OptCfg optCfg : optcfg) {
@ -56,6 +57,27 @@ public class ProjBuildinInfo implements Serializable {
return null;
}
@JsonIgnore
public OptCfg getFoptCfg() {
for (OptCfg optCfg : optcfg) {
if (optCfg.optType.equals(A8kOptType.FOPT)) {
return optCfg;
}
}
return null;
}
@JsonIgnore
public OptCfg getToptCfg() {
for (OptCfg optCfg : optcfg) {
if (optCfg.optType.equals(A8kOptType.TOPT)) {
return optCfg;
}
}
return null;
}
public ProjBuildinInfo(ProjectBaseInfo baseInfo, List<OptCfg> optInfos) {
//遍历所有ProjectBaseInfo字段赋值给ProjBuildinInfo
for (var field : baseInfo.getClass().getDeclaredFields()) {

3
src/main/java/a8k/app/utils/ZSqlite.java

@ -43,7 +43,6 @@ public class ZSqlite<T> {
return jdbcTemplate.query("select * from " + tableName, this::rowMapperList);
}
public List<T> getAllDesc() {
return jdbcTemplate.query("select * from " + tableName + " order by id desc", this::rowMapperList);
}
@ -195,8 +194,6 @@ public class ZSqlite<T> {
}
public void resetDBData() {
deleteAll();
tryInitDBData();

25
src/main/java/a8k/extui/factory/A8kScanCurveFactory.java

@ -0,0 +1,25 @@
package a8k.extui.factory;
import a8k.app.utils.ZList;
import a8k.extui.type.ret.A8kScanCurve;
import java.util.ArrayList;
import java.util.List;
public class A8kScanCurveFactory {
public static A8kScanCurve createScanCurve1200Point(Integer[] optScanResult) {
List<Integer> refCurve = new ArrayList<>();
for (int i = 1; i < 6; i++) {
refCurve.add((int) (40 * 4.8 * i));
}
var result = new A8kScanCurve();
result.refCurve = refCurve;
result.scanDataCurve = ZList.of(optScanResult);
return result;
}
}

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

@ -128,9 +128,7 @@ public class ExtApiPageGroupCfgMgr {
new Menu("高级应用", List.of(
new Menu("光学标定与验证", List.of(
new Menu(A8kOptVerification.class, "光学模组验证"),
new Menu(OptModuleParamCalibration.class, "光学模块参数校准"),
new Menu(OptFormulaTestPageV2.class, "光学公式测试1"),
new Menu(OptFormulaTestPage.class, "光学公式测试2")
new Menu(OptModuleParamCalibration.class, "光学模块参数校准")
)),
new Menu("验证(过检专用)", List.of(
new Menu(P01PipetteGunVerification.class, "移液枪验证"),
@ -187,6 +185,10 @@ public class ExtApiPageGroupCfgMgr {
)),
new Menu("压力测试", List.of(
new Menu(PipetteGunStressTest.class, "移液枪压力测试")
)),
new Menu("代码测试", List.of(
new Menu(OptFormulaTestPageV2.class, "光学公式测试1"),
new Menu(OptFormulaTestPage.class, "光学公式测试2")
))
))
);

17
src/main/java/a8k/extui/page/extapp/A8kOptVerification.java

@ -5,8 +5,8 @@ import a8k.app.a8kproj.optalgo.type.OptScanResult;
import a8k.app.a8ktype.device.BloodType;
import a8k.app.a8ktype.state.SampleInfo;
import a8k.app.a8ktype.type.ReactionResult;
import a8k.app.controler.filemgr.StorageControler;
import a8k.app.dao.db.type.ProjExtInfoCard;
import a8k.extui.factory.A8kScanCurveFactory;
import a8k.app.service.data.ProjIdCardInfoMgrService;
import a8k.app.service.lowerctrl.DeviceInitCtrlService;
import a8k.app.utils.ProjInfo;
@ -24,7 +24,6 @@ import a8k.app.a8ktype.device.ConsumableGroup;
import a8k.app.a8ktype.device.IncubatorPos;
import a8k.app.a8ktype.exception.AppException;
import a8k.app.utils.ProjBuildinInfo;
import a8k.app.utils.ZList;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;
@ -34,7 +33,6 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@Component
public class A8kOptVerification {
@ -131,16 +129,7 @@ public class A8kOptVerification {
}
A8kScanCurve createScanCurve1200Point(Integer[] optScanResult) {
List<Integer> refCurve = new ArrayList<>();
for (int i = 1; i < 6; i++) {
refCurve.add((int) (40 * 4.8 * i));
}
var result = new A8kScanCurve();
result.refCurve = refCurve;
result.scanDataCurve = ZList.of(optScanResult);
return result;
}
static class OptScanReport {
public A8kOptType optType;
@ -164,7 +153,7 @@ public class A8kOptVerification {
public void generateOptReport(ProjBuildinInfo info, Integer subProjIndex, OptScanResult optScanResult)
throws IOException {
OptScanReport report = new OptScanReport();
report.optScanCurve = createScanCurve1200Point(optScanResult.rawData.rawData);
report.optScanCurve = A8kScanCurveFactory.createScanCurve1200Point(optScanResult.rawData.rawData);
report.optType = info.optcfg.get(subProjIndex).optType;
report.optScanResult = optScanResult;
report.projInfo = info;

23
src/main/java/a8k/extui/page/extapp/OptModuleParamCalibration.java

@ -2,6 +2,7 @@ package a8k.extui.page.extapp;
import a8k.app.a8ktype.device.ConsumableGroup;
import a8k.app.a8ktype.device.IncubatorPos;
import a8k.extui.factory.A8kScanCurveFactory;
import a8k.app.service.lowerctrl.DeviceInitCtrlService;
import a8k.extui.mgr.ExtApiPageMgr;
import a8k.extui.type.ret.A8kScanCurve;
@ -12,7 +13,6 @@ import a8k.app.service.param.optparam.OptModuleExtParamsMgr;
import a8k.app.a8ktype.param.optpos.OptModuleExtParam;
import a8k.app.dao.db.type.a8kidcard.zenum.A8kOptType;
import a8k.app.a8ktype.exception.AppException;
import a8k.app.utils.ZList;
import a8k.app.utils.opt_gain_convert.OptGainConvert;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
@ -20,9 +20,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -101,22 +99,7 @@ public class OptModuleParamCalibration {
optScanModuleCtrlService.dropPlate();
}
A8kScanCurve createScanCurve1200Point(Integer[] optScanResult) {
// Integer[] optScanResult250 = A8kOptAlgoUtils.supperSamplingAndSubSampling(optScanResult);
List<Integer> refCurve = new ArrayList<>();
for (int i = 1; i < 6; i++) {
refCurve.add((int) (40 * 4.8 * i));
}
var result = new A8kScanCurve();
result.refCurve = refCurve;
result.scanDataCurve = ZList.of(optScanResult);
return result;
}
A8kScanCurve fcurveCache = null;
public void setFOptScanShift(Integer shift) throws AppException {
if (shift < 0) {
throw AppException.ofAECodeError("扫描偏移量必须大于0");
@ -153,7 +136,7 @@ public class OptModuleParamCalibration {
Integer rawScanGain = OptGainConvert.scanerToRawGain(A8kOptType.FOPT, scanGain);
Integer rawLasterGain = optModuleExtParamsMgr.getOptLasterRawGain(A8kOptType.FOPT);
var result = optScanModuleCtrlService.startOptScan(A8kOptType.FOPT, rawLasterGain, rawScanGain);
fcurveCache = createScanCurve1200Point(result);
fcurveCache = A8kScanCurveFactory.createScanCurve1200Point(result);
return fcurveCache;
}
@ -191,7 +174,7 @@ public class OptModuleParamCalibration {
Integer rawLasterGain = optModuleExtParamsMgr.getOptLasterRawGain(A8kOptType.TOPT);
var result = optScanModuleCtrlService.startOptScan(A8kOptType.TOPT, rawLasterGain, rawScanGain);
return createScanCurve1200Point(result);
return A8kScanCurveFactory.createScanCurve1200Point(result);
}

24
src/main/java/a8k/extui/page/extsetting/db/ReactionRecordDebugPage.java

@ -3,6 +3,8 @@ package a8k.extui.page.extsetting.db;
import a8k.app.a8ktype.exception.AppException;
import a8k.app.controler.filemgr.StorageControler;
import a8k.app.dao.db.type.ReactionReport;
import a8k.app.dao.db.type.a8kidcard.zenum.A8kOptType;
import a8k.extui.factory.A8kScanCurveFactory;
import a8k.app.service.data.FileMgrService;
import a8k.app.service.data.ProjIdCardInfoMgrService;
import a8k.app.service.data.ProjInfoMgrService;
@ -10,6 +12,7 @@ import a8k.app.service.data.ReactionRecordMgrService;
import a8k.extui.mgr.ExtApiPageMgr;
import a8k.extui.type.ExtUIPageCfg;
import a8k.extui.type.ExtUiTable;
import a8k.extui.type.ret.A8kScanCurve;
import a8k.extui.type.ret.ExtUIDownloadTasks;
import a8k.extui.type.ret.FileToBeDownload;
import jakarta.annotation.PostConstruct;
@ -38,7 +41,7 @@ public class ReactionRecordDebugPage {
FileMgrService fileMgrService;
public ExtUiTable getReactionRecordList() {
var results = reactionRecordMgrService.getAll();
var results = reactionRecordMgrService.getAllDesc();
return new ExtUiTable(ReactionReport.class, results);
}
@ -53,7 +56,7 @@ public class ReactionRecordDebugPage {
public ExtUIDownloadTasks downloadOptData(Integer id) throws IOException, AppException {
ExtUIDownloadTasks tasks = new ExtUIDownloadTasks();
ReactionReport report = reactionRecordMgrService.findById(id);
if( report.detailOptData.isEmpty()){
if (report.detailOptData.isEmpty()) {
throw AppException.ofSimplePrompt("没有光学数据");
}
for (var optData : report.detailOptData) {
@ -67,6 +70,20 @@ public class ReactionRecordDebugPage {
}
public A8kScanCurve displayOptCurve(Integer id, A8kOptType optType) throws AppException {
ReactionReport report = reactionRecordMgrService.findById(id);
if (report == null) {
throw AppException.ofSimplePrompt("没有找到记录");
}
for (var optdate : report.detailOptData) {
if (optdate.rawData.optType.equals(optType)) {
return A8kScanCurveFactory.createScanCurve1200Point(optdate.rawData.rawData);
}
}
throw AppException.ofSimplePrompt("当前项目没有%s光学扫描曲线", optType);
}
@PostConstruct
void init() {
ExtUIPageCfg page = new ExtUIPageCfg(this);
@ -79,6 +96,9 @@ public class ReactionRecordDebugPage {
page.addFunction("导出所有记录", this::exportReactionRecords);
page.addFunction("导出指定项目光学数据", this::downloadOptData);
page.newGroup("光学曲线");
page.addFunction("查看光学曲线", this::displayOptCurve);
extApiPageMgr.addPage(page);
}
}

26
src/main/java/a8k/extui/page/test/frond_end_test/FakeReactionRecordGeneratorPage.java

@ -44,17 +44,18 @@ public class FakeReactionRecordGeneratorPage {
void init() {
ExtUIPageCfg page = new ExtUIPageCfg(this);
page.addFunction("添加1条反应结果记录", this::addVirtualReactionRecord);
page.addFunction("添加100条反应结果记录", this::add100VirtualReactionRecord);
page.addFunction("添加多条反应记录(每个项目添加一条)", this::addSomeVirtualReactionRecord);
extApiPageMgr.addPage(page);
}
public void add100VirtualReactionRecord() throws AppException {
for (int i = 0; i < 100; i++) {
addVirtualReactionRecord(String.format("SAMPLE%03d", i));
public void addSomeVirtualReactionRecord() throws AppException {
var allproj = projInfoMgrService.getAllProjBuildInInfo();
for (var proj : allproj) {
addVirtualReactionRecord("SAMPLEID-123456", proj.projId);
}
}
public void addVirtualReactionRecord(String sampleId) throws AppException {
public void addVirtualReactionRecord(String sampleId, Integer projNum) throws AppException {
SampleInfo sampleInfo = new SampleInfo();
sampleInfo.sampleId = sampleId;
@ -64,7 +65,7 @@ public class FakeReactionRecordGeneratorPage {
sampleInfo.sampleBarcode = "BARCODE-111222333";
sampleInfo.userid = "USERID-ABCDEFG";
ProjInfo projInfo = new ProjInfo(projInfoMgrService.getProjBuildInInfo(1), ProjExtInfoCardFactory.buildProjExtInfoCard(1, "LOTID123"));
ProjInfo projInfo = new ProjInfo(projInfoMgrService.getProjBuildInInfo(projNum), ProjExtInfoCardFactory.buildProjExtInfoCard(1, "LOTID123"));
A8kResultBuilderFn resultBuilder0 = new A8kResultBuilderFn(A8kResultUnit.coi, A8kResultUnit.iuPml, A8kResultUnit.iuPml, 2.0, 2.0, 3.0, 3.0);
A8kResultBuilderFn resultBuilder1 = new A8kResultBuilderFn(A8kResultUnit.coi, A8kResultUnit.iuPml, A8kResultUnit.iuPml, 2.0, 2.0, 3.0, 3.0);
@ -72,18 +73,25 @@ public class FakeReactionRecordGeneratorPage {
List<ReactionResult> reactionResults = new ArrayList<>();
for (int i = 0; i < projInfo.buildIn.getSubProjNum(); i++) {
if (i == 0)
reactionResults.add(new ReactionResult("Tn-I", "Tn-I", 1.0, resultBuilder0.toResultUnitConverters()));
if (i == 1)
reactionResults.add(new ReactionResult("CK-MB", "CK-MB", 2.0, resultBuilder1.toResultUnitConverters()));
if (i == 2)
reactionResults.add(new ReactionResult("Myoglobin", "MG", 3.0, resultBuilder2.toResultUnitConverters()));
}
List<OptScanResult> optScanResults = new ArrayList<>();
if (projInfo.buildIn.getFoptCfg() != null) {
optScanResults.add(FakeOptScanResultFactory.buildOptScanResult(A8kOptType.FOPT));
}
if (projInfo.buildIn.getToptCfg() != null) {
optScanResults.add(FakeOptScanResultFactory.buildOptScanResult(A8kOptType.TOPT));
}
reactionRecordMgrService.addRecord(sampleInfo, projInfo, optScanResults, reactionResults);
}
}

16
src/main/java/a8k/extui/type/ExtUiTable.java

@ -2,13 +2,12 @@ package a8k.extui.type;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.text.SimpleDateFormat;
import java.util.*;
public class ExtUiTable {
@ -81,6 +80,7 @@ public class ExtUiTable {
|| field.getType().equals(Boolean.class)
|| field.getType().equals(Character.class)
|| field.getType().equals(Byte.class)
|| field.getType().equals(Date.class)
|| field.getType().equals(Short.class)) {
this.columns.add(new TableColumn(field.getName(), field.getName()));
if (this.columns.size() == 1) {
@ -94,7 +94,13 @@ public class ExtUiTable {
if (datas == null || datas.isEmpty()) {
this.datas.add(emptyData);
} else {
this.datas.addAll(datas);
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"));
for (Object data : datas) {
var val = mapper.valueToTree(data);
this.datas.add(val);
}
}

Loading…
Cancel
Save