From 83fd2b6b15604cb0f8abf93cf2021f960128a298 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Wed, 31 Jul 2024 11:18:03 +0800 Subject: [PATCH] update --- src/main/java/a8k/appbase/A8kTubeType.java | 17 +- src/main/java/a8k/appbase/ProjectInfoSimple.java | 21 +++ src/main/java/a8k/db/DBTableVersion.java | 38 ++++ src/main/java/a8k/db/ProjectColor.java | 19 ++ src/main/java/a8k/db/ProjectInfo.java | 209 +++++++++++++++++++++ src/main/java/a8k/service/AddSampleService.java | 4 + src/main/java/a8k/service/ProjectColorAllocer.java | 92 +++++++++ src/main/java/a8k/service/UIEventProcesser.java | 4 + .../appevent/A8kCanBusOnConnectEvent.java | 1 + .../appeventbus/appevent/A8kHardwareReport.java | 8 +- .../appeventbus/appevent/A8kStateChangeEvent.java | 8 + .../a8k/service/appeventbus/appevent/AppEvent.java | 6 +- .../appeventbus/appevent/AppStepNotifyEvent.java | 2 + .../appevent/AppWarningNotifyEvent.java | 1 + src/main/java/a8k/service/base/A8kDeviceState.java | 34 ++++ src/main/java/a8k/service/base/BloodType.java | 6 + .../base/consumable/ConsumableItemGroup.java | 10 + .../a8k/service/base/consumable/ReactantItem.java | 16 ++ .../a8k/service/base/consumable/TipGroupInfo.java | 5 + .../java/a8k/service/base/plate/PlateState.java | 12 ++ .../a8k/service/base/plate/ReactingPlateState.java | 23 +++ .../base/reaction_result/ReactionResult.java | 13 ++ .../a8k/service/base/sample/EmergencyPosState.java | 7 + .../service/base/sample/EmergencySampleInfo.java | 6 + .../java/a8k/service/base/sample/SampleInfo.java | 18 ++ src/main/java/a8k/service/base/sample/Tube.java | 8 + .../java/a8k/service/base/sample/TubeHolder.java | 12 ++ .../a8k/service/base/sample/TubeHolderState.java | 7 + .../java/a8k/service/base/sample/TubeState.java | 18 ++ .../a8k/service/base/samplecfg/SampleTubeCfg.java | 8 + .../base/samplecfg/SampleTubeHolderCfg.java | 9 + .../a8k/service/ctrl_service/AppCtrlService.java | 78 ++++++++ .../SamplesPreProcessModuleCtrlService.java | 11 +- .../service/project_mgr/ProjectItemMgrService.java | 76 ++++++++ .../service/state_service/A8kStateMgrService.java | 182 +++++++++--------- .../migration/V100_5__create_table_DBVersion.sql | 7 + .../V100_6__create_table_ProjectColorTable.sql | 8 + 37 files changed, 888 insertions(+), 116 deletions(-) create mode 100644 src/main/java/a8k/appbase/ProjectInfoSimple.java create mode 100644 src/main/java/a8k/db/DBTableVersion.java create mode 100644 src/main/java/a8k/db/ProjectColor.java create mode 100644 src/main/java/a8k/db/ProjectInfo.java create mode 100644 src/main/java/a8k/service/AddSampleService.java create mode 100644 src/main/java/a8k/service/ProjectColorAllocer.java create mode 100644 src/main/java/a8k/service/UIEventProcesser.java create mode 100644 src/main/java/a8k/service/appeventbus/appevent/A8kStateChangeEvent.java create mode 100644 src/main/java/a8k/service/base/A8kDeviceState.java create mode 100644 src/main/java/a8k/service/base/BloodType.java create mode 100644 src/main/java/a8k/service/base/consumable/ConsumableItemGroup.java create mode 100644 src/main/java/a8k/service/base/consumable/ReactantItem.java create mode 100644 src/main/java/a8k/service/base/consumable/TipGroupInfo.java create mode 100644 src/main/java/a8k/service/base/plate/PlateState.java create mode 100644 src/main/java/a8k/service/base/plate/ReactingPlateState.java create mode 100644 src/main/java/a8k/service/base/reaction_result/ReactionResult.java create mode 100644 src/main/java/a8k/service/base/sample/EmergencyPosState.java create mode 100644 src/main/java/a8k/service/base/sample/EmergencySampleInfo.java create mode 100644 src/main/java/a8k/service/base/sample/SampleInfo.java create mode 100644 src/main/java/a8k/service/base/sample/Tube.java create mode 100644 src/main/java/a8k/service/base/sample/TubeHolder.java create mode 100644 src/main/java/a8k/service/base/sample/TubeHolderState.java create mode 100644 src/main/java/a8k/service/base/sample/TubeState.java create mode 100644 src/main/java/a8k/service/base/samplecfg/SampleTubeCfg.java create mode 100644 src/main/java/a8k/service/base/samplecfg/SampleTubeHolderCfg.java create mode 100644 src/main/java/a8k/service/ctrl_service/AppCtrlService.java create mode 100644 src/main/java/a8k/service/project_mgr/ProjectItemMgrService.java create mode 100644 src/main/resources/db/migration/V100_5__create_table_DBVersion.sql create mode 100644 src/main/resources/db/migration/V100_6__create_table_ProjectColorTable.sql diff --git a/src/main/java/a8k/appbase/A8kTubeType.java b/src/main/java/a8k/appbase/A8kTubeType.java index ff1f092..b0a32e3 100644 --- a/src/main/java/a8k/appbase/A8kTubeType.java +++ b/src/main/java/a8k/appbase/A8kTubeType.java @@ -3,18 +3,15 @@ package a8k.appbase; public enum A8kTubeType { - HighBlood("HighBlood", "0000"), //全血试管 - ShortBlood("ShortBlood", "0000"), //全血试管 - Mini("Mini", "1111"), //迷你试管 - MiniBlood("MiniBlood", "2222"), //阳普管 - BulletTube1P5("BulletTube1P5", "5555"),//子弹头试管1.5mL - BulletTube0P5("BulletTube0P5", "4444"); //子弹头试管0.5mL + BloodTube("0000"), //全血试管 + ShortBloodTube("0000"), //全血试管 + MiniTube("1111"), //迷你试管 + MiniBlood("2222"), //阳普管 + BulletTube1P5("5555"),//子弹头试管1.5mL + BulletTube0P5("4444"); //子弹头试管0.5mL final public String scanCode; - final public String name; - - A8kTubeType(String name, String scanCode) { + A8kTubeType(String scanCode) { this.scanCode = scanCode; - this.name = name; } } diff --git a/src/main/java/a8k/appbase/ProjectInfoSimple.java b/src/main/java/a8k/appbase/ProjectInfoSimple.java new file mode 100644 index 0000000..e6e19e7 --- /dev/null +++ b/src/main/java/a8k/appbase/ProjectInfoSimple.java @@ -0,0 +1,21 @@ +package a8k.appbase; + +import a8k.db.ProjectInfo; + +public class ProjectInfoSimple { + String projectName; //项目名称 + String lotName; //批次名称 + String expiryDate; //有效日期 + + public ProjectInfoSimple(String projectName, String lotName, String expiryDate) { + this.projectName = projectName; + this.lotName = lotName; + this.expiryDate = expiryDate; + } + + public ProjectInfoSimple(ProjectInfo pinfo) { + this.projectName = pinfo.projectName; + this.lotName = pinfo.lotName; + this.expiryDate = pinfo.expiryDate; + } +} diff --git a/src/main/java/a8k/db/DBTableVersion.java b/src/main/java/a8k/db/DBTableVersion.java new file mode 100644 index 0000000..17fae4a --- /dev/null +++ b/src/main/java/a8k/db/DBTableVersion.java @@ -0,0 +1,38 @@ +package a8k.db; + +import com.iflytop.uf.UfActiveRecord; +import com.iflytop.uf.UfActiveRecordField; + +import java.util.Map; + +public class DBTableVersion extends UfActiveRecord { + @UfActiveRecordField + public String tableName; + @UfActiveRecordField + public Integer version; + + public static String getTableName() { + return DBTableVersion.class.getSimpleName() + "Table"; + } + + public static void setTableVersion(String tableName, Integer version) { + var dbDataVersion = UfActiveRecord.findOne(DBTableVersion.class, Map.of("tableName", tableName)); + if (null == dbDataVersion) { + dbDataVersion = new DBTableVersion(); + dbDataVersion.tableName = tableName; + dbDataVersion.version = version; + dbDataVersion.save(); + } else { + dbDataVersion.version = version; + dbDataVersion.save(); + } + } + + public static Integer getTableVersion(String tableName) { + var dbDataVersion = UfActiveRecord.findOne(DBTableVersion.class, Map.of("tableName", tableName)); + if (null == dbDataVersion) { + return 0; + } + return dbDataVersion.version; + } +} diff --git a/src/main/java/a8k/db/ProjectColor.java b/src/main/java/a8k/db/ProjectColor.java new file mode 100644 index 0000000..0df34b3 --- /dev/null +++ b/src/main/java/a8k/db/ProjectColor.java @@ -0,0 +1,19 @@ +package a8k.db; + +import com.iflytop.uf.UfActiveRecord; +import com.iflytop.uf.UfActiveRecordField; + +public class ProjectColor extends UfActiveRecord { + + @UfActiveRecordField + public String color; + @UfActiveRecordField + public String projectId; + @UfActiveRecordField + public Integer index; + + public static String getTableName() { + return "ProjectColorTable"; + } + +} diff --git a/src/main/java/a8k/db/ProjectInfo.java b/src/main/java/a8k/db/ProjectInfo.java new file mode 100644 index 0000000..db025cf --- /dev/null +++ b/src/main/java/a8k/db/ProjectInfo.java @@ -0,0 +1,209 @@ +package a8k.db; + +import com.iflytop.uf.UfActiveRecord; +import com.iflytop.uf.UfActiveRecordField; + +//ref:https://iflytop1.feishu.cn/wiki/HvDlwbEWDi4fgkkL6qSc2iLGnte +public class ProjectInfo extends UfActiveRecord { + + public static String getTableName() { + return "ProjectInfoTable"; + } + + @UfActiveRecordField + public Integer buildIn;//是否是内置,如果是内置则不显示,作为项目的默认值使用 + + @UfActiveRecordField + public String insertTime; //插入时间 + + @UfActiveRecordField + public String projectName; //项目名称 + @UfActiveRecordField + public String lotName; //批次名称 + @UfActiveRecordField + public String expiryDate; //有效日期 + @UfActiveRecordField + public String projectCode; //项目名称代码 + @UfActiveRecordField + public Integer palteCode; // 板条条码代码 + @UfActiveRecordField + public Integer updateChipVersion; // 更新芯片版本号 + @UfActiveRecordField + public Double QCPeakMinVal; // 质控峰最小值 + @UfActiveRecordField + public Double QCPeakMaxVal; // 质控峰最大值 设置值x10最大不超过250000 + @UfActiveRecordField + public Integer optType; //光学类型 光学类型(0=自动;1=F光学;2=T光学;3=F/T光学;其他=无效;) + @UfActiveRecordField + public Integer optFixedGainSetting; //光学固定增益设置 + @UfActiveRecordField + public Integer optAreaPeakCount; //光学面积峰个数 + @UfActiveRecordField + public Integer calculationDirection; //计算方向 + @UfActiveRecordField + public Integer sampleType; //样本类型 + @UfActiveRecordField + public Integer equipmentManufacturer; //设备厂商 + @UfActiveRecordField + public Integer tOptIlluminationTime; //T光学持续光照时间 + @UfActiveRecordField + public Integer incMultiInstruDataMerge; //是否包含多款仪器数据合并 + @UfActiveRecordField + public Integer multiInstruDataMerge; //多款仪器数据合并 + @UfActiveRecordField + public Integer wBloodSampleVol; //全血样本量 + @UfActiveRecordField + public Integer serumSampleVol; //血清/血浆样本量 + @UfActiveRecordField + public Integer tubeMixingCount; //试管混匀次数 + @UfActiveRecordField + public Integer bufferBottleSize; //缓冲液瓶大小 + @UfActiveRecordField + public Integer bufferBottleCapacity; //缓冲液瓶容量 + @UfActiveRecordField + public Integer buffLiquidAspirMixingCnt; //缓冲液吸吐混匀次数 + @UfActiveRecordField + public Integer buffLiquidAspirMixingVol; //缓冲液吐混混匀量 + @UfActiveRecordField + public Integer buffLiquidReactionTime; //缓冲液反应时间 + @UfActiveRecordField + public Integer reactionPlateReactionTime; //反应板反应时间 + @UfActiveRecordField + public Integer reactionPlateDropletVol; //反应板滴样量 + @UfActiveRecordField + public Integer resultDecimalPlaces; //结果小数点位数 + @UfActiveRecordField + public Integer scanningRange; //扫描范围 + + //当前项目是几联卡项目 + //项目1 结果曲线是否为分段函数 + //项目2 结果曲线是否为分段函数 + //项目3 结果曲线是否为分段函数 + + @UfActiveRecordField + public Integer projectNum; //当前项目是几联卡项目 + @UfActiveRecordField + public Integer project1CurveType; //项目1 结果曲线是否为分段函数 + @UfActiveRecordField + public Integer project2CurveType; //项目2 结果曲线是否为分段函数 + @UfActiveRecordField + public Integer project3CurveType; //项目3 结果曲线是否为分段函数 + + //非分段函数 + @UfActiveRecordField + public Integer p0FnX; //函数未知数是 + @UfActiveRecordField + public Double p0FnXMin; //函数未知数下限闻值 + @UfActiveRecordField + public Double p0FnXMax; //函数未知数上限闻值 + @UfActiveRecordField + public Double p0FnSerumA; //A + @UfActiveRecordField + public Double p0FnSerumB; //B + @UfActiveRecordField + public Double p0FnSerumC; //C + @UfActiveRecordField + public Double p0FnSerumD; //D + @UfActiveRecordField + public Double p0FnRtSerumUpLimit; //结果上限 + @UfActiveRecordField + public Double p0FnRtSerumLowLimit; //结果下限 + + @UfActiveRecordField + public Double p0FnBloodA; //A + @UfActiveRecordField + public Double p0FnBloodB; //B + @UfActiveRecordField + public Double p0FnBloodC; //C + @UfActiveRecordField + public Double p0FnBloodD; //D + @UfActiveRecordField + public Double p0FnRtBloodUpLimit; //结果上限 + @UfActiveRecordField + public Double p0FnRtBloodLowLimit; //结果下限 + + //分段函数 + @UfActiveRecordField + public Integer p0PwFnJudeX; //分界判断数据来源 + @UfActiveRecordField + public Double p0PwFnJudeThres; //分界判断数据值 + @UfActiveRecordField + public Double p0PwFnLCX; //低浓度未知数 + @UfActiveRecordField + public Double p0PwFnHCX; //高浓度未知数 + @UfActiveRecordField + public Double p0PwFnXMin; //函数未知数下限闻值 + @UfActiveRecordField + public Double p0PwFnXMax; //函数未知数上限闻值 + + @UfActiveRecordField + public Double p0PwFnLCSerumA; //A + @UfActiveRecordField + public Double p0PwFnLCSerumB; //B + @UfActiveRecordField + public Double p0PwFnLCSerumC; //C + @UfActiveRecordField + public Double p0PwFnLCSerumD; //D + @UfActiveRecordField + public Double p0PwFnLCRtSerumUpLimit; //结果上限 + @UfActiveRecordField + public Double p0PwFnLCRtSerumLowLimit; //结果下限 + + @UfActiveRecordField + public Double p0PwFnHCSerumA; //A + @UfActiveRecordField + public Double p0PwFnHCSerumB; //B + @UfActiveRecordField + public Double p0PwFnHCSerumC; //C + @UfActiveRecordField + public Double p0PwFnHCSerumD; //D + @UfActiveRecordField + public Double p0PwFnHCRtSerumUpLimit; //结果上限 + @UfActiveRecordField + public Double p0PwFnHCRtSerumLowLimit; //结果下限 + + @UfActiveRecordField + public Double p0PwFnLCBloodA; //A + @UfActiveRecordField + public Double p0PwFnLCBloodB; //B + @UfActiveRecordField + public Double p0PwFnLCBloodC; //C + @UfActiveRecordField + public Double p0PwFnLCBloodD; //D + @UfActiveRecordField + public Double p0PwFnLCRtBloodUpLimit; //结果上限 + @UfActiveRecordField + public Double p0PwFnLCRtBloodLowLimit; //结果下限 + + @UfActiveRecordField + public Double p0PwFnHCBloodA; //A + @UfActiveRecordField + public Double p0PwFnHCBloodB; //B + @UfActiveRecordField + public Double p0PwFnHCBloodC; //C + @UfActiveRecordField + public Double p0PwFnHCBloodD; //D + @UfActiveRecordField + public Double p0PwFnHCRtBloodUpLimit; //结果上限 + @UfActiveRecordField + public Double p0PwFnHCRtBloodLowLimit; //结果下限 + + //结果 + @UfActiveRecordField + public Integer ret1Unit; //单位 + @UfActiveRecordField + public Integer ret2Unit; //单位 + @UfActiveRecordField + public Integer ret3Unit; //单位 + + @UfActiveRecordField + public Double ret2UnitFnA; // + @UfActiveRecordField + public Double ret2UnitFnB; // + + @UfActiveRecordField + public Double ret3UnitFnA; // + @UfActiveRecordField + public Double ret3UnitFnB; // + +} diff --git a/src/main/java/a8k/service/AddSampleService.java b/src/main/java/a8k/service/AddSampleService.java new file mode 100644 index 0000000..1dba6c3 --- /dev/null +++ b/src/main/java/a8k/service/AddSampleService.java @@ -0,0 +1,4 @@ +package a8k.service; + +public class AddSampleService { +} diff --git a/src/main/java/a8k/service/ProjectColorAllocer.java b/src/main/java/a8k/service/ProjectColorAllocer.java new file mode 100644 index 0000000..299d1ef --- /dev/null +++ b/src/main/java/a8k/service/ProjectColorAllocer.java @@ -0,0 +1,92 @@ +package a8k.service; + +import a8k.db.DBTableVersion; +import a8k.db.ProjectColor; +import com.iflytop.uf.UfActiveRecord; +import jakarta.annotation.PostConstruct; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +@Component +public class ProjectColorAllocer { + final String[] colors = { + "#ff8283", + "#ffff81", + "#86ff86", + "#ffc491", + "#87f4ff", + "#9191ff", + }; + static final Integer dbVersion = 1; + Integer colorIndexMax = 0; + + ProjectColor dbGetProjectColor(String projId) { + return UfActiveRecord.findOne(ProjectColor.class, Map.of("projectId", projId)); + } + + List dbGetProjectColors() { + return UfActiveRecord.find(ProjectColor.class); + } + + void dbEmptyProjectColors() { + var list = dbGetProjectColors(); + for (var projColor : list) { + projColor.delete(); + } + } + + @PostConstruct + void init() { + //初始化项目颜色 + Integer var = DBTableVersion.getTableVersion(ProjectColor.getTableName()); + if (!dbVersion.equals(var)) { + initdbdata(); + } + + var allColors = dbGetProjectColors(); + for (var projColor : allColors) { + if (projColor.index > colorIndexMax) { + colorIndexMax = projColor.index; + } + } + } + + private void initdbdata() { + dbEmptyProjectColors(); + for (String color : colors) { + var projColor = new ProjectColor(); + projColor.projectId = ""; + projColor.color = color; + projColor.index = 0; + projColor.save(); + } + } + + //项目颜色 + public String getProjectColor(String projId) { + var projColor = dbGetProjectColor(projId); + if (projColor != null) { + colorIndexMax++; + projColor.index = colorIndexMax; + projColor.save(); + return projColor.color; + } + + var colors = dbGetProjectColors(); + //找到index最小的颜色 + ProjectColor minColor = null; + for (var color : colors) { + if (minColor == null || color.index < minColor.index) { + minColor = color; + } + } + assert minColor != null; + colorIndexMax++; + minColor.projectId = projId; + minColor.index = colorIndexMax; + minColor.save(); + return minColor.color; + } +} diff --git a/src/main/java/a8k/service/UIEventProcesser.java b/src/main/java/a8k/service/UIEventProcesser.java new file mode 100644 index 0000000..2a1d0ca --- /dev/null +++ b/src/main/java/a8k/service/UIEventProcesser.java @@ -0,0 +1,4 @@ +package a8k.service; + +public class UIEventProcesser { +} diff --git a/src/main/java/a8k/service/appeventbus/appevent/A8kCanBusOnConnectEvent.java b/src/main/java/a8k/service/appeventbus/appevent/A8kCanBusOnConnectEvent.java index e6dc305..e71dd04 100644 --- a/src/main/java/a8k/service/appeventbus/appevent/A8kCanBusOnConnectEvent.java +++ b/src/main/java/a8k/service/appeventbus/appevent/A8kCanBusOnConnectEvent.java @@ -2,5 +2,6 @@ package a8k.service.appeventbus.appevent; public class A8kCanBusOnConnectEvent extends AppEvent { public A8kCanBusOnConnectEvent() { + super(A8kCanBusOnConnectEvent.class.getSimpleName()); } } diff --git a/src/main/java/a8k/service/appeventbus/appevent/A8kHardwareReport.java b/src/main/java/a8k/service/appeventbus/appevent/A8kHardwareReport.java index 9887747..dfeaab9 100644 --- a/src/main/java/a8k/service/appeventbus/appevent/A8kHardwareReport.java +++ b/src/main/java/a8k/service/appeventbus/appevent/A8kHardwareReport.java @@ -7,11 +7,13 @@ import org.springframework.lang.NonNull; * A8k底层硬件上报事件 */ public class A8kHardwareReport extends AppEvent{ - A8kPacket reportPacket; - public A8kHardwareReport(@NonNull A8kPacket packet) {} + public A8kHardwareReport(@NonNull A8kPacket packet) { + super(A8kHardwareReport.class.getSimpleName()); + this.reportPacket = packet; + } - A8kPacket getReportPacket(){ + public A8kPacket getReportPacket(){ return reportPacket; } diff --git a/src/main/java/a8k/service/appeventbus/appevent/A8kStateChangeEvent.java b/src/main/java/a8k/service/appeventbus/appevent/A8kStateChangeEvent.java new file mode 100644 index 0000000..f90b827 --- /dev/null +++ b/src/main/java/a8k/service/appeventbus/appevent/A8kStateChangeEvent.java @@ -0,0 +1,8 @@ +package a8k.service.appeventbus.appevent; + +public class A8kStateChangeEvent extends AppEvent { + + A8kStateChangeEvent(String displayInfo) { + super(A8kStateChangeEvent.class.getSimpleName()); + } +} diff --git a/src/main/java/a8k/service/appeventbus/appevent/AppEvent.java b/src/main/java/a8k/service/appeventbus/appevent/AppEvent.java index 522a646..df79f58 100644 --- a/src/main/java/a8k/service/appeventbus/appevent/AppEvent.java +++ b/src/main/java/a8k/service/appeventbus/appevent/AppEvent.java @@ -1,6 +1,8 @@ package a8k.service.appeventbus.appevent; public class AppEvent { - - + public String name; + public AppEvent(String name) { + this.name = name; + } } diff --git a/src/main/java/a8k/service/appeventbus/appevent/AppStepNotifyEvent.java b/src/main/java/a8k/service/appeventbus/appevent/AppStepNotifyEvent.java index fce4ee7..b219cbc 100644 --- a/src/main/java/a8k/service/appeventbus/appevent/AppStepNotifyEvent.java +++ b/src/main/java/a8k/service/appeventbus/appevent/AppStepNotifyEvent.java @@ -1,9 +1,11 @@ package a8k.service.appeventbus.appevent; + public class AppStepNotifyEvent extends AppEvent { String displayInfo; AppStepNotifyEvent(String displayInfo) { + super(AppStepNotifyEvent.class.getSimpleName()); this.displayInfo = displayInfo; } diff --git a/src/main/java/a8k/service/appeventbus/appevent/AppWarningNotifyEvent.java b/src/main/java/a8k/service/appeventbus/appevent/AppWarningNotifyEvent.java index 56f895c..29ea334 100644 --- a/src/main/java/a8k/service/appeventbus/appevent/AppWarningNotifyEvent.java +++ b/src/main/java/a8k/service/appeventbus/appevent/AppWarningNotifyEvent.java @@ -4,6 +4,7 @@ public class AppWarningNotifyEvent extends AppEvent { String displayInfo; AppWarningNotifyEvent(String displayInfo) { + super(AppWarningNotifyEvent.class.getSimpleName()); this.displayInfo = displayInfo; } diff --git a/src/main/java/a8k/service/base/A8kDeviceState.java b/src/main/java/a8k/service/base/A8kDeviceState.java new file mode 100644 index 0000000..df71334 --- /dev/null +++ b/src/main/java/a8k/service/base/A8kDeviceState.java @@ -0,0 +1,34 @@ +package a8k.service.base; + +import a8k.service.base.consumable.ConsumableItemGroup; +import a8k.service.base.plate.ReactingPlateState; +import a8k.service.base.reaction_result.ReactionResult; +import a8k.service.base.sample.EmergencyPosState; +import a8k.service.base.sample.SampleInfo; +import a8k.service.base.sample.TubeHolder; +import a8k.service.base.samplecfg.SampleTubeHolderCfg; + +import java.util.ArrayList; +import java.util.List; + +public class A8kDeviceState { + //耗材 + public ConsumableItemGroup consumableItemGroup = null; + //急诊位状态 + public EmergencyPosState emergencyPosState = EmergencyPosState.IDLE; + //急诊位样本信息 + public SampleInfo emergencySampleInfo = null; + //急诊位反应结果 + public ReactionResult emergencyResult = null; + //正在孵育的任务状态 + public List incubatingPlateStates = null; + //当前正在被处理的试管架状态 + public TubeHolder processingTubeHolder = null; + //温度 + public Integer temperature; + //配置 + public List cfgs = new ArrayList<>(); + + Boolean deviceInited = false; //设备是否初始化过 + Boolean devicePoweredOffNormally = false; //设备是否正常关机 +} diff --git a/src/main/java/a8k/service/base/BloodType.java b/src/main/java/a8k/service/base/BloodType.java new file mode 100644 index 0000000..965d1a0 --- /dev/null +++ b/src/main/java/a8k/service/base/BloodType.java @@ -0,0 +1,6 @@ +package a8k.service.base; + +public enum BloodType { + WHOLE_BLOOD, + SERUM; +} diff --git a/src/main/java/a8k/service/base/consumable/ConsumableItemGroup.java b/src/main/java/a8k/service/base/consumable/ConsumableItemGroup.java new file mode 100644 index 0000000..02b2bb2 --- /dev/null +++ b/src/main/java/a8k/service/base/consumable/ConsumableItemGroup.java @@ -0,0 +1,10 @@ +package a8k.service.base.consumable; + +import java.util.Date; + +public class ConsumableItemGroup { + + public Date scanDate = new Date(); + public ReactantItem[] reactantItems = new ReactantItem[6]; + public TipGroupInfo[] tip = new TipGroupInfo[3]; +} diff --git a/src/main/java/a8k/service/base/consumable/ReactantItem.java b/src/main/java/a8k/service/base/consumable/ReactantItem.java new file mode 100644 index 0000000..e6027ba --- /dev/null +++ b/src/main/java/a8k/service/base/consumable/ReactantItem.java @@ -0,0 +1,16 @@ +package a8k.service.base.consumable; + +//反应物,诸如反应板夹,小瓶缓冲液,大瓶缓冲液... +public class ReactantItem { + + public String projId; //项目ID + public String lotVal; //批次号 + public String color; //颜色 + + public Integer num = 0; //数量 + public Boolean hasPlateClip = false; //是否有反应板夹 always true + public Boolean hasLargeBufferBottle = false; //是否有大瓶缓冲液 + public Boolean hasSmallBufferBottle = false; //是否有小瓶缓冲液 + public Boolean hasDetectionMaterial = false; //是否有探测物质 + +} diff --git a/src/main/java/a8k/service/base/consumable/TipGroupInfo.java b/src/main/java/a8k/service/base/consumable/TipGroupInfo.java new file mode 100644 index 0000000..2c07a99 --- /dev/null +++ b/src/main/java/a8k/service/base/consumable/TipGroupInfo.java @@ -0,0 +1,5 @@ +package a8k.service.base.consumable; + +public class TipGroupInfo { + public Integer tipNum = 0;//剩余可用数量 +} diff --git a/src/main/java/a8k/service/base/plate/PlateState.java b/src/main/java/a8k/service/base/plate/PlateState.java new file mode 100644 index 0000000..4e72696 --- /dev/null +++ b/src/main/java/a8k/service/base/plate/PlateState.java @@ -0,0 +1,12 @@ +package a8k.service.base.plate; + +public enum PlateState { + //赋予中 + Incubating, + //孵育完成 + Incubated, + //孵育异常 + IncubateError, + //板条码异常 + PlateCodeError, +} diff --git a/src/main/java/a8k/service/base/plate/ReactingPlateState.java b/src/main/java/a8k/service/base/plate/ReactingPlateState.java new file mode 100644 index 0000000..e6ec8de --- /dev/null +++ b/src/main/java/a8k/service/base/plate/ReactingPlateState.java @@ -0,0 +1,23 @@ +package a8k.service.base.plate; + +import a8k.service.base.reaction_result.ReactionResult; +import a8k.service.base.sample.SampleInfo; +import a8k.service.base.sample.Tube; + +import java.util.Date; + +public class ReactingPlateState { + + String sampleUUID; //样本UUID 系统自动生成 + String projectId;//项目id + + SampleInfo bindSample; //绑定的样本运行状态 + + Integer incubationPos; //孵育盘中的位置 0->19 + Date startIncubatedTime; //开始孵育时间 + Integer targetIncubatedTimeS; //目标孵育时间 + + PlateState plateState; //孵育盘状态 + + ReactionResult reactionResult; //反应结果 +} diff --git a/src/main/java/a8k/service/base/reaction_result/ReactionResult.java b/src/main/java/a8k/service/base/reaction_result/ReactionResult.java new file mode 100644 index 0000000..4dce008 --- /dev/null +++ b/src/main/java/a8k/service/base/reaction_result/ReactionResult.java @@ -0,0 +1,13 @@ +package a8k.service.base.reaction_result; + +public class ReactionResult { + + Boolean result0Error; + Boolean result1Error; + Boolean result2Error; + + String result0; + String result1; + String result2; + +} diff --git a/src/main/java/a8k/service/base/sample/EmergencyPosState.java b/src/main/java/a8k/service/base/sample/EmergencyPosState.java new file mode 100644 index 0000000..0eae39f --- /dev/null +++ b/src/main/java/a8k/service/base/sample/EmergencyPosState.java @@ -0,0 +1,7 @@ +package a8k.service.base.sample; + +public enum EmergencyPosState { + IDLE,// + PROCESSING,// + PROCESS_COMPLETE,// +} diff --git a/src/main/java/a8k/service/base/sample/EmergencySampleInfo.java b/src/main/java/a8k/service/base/sample/EmergencySampleInfo.java new file mode 100644 index 0000000..0c90999 --- /dev/null +++ b/src/main/java/a8k/service/base/sample/EmergencySampleInfo.java @@ -0,0 +1,6 @@ +package a8k.service.base.sample; + +public class EmergencySampleInfo { + + +} diff --git a/src/main/java/a8k/service/base/sample/SampleInfo.java b/src/main/java/a8k/service/base/sample/SampleInfo.java new file mode 100644 index 0000000..c6105f8 --- /dev/null +++ b/src/main/java/a8k/service/base/sample/SampleInfo.java @@ -0,0 +1,18 @@ +package a8k.service.base.sample; + +import a8k.appbase.A8kTubeType; + +import java.util.List; + +public class SampleInfo { + A8kTubeType tubeType; //管子类型 + + String sampleUUID; //样本UUID 系统自动生成 + String projectId; //项目id,用于查找项目相关信息 + String sampleUDPID; //用户输入的样本ID,不做逻辑,只做展示 + String sampleBarcodeID; //用于请求用户信息的条码ID + + List projectIds; //项目id,用于查找项目相关信息 + + +} diff --git a/src/main/java/a8k/service/base/sample/Tube.java b/src/main/java/a8k/service/base/sample/Tube.java new file mode 100644 index 0000000..86fc734 --- /dev/null +++ b/src/main/java/a8k/service/base/sample/Tube.java @@ -0,0 +1,8 @@ +package a8k.service.base.sample; + +import a8k.appbase.A8kTubeType; + +public class Tube { + TubeState tubeState = TubeState.EMPTY; //样本运行状态 + SampleInfo sampleInfo; //样本信息 +} diff --git a/src/main/java/a8k/service/base/sample/TubeHolder.java b/src/main/java/a8k/service/base/sample/TubeHolder.java new file mode 100644 index 0000000..39b97ba --- /dev/null +++ b/src/main/java/a8k/service/base/sample/TubeHolder.java @@ -0,0 +1,12 @@ +package a8k.service.base.sample; + +import a8k.appbase.A8kTubeType; +import a8k.service.base.BloodType; + +public class TubeHolder { + public BloodType bloodType = BloodType.WHOLE_BLOOD; //血型 + public A8kTubeType tubeHolderType = A8kTubeType.BloodTube; //管子类型 + public TubeHolderState tubeHolderState = TubeHolderState.TubeHolderStateIdle; //管子状态 + public Tube[] tubes = new Tube[10]; //管子 + public Integer processingTubeIndex = -1; //当前管子索引 +} diff --git a/src/main/java/a8k/service/base/sample/TubeHolderState.java b/src/main/java/a8k/service/base/sample/TubeHolderState.java new file mode 100644 index 0000000..4c61c43 --- /dev/null +++ b/src/main/java/a8k/service/base/sample/TubeHolderState.java @@ -0,0 +1,7 @@ +package a8k.service.base.sample; + +public enum TubeHolderState { + TubeHolderStateIdle, //空闲 + TubeHolderStateProcessing, //处理中 + TubeHolderStateProcessed, //处理完成 +} diff --git a/src/main/java/a8k/service/base/sample/TubeState.java b/src/main/java/a8k/service/base/sample/TubeState.java new file mode 100644 index 0000000..c48b320 --- /dev/null +++ b/src/main/java/a8k/service/base/sample/TubeState.java @@ -0,0 +1,18 @@ +package a8k.service.base.sample; + +public enum TubeState { + //空 + EMPTY, + //待处理 + READY, + //预处理中 + PRE_PROCESSING, + //待采样 + TO_BE_SAMPLED, + //采样中 + SAMPLING, + //采样完成 + SAMPLED, + //处理完成 + PROCESS_COMPLETE, +} diff --git a/src/main/java/a8k/service/base/samplecfg/SampleTubeCfg.java b/src/main/java/a8k/service/base/samplecfg/SampleTubeCfg.java new file mode 100644 index 0000000..dfb4445 --- /dev/null +++ b/src/main/java/a8k/service/base/samplecfg/SampleTubeCfg.java @@ -0,0 +1,8 @@ +package a8k.service.base.samplecfg; + +import a8k.service.base.sample.SampleInfo; + +import java.util.List; + +public class SampleTubeCfg extends SampleInfo { +} diff --git a/src/main/java/a8k/service/base/samplecfg/SampleTubeHolderCfg.java b/src/main/java/a8k/service/base/samplecfg/SampleTubeHolderCfg.java new file mode 100644 index 0000000..358749f --- /dev/null +++ b/src/main/java/a8k/service/base/samplecfg/SampleTubeHolderCfg.java @@ -0,0 +1,9 @@ +package a8k.service.base.samplecfg; + +import a8k.appbase.A8kTubeType; + +public class SampleTubeHolderCfg { + Boolean active;//是否激活 + A8kTubeType tubeHolderType = A8kTubeType.BloodTube; //试管架类型 + SampleTubeCfg[] sampleTubeCfgs = new SampleTubeCfg[10]; //试管配置 +} diff --git a/src/main/java/a8k/service/ctrl_service/AppCtrlService.java b/src/main/java/a8k/service/ctrl_service/AppCtrlService.java new file mode 100644 index 0000000..d1afd28 --- /dev/null +++ b/src/main/java/a8k/service/ctrl_service/AppCtrlService.java @@ -0,0 +1,78 @@ +package a8k.service.ctrl_service; + +import a8k.appbase.appret.AppRet; +import a8k.controler.engineer.utils.EngineerPageTab; +import a8k.controler.engineer.utils.EnginnerPageAction; +import a8k.service.ProjectColorAllocer; +import a8k.service.base.consumable.ConsumableItemGroup; +import a8k.service.base.consumable.ReactantItem; +import a8k.service.base.consumable.TipGroupInfo; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +@EngineerPageTab(name = "AppCtrlService") +@Component +public class AppCtrlService { + + + @Resource + ProjectColorAllocer projectColorAllocer; + + + @EnginnerPageAction(name = "初始化设备") + public AppRet initDevice() { + return AppRet.success(); + + } + + //启动 + @EnginnerPageAction(name = "启动") + public AppRet startProcess() { + return AppRet.success(); + } + + //暂停 + @EnginnerPageAction(name = "暂停") + public AppRet pauseProcess() { + return AppRet.success(); + } + + //急停 + @EnginnerPageAction(name = "急停") + public AppRet forceStopProcess() { + return AppRet.success(); + } + + //停止 + @EnginnerPageAction(name = "停止") + public AppRet stopProcess() { + return AppRet.success(); + } + + //关机 + @EnginnerPageAction(name = "关机") + public AppRet shutdown() { + return AppRet.success(); + } + + + //扫描耗材 + @EnginnerPageAction(name = "扫描耗材") + public AppRet scanningConsumables() { + ConsumableItemGroup var = new ConsumableItemGroup(); + for (int i = 0; i < 6; i++) { + var.reactantItems[i] = new ReactantItem(); + var.reactantItems[i].projId = "PROJECT_" + i; + var.reactantItems[i].lotVal = "LOT_" + i; + var.reactantItems[i].color = projectColorAllocer.getProjectColor(var.reactantItems[i].projId); + var.reactantItems[i].hasDetectionMaterial = i % 2 == 0; + var.reactantItems[i].hasSmallBufferBottle = i % 2 == 1; + var.reactantItems[i].hasLargeBufferBottle = i % 2 == 0; + + } + var.tip[0] = new TipGroupInfo(); + var.tip[1] = new TipGroupInfo(); + var.tip[2] = new TipGroupInfo(); + return AppRet.success(var); + } +} diff --git a/src/main/java/a8k/service/hardware/SamplesPreProcessModuleCtrlService.java b/src/main/java/a8k/service/hardware/SamplesPreProcessModuleCtrlService.java index c8cdb92..ac6a9c9 100644 --- a/src/main/java/a8k/service/hardware/SamplesPreProcessModuleCtrlService.java +++ b/src/main/java/a8k/service/hardware/SamplesPreProcessModuleCtrlService.java @@ -202,21 +202,16 @@ public class SamplesPreProcessModuleCtrlService implements HardwareCtrlModule { /** * 取试管帽,如果试管帽存在, - * @param tubeType HighBlood,ShortBlood,Mini,MiniBlood,BulletTube1P5,BulletTube0P5 + * @param highTube true/false */ @EnginnerPageAction(name = "取试管") - public AppRet takeTubeAndJudgeTubeExist(A8kTubeType tubeType) throws HardwareException, InterruptedException { - logger.info("takeTube tubeType:{}", tubeType); + public AppRet takeTubeAndJudgeTubeExist(Boolean highTube) throws HardwareException, InterruptedException { /* * 校验: * 1.当前摇匀模组设计到的电机是否都处于待机位 */ - if (tubeType != A8kTubeType.HighBlood && tubeType != A8kTubeType.ShortBlood) { - return AppRet.fail(A8kEcode.TubeTypeNotSupport); - } - //Z轴在原点 if (!canBus.stepMotorReadIoState(MId.ShakeModGripperZM, 0)) { throw new HardwareException(MId.ShakeModGripperZM, A8kEcode.MNotInZeroPos); @@ -237,7 +232,7 @@ public class SamplesPreProcessModuleCtrlService implements HardwareCtrlModule { throw new HardwareException(MId.ShakeModClampingM, A8kEcode.MNotInZeroPos); } - boolean isHighBlood = A8kTubeType.HighBlood.equals(tubeType); + boolean isHighBlood = highTube; boolean tubeCapExist = true; Integer gripperJudgeCapZPos = isHighBlood ? getGripperJudgeHTubeCapZPos() : getGripperJudgeSTubeCapZPos(); Integer gripperTakeTubeZPos = isHighBlood ? getGripperTakeHTubeZPos() : getGripperTakeSTubeZPos(); diff --git a/src/main/java/a8k/service/project_mgr/ProjectItemMgrService.java b/src/main/java/a8k/service/project_mgr/ProjectItemMgrService.java new file mode 100644 index 0000000..b6cd44c --- /dev/null +++ b/src/main/java/a8k/service/project_mgr/ProjectItemMgrService.java @@ -0,0 +1,76 @@ +package a8k.service.project_mgr; + + +import a8k.appbase.AppEventListener; +import a8k.appbase.ProjectInfoSimple; +import a8k.appbase.appret.AppRet; +import a8k.controler.engineer.utils.EngineerPageTab; +import a8k.controler.engineer.utils.EnginnerPageAction; +import a8k.db.ProjectInfo; +import a8k.service.appeventbus.AppEventBusService; +import a8k.service.appeventbus.appevent.A8kHardwareReport; +import a8k.service.appeventbus.appevent.AppEvent; +import a8k.service.hardware.canbus.A8kCanBusService; +import a8k.service.hardware.canbus.protocol.A8kPacket; +import a8k.service.hardware.canbus.protocol.CmdId; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component +@EngineerPageTab(name = "ProjectItemMgr") +public class ProjectItemMgrService implements AppEventListener { + static Logger logger = org.slf4j.LoggerFactory.getLogger(ProjectItemMgrService.class); + + @Resource + A8kCanBusService canBus; + + @Resource + AppEventBusService eventBus; + + @PostConstruct + public void init() { + + } + + @Override public void onAppEvent(AppEvent event) { + if (event instanceof A8kHardwareReport canPacket) { + A8kPacket packet = canPacket.getReportPacket(); + CmdId cmdId = CmdId.valueOf(packet.getCmdId()); + if (CmdId.event_a8000_idcard_online.equals(cmdId)) { + logger.info("插入ID卡"); + } else if (CmdId.event_a8000_idcard_offline.equals(cmdId)) { + logger.info("拔出ID卡"); + } + + } + } + + ProjectInfo dbGetProjectInfo(String lotName) { + return ProjectInfo.findOne(ProjectInfo.class, Map.of("lotName", lotName)); + } + + List dbGetProjectInfos() { + var pinfos = ProjectInfo.find(ProjectInfo.class); + List result = new ArrayList<>(); + for (var pinfo : pinfos) { + result.add(new ProjectInfoSimple(pinfo)); + } + return result; + } + + + @EnginnerPageAction(name = "获取项目信息(简单)") + public AppRet> getProjectInfoSimple() { + return AppRet.success(dbGetProjectInfos()); + } + + + + +} diff --git a/src/main/java/a8k/service/state_service/A8kStateMgrService.java b/src/main/java/a8k/service/state_service/A8kStateMgrService.java index 73be3e5..f29a063 100644 --- a/src/main/java/a8k/service/state_service/A8kStateMgrService.java +++ b/src/main/java/a8k/service/state_service/A8kStateMgrService.java @@ -1,5 +1,7 @@ package a8k.service.state_service; +import a8k.controler.engineer.utils.EngineerPageTab; +import a8k.service.base.A8kDeviceState; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.iflytop.uf.UfActiveRecord; @@ -12,34 +14,31 @@ import org.springframework.boot.json.JacksonJsonParser; import org.springframework.stereotype.Component; @Component +@EngineerPageTab(name = "A8kStateMgrService") public class A8kStateMgrService { /* * 该服务约定: * 1. 前端只能读取该服务中的状态,不能设置,设置只能通过其他服务进行设置 - * - * */ public static final Logger logger = LoggerFactory.getLogger(A8kStateMgrService.class); + public A8kDeviceState deviceState = new A8kDeviceState(); + // AppUsr appusr; //用户是否登录 + // AppUsr debugPageUsr; //调试页面用户是否登录 -// AppUsr appusr; //用户是否登录 -// AppUsr debugPageUsr; //调试页面用户是否登录 - Boolean deviceInited = false; //设备是否初始化过 - Boolean devicePoweredOffNormally = false; //设备是否正常关机 - - @PostConstruct - public void init() { -// var list = UfActiveRecord.find(A8kStateDB.class); -// if (list.isEmpty()) { -// updateA8kState(new A8kState()); -// } - } + // @PostConstruct + // public void init() { + // var list = UfActiveRecord.find(A8kStateDB.class); + // if (list.isEmpty()) { + // updateA8kState(new A8kState()); + // } +} - // - // 用户状态 - // +// +// 用户状态 +// // public void loginAppUsr(@NotNull AppUsr appusr) { // this.appusr = appusr; // } @@ -64,79 +63,76 @@ public class A8kStateMgrService { // public boolean isDebugPageUsrLogin() { // return debugPageUsr != null; // } - - // - // 设备初始化状态 - // - - /** - * 机器是否初始化过 - * @return 机器是否初始化过 - */ - public boolean isDeviceInited() { - return deviceInited; - } - - /** - * @return 返回上一次设备是否正常关机 - */ - public boolean isTheDevicePoweredOffNormally() { - return devicePoweredOffNormally; - } - - /** - * 设备初始化完成,开机后设备初始化完成时候,调用该方法 - */ - public void setDeviceInited() { - this.deviceInited = true; - this.devicePoweredOffNormally = false; - - A8kState state = getA8kState(); - state.devicePoweredOffNormally = false; - updateA8kState(state); - } - - public void setDevicePoweredOffNormally() { - this.devicePoweredOffNormally = true; - - A8kState state = getA8kState(); - state.devicePoweredOffNormally = true; - updateA8kState(state); - } - - - A8kState getA8kState() { - var one = UfActiveRecord.find(A8kStateDB.class).get(0); - assert one != null; - - ObjectMapper mapper = new ObjectMapper(); - try { - return mapper.readValue(one.stateJson, A8kState.class); - } catch (JsonProcessingException e) { - assert false; - return null; - } - } - - void updateA8kState(A8kState state) { - var list = UfActiveRecord.find(A8kStateDB.class); - - A8kStateDB one; - if (list.isEmpty()) { - one = new A8kStateDB(); - } else { - one = list.get(0); - } - - ObjectMapper mapper = new ObjectMapper(); - - try { - one.stateJson = mapper.writeValueAsString(state); - one.save(); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - } - - -} +// // +// // 设备初始化状态 +// // +// +// /** +// * 机器是否初始化过 +// * @return 机器是否初始化过 +// */ +// public boolean isDeviceInited() { +// return deviceInited; +// } +// +// /** +// * @return 返回上一次设备是否正常关机 +// */ +// public boolean isTheDevicePoweredOffNormally() { +// return devicePoweredOffNormally; +// } +// +// /** +// * 设备初始化完成,开机后设备初始化完成时候,调用该方法 +// */ +// public void setDeviceInited() { +// this.deviceInited = true; +// this.devicePoweredOffNormally = false; +// +// A8kState state = getA8kState(); +// state.devicePoweredOffNormally = false; +// updateA8kState(state); +// } +// +// public void setDevicePoweredOffNormally() { +// this.devicePoweredOffNormally = true; +// +// A8kState state = getA8kState(); +// state.devicePoweredOffNormally = true; +// updateA8kState(state); +// } +// +// +// A8kState getA8kState() { +// var one = UfActiveRecord.find(A8kStateDB.class).get(0); +// assert one != null; +// +// ObjectMapper mapper = new ObjectMapper(); +// try { +// return mapper.readValue(one.stateJson, A8kState.class); +// } catch (JsonProcessingException e) { +// assert false; +// return null; +// } +// } +// +// void updateA8kState(A8kState state) { +// var list = UfActiveRecord.find(A8kStateDB.class); +// +// A8kStateDB one; +// if (list.isEmpty()) { +// one = new A8kStateDB(); +// } else { +// one = list.get(0); +// } +// +// ObjectMapper mapper = new ObjectMapper(); +// +// try { +// one.stateJson = mapper.writeValueAsString(state); +// one.save(); +// } catch (JsonProcessingException e) { +// throw new RuntimeException(e); +// } +// } +//} diff --git a/src/main/resources/db/migration/V100_5__create_table_DBVersion.sql b/src/main/resources/db/migration/V100_5__create_table_DBVersion.sql new file mode 100644 index 0000000..dd07ba2 --- /dev/null +++ b/src/main/resources/db/migration/V100_5__create_table_DBVersion.sql @@ -0,0 +1,7 @@ +CREATE TABLE "DBTableVersionTable" +( + "id" text NOT NULL, + "tableName" text, + "version" integer, + PRIMARY KEY ("id") +); \ No newline at end of file diff --git a/src/main/resources/db/migration/V100_6__create_table_ProjectColorTable.sql b/src/main/resources/db/migration/V100_6__create_table_ProjectColorTable.sql new file mode 100644 index 0000000..5485944 --- /dev/null +++ b/src/main/resources/db/migration/V100_6__create_table_ProjectColorTable.sql @@ -0,0 +1,8 @@ +CREATE TABLE "ProjectColorTable" +( + "id" text NOT NULL, + "color" text, + "projectId" text, + "index" integer, + PRIMARY KEY ("id") +);