diff --git a/src/main/java/a8k/checker/ProjInfoChecker.java b/src/main/java/a8k/checker/ProjInfoChecker.java new file mode 100644 index 0000000..4a16624 --- /dev/null +++ b/src/main/java/a8k/checker/ProjInfoChecker.java @@ -0,0 +1,40 @@ +package a8k.checker; + +import a8k.service.dao.ProjOptInfoDao; +import a8k.service.dao.ProjectBaseInfoDao; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Component +public class ProjInfoChecker { + + private static final Logger log = LoggerFactory.getLogger(ProjInfoChecker.class); + @Resource + ProjOptInfoDao projOptInfoDao; + + @Resource + ProjectBaseInfoDao projectBaseInfoDao; + + @PostConstruct + void init() { + + //遍历ProjBaseInfoDao中的所有项目,获取光学项目数量,然后查找OptRawScanData中的数据,如果OptRawScanData中的数据数量不等于光学项目数量,则输出错误信息 + + boolean triggerError = false; + var projBaseInfoList = projectBaseInfoDao.getAll(); + for (var projBaseInfo : projBaseInfoList) { + var projOptInfoList = projOptInfoDao.findByProjIndex(projBaseInfo.projId); + if (projOptInfoList.size() != projBaseInfo.subProjNum) { + log.error("项目{}({}) 光学配置和子项目数量不匹配", projBaseInfo.projName, projBaseInfo.projId); + triggerError = true; + } + } + + if (triggerError) { + System.exit(-1); + } + } +} diff --git a/src/main/java/a8k/service/app/appdata/ProjInfoMgrService.java b/src/main/java/a8k/service/app/appdata/ProjInfoMgrService.java index a339011..6008428 100644 --- a/src/main/java/a8k/service/app/appdata/ProjInfoMgrService.java +++ b/src/main/java/a8k/service/app/appdata/ProjInfoMgrService.java @@ -3,7 +3,7 @@ package a8k.service.app.appdata; import a8k.hardware.type.a8kcanprotocol.A8kEcode; import a8k.service.dao.A8kProjExtInfoCardDao; import a8k.service.dao.ProjectBaseInfoDao; -import a8k.service.dao.A8kProjOptConfigDao; +import a8k.service.dao.ProjOptInfoDao; import a8k.service.dao.type.ProjExtInfoCard; import a8k.type.exception.AppException; import a8k.utils.ProjBuildinInfo; @@ -22,9 +22,9 @@ public class ProjInfoMgrService { @Resource A8kProjExtInfoCardDao a8KProjExtInfoCardDao; @Resource - ProjectBaseInfoDao projectBaseInfoDao; + ProjectBaseInfoDao projectBaseInfoDao; @Resource - A8kProjOptConfigDao a8KProjOptConfigDao; + ProjOptInfoDao projOptInfoDao; // public ProjInfo getProjInfo(String lotid) { // ProjInfo projCfg = new ProjInfo(); @@ -51,7 +51,7 @@ public class ProjInfoMgrService { public ProjBuildinInfo getProjBuildInInfo(Integer projId) throws AppException { ProjBuildinInfo projBuildinInfo = new ProjBuildinInfo(); projBuildinInfo.projBaseInfo = projectBaseInfoDao.findByProjId(projId); - projBuildinInfo.projOptInfos = a8KProjOptConfigDao.findByProjIndex(projId); + projBuildinInfo.projOptInfos = projOptInfoDao.findByProjIndex(projId); ZAppChecker.notNull(projBuildinInfo.projBaseInfo, A8kEcode.APPE_A8K_PROJ_UNSUPPORTED, "PROJ:%d IS NOT SUPPORTED", projId); ZAppChecker.notEmpty(projBuildinInfo.projOptInfos, A8kEcode.APPE_A8K_PROJ_INFO_IS_ERROR, "PROJ:%d OPT CONFIG IS NOT EXIST", projId); diff --git a/src/main/java/a8k/service/dao/A8kProjOptConfigDao.java b/src/main/java/a8k/service/dao/A8kProjOptConfigDao.java deleted file mode 100644 index 3b45456..0000000 --- a/src/main/java/a8k/service/dao/A8kProjOptConfigDao.java +++ /dev/null @@ -1,64 +0,0 @@ -package a8k.service.dao; - -import a8k.service.app.appdata.UtilsProjectColorAllocer; -import a8k.service.dao.type.ProjOptInfo; - -import a8k.utils.ZSqliteJdbcHelper; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import lombok.SneakyThrows; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Component; - -import java.sql.ResultSet; -import java.util.List; - -@Component -public class A8kProjOptConfigDao { - private static final Logger logger = LoggerFactory.getLogger(A8kProjOptConfigDao.class); - private static final String tableName = "zapp_a8k_project_opt_config"; - private static final Class tClass = ProjOptInfo.class; - - - @Resource - JdbcTemplate jdbcTemplate; - - @Resource - UtilsProjectColorAllocer colorAllocer; - - @PostConstruct - void init() { - if (!ZSqliteJdbcHelper.isTableExist(jdbcTemplate, tableName)) { - ZSqliteJdbcHelper.createTable(jdbcTemplate, tableName, tClass); - } - } - - @SneakyThrows private ProjOptInfo rowMapper(ResultSet rs, int rowNum) { - return (ProjOptInfo) ZSqliteJdbcHelper.rowMapper(rs, tClass); - } - - public List findByProjIndex(Integer projId) { - List list = jdbcTemplate.query("select * from " + tableName + " where projId = ?;", this::rowMapper, projId); - if (list.isEmpty()) { - return null; - } - return list; - } - - public void add(ProjOptInfo val) { - ZSqliteJdbcHelper.addObj(jdbcTemplate, tableName, tClass, val); - } - - public void add(List vals) { - for (ProjOptInfo val : vals) { - add(val); - } - } - - public void removeAll() { - ZSqliteJdbcHelper.deleteTable(jdbcTemplate, tableName); - ZSqliteJdbcHelper.createTable(jdbcTemplate, tableName, tClass); - } -} diff --git a/src/main/java/a8k/service/dao/OptRawDataDao.java b/src/main/java/a8k/service/dao/OptRawDataDao.java index 660aa6e..8f05d4c 100644 --- a/src/main/java/a8k/service/dao/OptRawDataDao.java +++ b/src/main/java/a8k/service/dao/OptRawDataDao.java @@ -1,6 +1,7 @@ package a8k.service.dao; import a8k.service.dao.type.OptRawScanData; +import a8k.utils.ZCSVUtils; import a8k.utils.ZSqlite; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; @@ -18,7 +19,8 @@ public class OptRawDataDao extends ZSqlite { @PostConstruct void init() { - init(jdbcTemplate, "zapp_a8k_opt_raw_data_record", OptRawScanData.class); + init(jdbcTemplate, "zapp_a8k_opt_raw_data_record", OptRawScanData.class,true); + } public OptRawScanData findByProjId(Integer projId) { diff --git a/src/main/java/a8k/service/dao/ProjOptInfoDao.java b/src/main/java/a8k/service/dao/ProjOptInfoDao.java new file mode 100644 index 0000000..dba04fe --- /dev/null +++ b/src/main/java/a8k/service/dao/ProjOptInfoDao.java @@ -0,0 +1,74 @@ +package a8k.service.dao; + +import a8k.service.app.appdata.UtilsProjectColorAllocer; +import a8k.service.dao.type.ProjOptInfo; + +import a8k.utils.ZCSVUtils; +import a8k.utils.ZJsonHelper; +import a8k.utils.ZSqlite; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +@Slf4j +public class ProjOptInfoDao extends ZSqlite { + + @Resource + JdbcTemplate jdbcTemplate; + + @Resource + UtilsProjectColorAllocer utilsProjectColorAllocer; + + @PostConstruct + void init() { + init(jdbcTemplate, "zapp_a8k_project_opt_config", ProjOptInfo.class, true); + var list = ZCSVUtils.readCSVFromResource("a8k/db/zapp_a8k_project_opt_config.csv", ProjOptInfo.class); + for (var val : list) { + + val.id = val.projId * 10 + val.subProjIndex; + log.info("{}", ZJsonHelper.objectToJson(val)); + add(val); + checkVal(val); + } + } + + + public List findByProjIndex(Integer projId) { + return queryList("select * from " + tableName + " where projId = ?;", projId); + } + + public void add(List vals) { + for (ProjOptInfo val : vals) { + add(val); + } + } + + public void removeAll() { + super.deleteAll(); + } + + private void checkVal(ProjOptInfo val) { + for (var field : val.getClass().getDeclaredFields()) { + if (field.getName().equals("id")) { + continue; + } + + try { + field.setAccessible(true); + if (field.get(val) == null) { + log.error("field {} is null,{}", field.getName(), ZJsonHelper.objectToJson(val)); + System.exit(1); + } + } catch (IllegalAccessException e) { + log.error("", e); + System.exit(1); + } + } + + } +} diff --git a/src/main/java/a8k/service/dao/type/ProjOptInfo.java b/src/main/java/a8k/service/dao/type/ProjOptInfo.java index 15fc85d..2fb363d 100644 --- a/src/main/java/a8k/service/dao/type/ProjOptInfo.java +++ b/src/main/java/a8k/service/dao/type/ProjOptInfo.java @@ -19,4 +19,5 @@ public class ProjOptInfo implements Serializable { public Integer optScanPeakNum; //子项目 实际扫描到的峰的数量 public Integer peakNameRefNum; //子项目 峰的数量 + } diff --git a/src/main/java/a8k/service/test/MainflowCtrlTestService.java b/src/main/java/a8k/service/test/MainflowCtrlTestService.java index 81ff771..1d829d2 100644 --- a/src/main/java/a8k/service/test/MainflowCtrlTestService.java +++ b/src/main/java/a8k/service/test/MainflowCtrlTestService.java @@ -22,7 +22,7 @@ import a8k.service.app.devicectrl.driver.type.StepMotorMId; import a8k.service.app.devicectrl.exdriver.MotorEnableExDriver; import a8k.service.dao.A8kProjExtInfoCardDao; import a8k.service.dao.ProjectBaseInfoDao; -import a8k.service.dao.A8kProjOptConfigDao; +import a8k.service.dao.ProjOptInfoDao; import a8k.service.test.state.TestModeState; import a8k.service.test.state.VirtualDevice; import a8k.type.*; @@ -79,9 +79,9 @@ public class MainflowCtrlTestService { @Resource A8kProjExtInfoCardDao a8KProjExtInfoCardDao; @Resource - ProjectBaseInfoDao projectBaseInfoDao; + ProjectBaseInfoDao projectBaseInfoDao; @Resource - A8kProjOptConfigDao a8KProjOptConfigDao; + ProjOptInfoDao projOptInfoDao; // // Ctrl @@ -101,13 +101,13 @@ public class MainflowCtrlTestService { void resetProjDB() { a8KProjExtInfoCardDao.deleteAll(); projectBaseInfoDao.deleteAll(); - a8KProjOptConfigDao.removeAll(); + projOptInfoDao.removeAll(); } void addProjInfo(Class projClass) { a8KProjExtInfoCardDao.addIdCard(FakeProjInfoFactory.buildIDCardInfo(projClass)); projectBaseInfoDao.add(FakeProjInfoFactory.buildProjectInfo(projClass)); - a8KProjOptConfigDao.add(FakeProjInfoFactory.buildA8kProjOptConfigList(projClass)); + projOptInfoDao.add(FakeProjInfoFactory.buildA8kProjOptConfigList(projClass)); } void LoadingConsumablesDirectly(ConsumableGroup group, FakeProjInfo fake) { diff --git a/src/main/java/a8k/service/test/TestStateMgrService.java b/src/main/java/a8k/service/test/TestStateMgrService.java index 7f1265c..c28c13b 100644 --- a/src/main/java/a8k/service/test/TestStateMgrService.java +++ b/src/main/java/a8k/service/test/TestStateMgrService.java @@ -3,7 +3,7 @@ package a8k.service.test; import a8k.service.dao.A8kProjExtInfoCardDao; import a8k.service.dao.ProjectBaseInfoDao; -import a8k.service.dao.A8kProjOptConfigDao; +import a8k.service.dao.ProjOptInfoDao; import a8k.a8kproj.fakeproj.FakeProjInfoFactory; import a8k.service.test.state.TestModeState; import a8k.service.test.state.VirtualDevice; @@ -26,14 +26,14 @@ public class TestStateMgrService { @Resource A8kProjExtInfoCardDao a8KProjExtInfoCardDao; @Resource - A8kProjOptConfigDao a8KProjOptConfigDao; + ProjOptInfoDao projOptInfoDao; @Resource - ProjectBaseInfoDao projectBaseInfoDao; + ProjectBaseInfoDao projectBaseInfoDao; public void addProjInfo(Class projClass) { projectBaseInfoDao.add(FakeProjInfoFactory.buildProjectInfo(projClass)); - a8KProjOptConfigDao.add(FakeProjInfoFactory.buildA8kProjOptConfigList(projClass)); + projOptInfoDao.add(FakeProjInfoFactory.buildA8kProjOptConfigList(projClass)); } public void addIdCardInfo(Class projClass) { @@ -43,7 +43,7 @@ public class TestStateMgrService { public void resetProjDB() { projectBaseInfoDao.deleteAll(); - a8KProjOptConfigDao.removeAll(); + projOptInfoDao.removeAll(); } public void resetProjIDCardDB() { diff --git a/src/main/java/a8k/utils/ZCSVUtils.java b/src/main/java/a8k/utils/ZCSVUtils.java index 4bbb576..9b75c07 100644 --- a/src/main/java/a8k/utils/ZCSVUtils.java +++ b/src/main/java/a8k/utils/ZCSVUtils.java @@ -2,6 +2,7 @@ package a8k.utils; import a8k.service.dao.ProjectBaseInfoDao; +import a8k.service.dao.type.ProjOptInfo; import a8k.service.dao.type.ProjectBaseInfo; import cn.hutool.core.io.resource.ResourceUtil; import cn.hutool.core.text.csv.CsvReader; @@ -70,23 +71,20 @@ public class ZCSVUtils { public static void main(String[] args) { // write demo - List objects = new ArrayList<>(); + List objects = new ArrayList<>(); for (int i = 0; i < 10; i++) { - ProjectBaseInfo projectBaseInfo = new ProjectBaseInfo(); + ProjOptInfo projectBaseInfo = new ProjOptInfo(); projectBaseInfo.projId = i; projectBaseInfo.projName = "projName" + i; - projectBaseInfo.projShortName = "projShortName" + i; - projectBaseInfo.subProjNum = i; - projectBaseInfo.reactionTemperature = i; - projectBaseInfo.color = "color" + i; + objects.add(projectBaseInfo); } - writeCSV("tmp/zapp_a8k_project_info.csv", ProjectBaseInfo.class, objects); + writeCSV("tmp/tmp.csv", ProjOptInfo.class, objects); // read demo - List projectBaseInfos = readCSV("tmp/zapp_a8k_project_info.csv", ProjectBaseInfo.class); + List projectBaseInfos = readCSV("tmp/tmp.csv", ProjOptInfo.class); for (var projectBaseInfo : projectBaseInfos) { log.info("{}", ZJsonHelper.objectToJson(projectBaseInfo)); } diff --git a/src/main/resources/a8k/db/zapp_a8k_project_info.csv b/src/main/resources/a8k/db/zapp_a8k_project_info.csv index 29f0c73..5ea7f3a 100644 --- a/src/main/resources/a8k/db/zapp_a8k_project_info.csv +++ b/src/main/resources/a8k/db/zapp_a8k_project_info.csv @@ -17,7 +17,7 @@ projId,projName,projShortName,subProjNum,reactionTemperature,color,reactionFlowT 17,HbAlC,HB,1,25,#9932CC,SampleAndBSAndProbeSubstance,5,5,3,100,12,75, 18,PCT plus,PP,1,25,#4B0082,SampleAndBSAndProbeSubstance,35,35,3,150,12,75, 20,Tn-I/CK-MB/Myoglobin,CT,3,25,#9370DB,SampleAndBSAndProbeSubstance,75,75,3,150,12,75, -22,PCT/hsCRP,PR,1,25,#6A5ACD,SampleAndBSAndProbeSubstance,35,35,3,150,12,75, +22,PCT/hsCRP,PR,2,25,#6A5ACD,SampleAndBSAndProbeSubstance,35,35,3,150,12,75, 24,SAA,SA,1,25,#E6E6FA,SampleAndBS,10,10,3,0,3,75, 25,AMH,AM,1,25,#F8F8FF,SampleAndBSAndProbeSubstance,50,50,3,150,12,75, 26,SAA/CRP,SC,2,25,#0000FF,SampleAndBS,10,10,3,0,3,75, diff --git a/src/main/resources/a8k/db/zapp_a8k_project_opt_config.csv b/src/main/resources/a8k/db/zapp_a8k_project_opt_config.csv new file mode 100644 index 0000000..ad54979 --- /dev/null +++ b/src/main/resources/a8k/db/zapp_a8k_project_opt_config.csv @@ -0,0 +1,38 @@ +id,projId,projName,subProjIndex,subProjName,subProjShortName,optType,optScanRange,optScanPeakNum,peakNameRefNum +0,1,hsCRP,0,hsCRP,CA,FOPT,150,3,3 +0,2,PCT,0,PCT,PC,TOPT,150,2,2 +0,3,TSH,0,TSH,TS,FOPT,150,2,2 +0,4,PRL,0,PRL,PL,FOPT,150,2,2 +0,5,T3,0,T3,T3,FOPT,150,2,2 +0,6,T4,0,T4,T4,FOPT,150,2,2 +0,7,Total β hCG,0,Total β hCG,HC,FOPT,150,3,3 +0,8,LH,0,LH,LH,FOPT,150,2,2 +0,9,FSH,0,FSH,FS,FOPT,150,2,2 +0,10,Progesterone,0,Progesterone,PG,FOPT,150,2,2 +0,12,Tn-I plus,0,Tn-I plus,TG,TOPT,150,3,3 +0,13,NT-proBNP,0,NT-proBNP,NB,TOPT,150,3,3 +0,14,CK-MB,0,CK-MB ,CK,FOPT,150,2,2 +0,15,Myoglobin,0,Myoglobin,MY,FOPT,150,2,2 +0,16,D-Dimer,0,D-Dimer,DD,FOPT,150,2,2 +0,17,HbAlC,0,HbAlC,HB,FOPT,150,2,2 +0,18,PCT plus,0,PCT plus,PP,FOPT,150,3,3 +0,20,Tn-I/CK-MB/Myoglobin,0,CK-MB,CK-MB,FOPT,200,3,4 +0,20,Tn-I/CK-MB/Myoglobin,1,Myoglobin,Myoglobin,FOPT,200,3,4 +0,20,Tn-I/CK-MB/Myoglobin,2,Tn-I,Tn-I,TOPT,200,4,4 +0,22,PCT/hsCRP,0,PCT,PCT,TOPT,200,3,4 +0,22,PCT/hsCRP,1,hsCRP,hsCRP,FOPT,200,3,4 +0,24,SAA,0,SAA,SA,FOPT,150,3,3 +0,25,AMH,0,AMH,AM,TOPT,150,3,3 +0,26,SAA/CRP,0,SAA,SAA,FOPT,250,5,5 +0,26,SAA/CRP,1,CRP,CRP,FOPT,250,5,5 +0,27,Vitamin D,0,Vitamin D,VD,FOPT,150,2,2 +0,33,ST2,0,ST2,ST,FOPT,150,2,2 +0,36,MxA,0,MxA,MX,TOPT,150,2,2 +0,48,IL-6,0,IL-6,IL,TOPT,150,3,3 +0,49,Gastrin 17,0,Gastrin 17,GA,TOPT,150,2,2 +0,50,Pepsinogen I/II,0,Pepsinogen I,PG-I,TOPT,150,3,3 +0,50,Pepsinogen I/II,1,Pepsinogen II,PG-II,TOPT,150,3,3 +0,52,NT-proBNP/ST2,0,ST2,ST2,FOPT,200,2,4 +0,52,NT-proBNP/ST2,1,NT-proBNP,NT-proBNP,TOPT,200,3,4 +0,54,Troponin T,0,Troponin T,TT,TOPT,150,3,3 +0,55,BNP,0,BNP,BP,TOPT,150,3,3