From 143f1a4095bd883a4ea959f8cb2e029babb525c6 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Wed, 9 Oct 2024 09:43:38 +0800 Subject: [PATCH] update --- README.md | 44 ++- src/main/java/a8k/optalgo/OptAlgo.java | 295 +++++++++++++++++++++ src/main/java/a8k/optalgo/type/LinearResult.java | 6 + .../java/a8k/optalgo/type/LinearResultSeq.java | 6 + src/main/java/a8k/optalgo/type/OptAlgoResult.java | 14 +- src/main/java/a8k/optalgo/type/OptCfg.java | 5 + .../java/a8k/optalgo/type/OptProcessContext.java | 4 + src/main/java/a8k/optalgo/type/Peak.java | 11 + src/main/java/a8k/optalgo/type/PeakInfo.java | 11 - .../appdata/AppReactionResultMgrService.java | 1 + .../service/appdata/AppSampleRecordMgrService.java | 105 -------- .../java/a8k/service/appdata/AppSettingsMgr.java | 123 --------- .../a8k/service/appsetting/AppSettingsMgr.java | 123 +++++++++ 13 files changed, 498 insertions(+), 250 deletions(-) create mode 100644 src/main/java/a8k/optalgo/type/LinearResult.java create mode 100644 src/main/java/a8k/optalgo/type/LinearResultSeq.java create mode 100644 src/main/java/a8k/optalgo/type/OptCfg.java create mode 100644 src/main/java/a8k/optalgo/type/OptProcessContext.java create mode 100644 src/main/java/a8k/optalgo/type/Peak.java delete mode 100644 src/main/java/a8k/optalgo/type/PeakInfo.java delete mode 100644 src/main/java/a8k/service/appdata/AppSampleRecordMgrService.java delete mode 100644 src/main/java/a8k/service/appdata/AppSettingsMgr.java create mode 100644 src/main/java/a8k/service/appsetting/AppSettingsMgr.java diff --git a/README.md b/README.md index 79df0cc..2ca8d8f 100644 --- a/README.md +++ b/README.md @@ -200,10 +200,48 @@ TODO: TODO: 1. 如果当前板夹仓对应位置的耗材批次码没有发生变化,则耗材量不重新初始化。 2. tip头只有在第一次扫描时,才会初始化其数量是满的。 - - - +``` +``` +TODO: +1. 软件启动后读取所有单片机版本号。 +2. 添加温度控制服务。(不用向前台提供接口) +3. 扫描耗材时,检查ID卡,同时检查温度是否一致。 +4. MainFlowCtrl监听,温度控制异常事件,当发生异常时,主动暂停MainFlowCtrl +5. 打印结果 +6. 支持扫码枪 + +添加DEBUG模式, + 需要模拟硬件行为的地方。 + 1. 耗材扫描 + 2. 初始化 + 3. 工作流中的所有动作 + 需要产生的虚假行为 + 1. 触发.提供插入一个假的ID卡配置的事件 + 2. 触发.提供假的耗材配置 + 3. 触发.提供假的样本 + 4. 触发.添加一个假的急诊 + + +为前台提供的接口: + 设备控制 + 主流程控制 + 扫描耗材 + 添加急诊 + 开关机 + 配置: + xxx + xxx + xxx + + 数据 + 项目管理 + 用户接口 + + 事件 + ... + 错误码 + ... ``` \ No newline at end of file diff --git a/src/main/java/a8k/optalgo/OptAlgo.java b/src/main/java/a8k/optalgo/OptAlgo.java index 9f88157..5792fb7 100644 --- a/src/main/java/a8k/optalgo/OptAlgo.java +++ b/src/main/java/a8k/optalgo/OptAlgo.java @@ -1,7 +1,302 @@ package a8k.optalgo; +import a8k.optalgo.type.LinearResult; +import a8k.optalgo.type.OptAlgoResult; + public class OptAlgo { + OptAlgoResult processOptData(Integer expectPeakNum, Float[] data) { + return null; + } + + Boolean feq(double a, double b, double epsilon) { + double dv = a - b; + if (dv < 0) + dv = -dv; + return dv <= epsilon; + } + + Float[] super_sampling(Float[] inputRaw, Integer nInputLength, Integer nUpSampleRate) { + /* + * @brief + * + */ + int nOutputLength = nInputLength * nUpSampleRate; + Float[] upSamplingRaw = new Float[nOutputLength]; + + for (int si = 0, di = 0; si < nInputLength - 1; di++) { + float a = upSamplingRaw[di * nUpSampleRate] = (float) inputRaw[si]; + float b = upSamplingRaw[(di + 1) * nUpSampleRate] = (float) inputRaw[++si]; + + float nSlope = (b - a) / nUpSampleRate; + + for (int i = 0; i < nUpSampleRate - 1; i++) { + int baseIndex = (di * nUpSampleRate) + i; + upSamplingRaw[baseIndex + 1] = upSamplingRaw[baseIndex] + nSlope; + } + } + + return upSamplingRaw; + } + + Float[] sub_sampling(Float[] inputRaw, int nSubSampleRate) { + int nSum = 0; + float fAvg = 0; + int subIndex = 0; + int nOutputLength = inputRaw.length / nSubSampleRate; + + Float[] subSampledRaw = new Float[nOutputLength]; + + for (int index = 0; index < inputRaw.length; index++) { + if (index % nSubSampleRate == 0 && index > 0) { + fAvg = nSum * 1.0f / nSubSampleRate; + if (subIndex < subSampledRaw.length) { + subSampledRaw[subIndex++] = fAvg; + } else { + int empty = 0; + } + nSum = 0; + } + nSum += inputRaw[index]; + } + subSampledRaw[subSampledRaw.length - 1] = subSampledRaw[subSampledRaw.length - 2]; + return subSampledRaw; + } + + Float[] smooth_windows(Float[] inputRaw, int windows_size) { + Float[] smoothRaw = new Float[inputRaw.length]; + int windows_size_half = (windows_size - 1) / 2; + + for (int index = windows_size_half; index < inputRaw.length - windows_size_half; index++) { + float sum = 0; + for (int i = index - windows_size_half; i <= index + windows_size_half; i++) { + sum += inputRaw[i]; + } + smoothRaw[index] = sum / windows_size; + } + + for (int i = 0; i < windows_size_half; i++) { + smoothRaw[i] = smoothRaw[windows_size_half]; + } + + for (int i = inputRaw.length - windows_size_half; i < inputRaw.length; i++) { + smoothRaw[i] = smoothRaw[inputRaw.length - windows_size_half - 1]; + } + + return smoothRaw; + } + + Float[] median_filtering(Float[] inputRaw, int windows_size) { + Float[] medianRaw = new Float[inputRaw.length]; + Float[] windows = new Float[windows_size]; + + int windows_size_half = (windows_size - 1) / 2; + + for (int index = windows_size_half; index < inputRaw.length - windows_size_half; index++) { + for (int i = 0; i < windows_size; i++) { + windows[i] = inputRaw[index + i - windows_size_half]; + } + sort_vector(windows); // 从小到大顺序排序 + medianRaw[index] = windows[windows_size_half + 1]; + } + + for (int i = 0; i < windows_size_half; i++) { + medianRaw[i] = medianRaw[windows_size_half]; + } + + for (int i = inputRaw.length - windows_size_half; i < inputRaw.length; i++) { + medianRaw[i] = medianRaw[inputRaw.length - windows_size_half - 1]; + } + + return medianRaw; + } + + /** + * @brief 求数据的均值 + * + * @param inputRaw + * @return float + */ + float find_avg_line(Float[] inputRaw) { + float base_min = 500; + float fsum = 0; + int cnt = 0; + + int range = inputRaw.length; + + do { + fsum = cnt = 0; + for (int i = 1; i < range; i++) { + if (inputRaw[i] < base_min) { + fsum += inputRaw[i]; + cnt++; + } + } + + base_min = base_min + 50; + } while (cnt < range - 15 * inputRaw.length / 250); + + float fbase = fsum / cnt; + return fbase; + } + + Float[] differentiate(Float[] inputRaw) { + /** + * @brief + * 巴迪泰源码,对原始数据添加了一些微小的值,原因未知 + */ + for (int i = 0; i <= inputRaw.length - 8; i += 8) { + inputRaw[i + 1] = inputRaw[i + 1] + 0.001f; + inputRaw[i + 2] = inputRaw[i + 2] + 0.002f; + inputRaw[i + 3] = inputRaw[i + 3] + 0.003f; + inputRaw[i + 4] = inputRaw[i + 4] + 0.004f; + inputRaw[i + 5] = inputRaw[i + 5] + 0.005f; + inputRaw[i + 6] = inputRaw[i + 6] + 0.004f; + inputRaw[i + 7] = inputRaw[i + 7] + 0.003f; + inputRaw[i + 8] = inputRaw[i + 8] + 0.002f; + } + + /** + * @brief + * @Warning: 此处求导和巴迪泰的存在差异, + * 巴迪泰的是当前数值减去下一个数值, + * 而此处是当前数值减去上一个数值 + */ + + Float[] differentiateRaw = new Float[inputRaw.length]; + for (int i = 1; i < differentiateRaw.length; i++) { + differentiateRaw[i] = inputRaw[i] - inputRaw[i - 1]; + } + differentiateRaw[0] = differentiateRaw[1]; + return differentiateRaw; + } + + Float[] least_square_method_differentiate(Float[] inputRaw, int windows_size) { + assert (windows_size > 0); + assert (windows_size % 2 == 1); + + + Float[] differentiateRaw = new Float[inputRaw.length]; + Float[] windowsRaw = new Float[windows_size]; + + int windows_size_half = (windows_size - 1) / 2; + + for (int index = windows_size_half; index < inputRaw.length - windows_size_half; index++) { + windowsRaw = getwindowspoint(inputRaw, index, windows_size); + float intercept = 0; + // linear_least_squares(windowsRaw, windows_size, differentiateRaw[index], intercept); + } + + for (int i = 0; i < windows_size_half; i++) { + differentiateRaw[i] = differentiateRaw[windows_size_half]; + } + + for (int i = inputRaw.length - windows_size_half; i < inputRaw.length; i++) { + differentiateRaw[i] = differentiateRaw[inputRaw.length - windows_size_half - 1]; + } + return differentiateRaw; + } + + Boolean is_maxval_in_windows(Float[] data, int pos, int windows_size) { + assert (windows_size > 0); + assert (windows_size % 2 == 1); + + boolean ret = true; + int startPos = pos - windows_size / 2; + Float val = data[pos]; + + for (int i = 0; i < windows_size; i++) { + if (startPos + i == pos) + continue; + + if (data[startPos + i] > val) { + ret = false; + break; + } + } + return ret; + } + + LinearResult linear_least_squares(double[] x, double[] y) { + LinearResult result = new LinearResult(); + int n = x.length; + double sumX = 0.0, sumY = 0.0, sumXY = 0.0, sumXX = 0.0; + for (int i = 0; i < n; ++i) { + sumX += x[i]; + sumY += y[i]; + sumXY += x[i] * y[i]; + sumXX += x[i] * x[i]; + } + double xMean = sumX / n; + double yMean = sumY / n; + + assert (!feq((sumXX - n * xMean * xMean), 0, 0.0001)); + result.slope = (sumXY - n * xMean * yMean) / (sumXX - n * xMean * xMean); + result.intercept = yMean - result.slope * xMean; + return result; + } + + + // + LinearResult linear_least_squares(double[] y, int size) { + double[] xpoint = new double[size]; + double[] ypoint = new double[size]; + + for (int i = 0; i < size; i++) { + xpoint[i] = i; + ypoint[i] = y[i]; + } + return linear_least_squares(xpoint, ypoint); + } + + LinearResult linear_least_squares_muti_windos(int[] startx, int windows, float[] y) { + double[] xpoint = new double[windows * startx.length]; + double[] ypoint = new double[windows * startx.length]; + + int j = 0; + for (int xstart : startx) { + for (int xindex = xstart; xindex < (xstart + windows); xindex++) { + xpoint[j] = xindex; + ypoint[j] = y[xindex]; + j++; + } + } + return linear_least_squares(xpoint, ypoint); + } + + + float get_avg_in_windows(double[] src, int off, int windows) { + float sum = 0; + assert (windows % 2 == 1); + for (int i = off - windows / 2; i <= off + windows / 2; i++) { + sum += (float) src[i]; + } + return sum / windows; + } + + void sort_vector(Float[] src) { + // 实现冒泡排序 + for (int i = 0; i < src.length; i++) { + for (int j = 0; j < src.length - i - 1; j++) { + if (src[j] > src[j + 1]) { + float temp = src[j]; + src[j] = src[j + 1]; + src[j + 1] = temp; + } + } + } + } + + double[] getwindowspoint(double[] src, int off, int windows) { + double[] ret = new double[windows]; + int retindex = 0; + for (int i = off - windows / 2; i <= off + windows / 2; i++) { + ret[retindex] = src[i]; + retindex++; + } + return ret; + } + } diff --git a/src/main/java/a8k/optalgo/type/LinearResult.java b/src/main/java/a8k/optalgo/type/LinearResult.java new file mode 100644 index 0000000..5fbb04f --- /dev/null +++ b/src/main/java/a8k/optalgo/type/LinearResult.java @@ -0,0 +1,6 @@ +package a8k.optalgo.type; + +public class LinearResult { + public double slope; + public double intercept; +} diff --git a/src/main/java/a8k/optalgo/type/LinearResultSeq.java b/src/main/java/a8k/optalgo/type/LinearResultSeq.java new file mode 100644 index 0000000..d294fe8 --- /dev/null +++ b/src/main/java/a8k/optalgo/type/LinearResultSeq.java @@ -0,0 +1,6 @@ +package a8k.optalgo.type; + +public class LinearResultSeq { + public Float[] slope; + public Float intercept; +} diff --git a/src/main/java/a8k/optalgo/type/OptAlgoResult.java b/src/main/java/a8k/optalgo/type/OptAlgoResult.java index df72ba5..9e6f233 100644 --- a/src/main/java/a8k/optalgo/type/OptAlgoResult.java +++ b/src/main/java/a8k/optalgo/type/OptAlgoResult.java @@ -1,14 +1,12 @@ package a8k.optalgo.type; +import java.util.ArrayList; import java.util.List; public class OptAlgoResult { - // vector ogigin_val; // 1200 - // vector supper_val; // 原始数据,线性填充,1200*5=6000 - // vector supper_median_val; // supper_val 窗口平滑滤波,6000 - // vector supper_smooth_sub_val; // supper_smooth_val 均值压缩,6000/6=1000 - public Float[] ogiginVal; - public Float[] supperVal; - public Float[] supperMedianVal; - public Float[] supperSmoothSubVal; + + public Float[] ogigin_val; // 1200 POINT + public Float[] result_val; // 250 POINT + + public List peaks = new ArrayList<>(); } diff --git a/src/main/java/a8k/optalgo/type/OptCfg.java b/src/main/java/a8k/optalgo/type/OptCfg.java new file mode 100644 index 0000000..c9b654c --- /dev/null +++ b/src/main/java/a8k/optalgo/type/OptCfg.java @@ -0,0 +1,5 @@ +package a8k.optalgo.type; + +public class OptCfg { + public Integer peakNum; +} diff --git a/src/main/java/a8k/optalgo/type/OptProcessContext.java b/src/main/java/a8k/optalgo/type/OptProcessContext.java new file mode 100644 index 0000000..dfe9593 --- /dev/null +++ b/src/main/java/a8k/optalgo/type/OptProcessContext.java @@ -0,0 +1,4 @@ +package a8k.optalgo.type; + +public class OptProcessContext { +} diff --git a/src/main/java/a8k/optalgo/type/Peak.java b/src/main/java/a8k/optalgo/type/Peak.java new file mode 100644 index 0000000..b439e37 --- /dev/null +++ b/src/main/java/a8k/optalgo/type/Peak.java @@ -0,0 +1,11 @@ +package a8k.optalgo.type; + +public class Peak { + public Boolean findPeak; + public Float peakFullArea; + public Float peakBaseLineArea; + public Float area; + public Integer peakPos; + public Integer peakStartPos; + public Integer peakEndPos; +} diff --git a/src/main/java/a8k/optalgo/type/PeakInfo.java b/src/main/java/a8k/optalgo/type/PeakInfo.java deleted file mode 100644 index 5d5a951..0000000 --- a/src/main/java/a8k/optalgo/type/PeakInfo.java +++ /dev/null @@ -1,11 +0,0 @@ -package a8k.optalgo.type; - -public class PeakInfo { - public Boolean findPeak; - public Float peakFullArea; - public Float peakBaseLineArea; - public Float area; - public Integer peakPos; - public Integer peakStartPos; - public Integer peakEndPos; -} diff --git a/src/main/java/a8k/service/appdata/AppReactionResultMgrService.java b/src/main/java/a8k/service/appdata/AppReactionResultMgrService.java index c9d81d6..dc799df 100644 --- a/src/main/java/a8k/service/appdata/AppReactionResultMgrService.java +++ b/src/main/java/a8k/service/appdata/AppReactionResultMgrService.java @@ -96,4 +96,5 @@ public class AppReactionResultMgrService { } } + } diff --git a/src/main/java/a8k/service/appdata/AppSampleRecordMgrService.java b/src/main/java/a8k/service/appdata/AppSampleRecordMgrService.java deleted file mode 100644 index 61330dc..0000000 --- a/src/main/java/a8k/service/appdata/AppSampleRecordMgrService.java +++ /dev/null @@ -1,105 +0,0 @@ -package a8k.service.appdata; - -import a8k.controler.extapi.pagecontrol.ExtApiTabConfig; -import a8k.controler.extapi.utils.ExtApiFn; -import a8k.controler.extapi.utils.ExtApiTab; -import a8k.dbservice.SampleRecordDBService; -import a8k.dbservice.type.SampleRecord; -import a8k.service.appstate.type.Tube; -import a8k.service.appstate.type.state.TubeState; -import a8k.type.type.BloodType; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.List; - -@Component -@ExtApiTab(cfg = ExtApiTabConfig.AppSampleMgrService) -public class AppSampleRecordMgrService { - - @Resource - SampleRecordDBService sampleRecordDBService; - - // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - @PostConstruct - public void init() { - } - -// String generateSampleId(Date date, Integer tubePos) { -// String sampleid = ""; -// SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd_HHmmss"); -// sampleid = String.format("%s_%s", sdf.format(date), tubePos + 1); -// if (tubePos == -1) { -// sampleid = String.format("%s_%s", sdf.format(date), "E"); -// } -// return sampleid; -// } -// -// @ExtApiFn(name = "addSampleRecordExtApi") -// public SampleRecord addSampleRecordExtApi(Integer tuebPos, BloodType bloodType, String sampleBarcode, String userid, String projIndex) { -// return addSampleRecord(new Date(), tuebPos, bloodType, sampleBarcode, userid, projIndex); -// } -// -// @ExtApiFn(name = "getAllSampleRecordsExtApi") -// public List getAllSampleRecords() { -// return sampleRecordDBService.getAll(); -// } -// -// public SampleRecord addSampleRecord(Date intertime, Integer tuebPos, BloodType bloodType, String sampleBarcode, String userid, String projIndex) { -// SampleRecord record = new SampleRecord(); -// record.bloodType = bloodType; -// record.sampleBarcode = sampleBarcode; -// record.userid = userid; -// record.date = intertime; -// record.sampleid = generateSampleId(intertime, tuebPos); -// for (String s : projIndex.split(",")) { -// record.projIndex.add(Integer.parseInt(s)); -// } -// sampleRecordDBService.add(record); -// return record; -// } -// -// public void addSampleRecord(Tube[] state) { -// Date intertime = new Date(); -// for (int i = 0; i < state.length; i++) { -// if (state[i] == null) { -// continue; -// } -// if (state[i].state.equals(TubeState.EMPTY)) { -// continue; -// } -// SampleRecord record = new SampleRecord(); -// record.bloodType = state[i].bloodType; -// record.sampleBarcode = state[i].sampleBarcode; -// record.userid = state[i].userid; -// record.date = intertime; -// record.isEmergency = state[i].isEmergency; -// record.sampleid = generateSampleId(intertime, i); -// record.projIndex = state[i].projIndex; -// state[i].sampleid = record.sampleid; -// sampleRecordDBService.add(record); -// } -// } -// -// public void addEmergencySampleRecord(Tube state) { -// Date intertime = new Date(); -// SampleRecord record = new SampleRecord(); -// state.isEmergency = true; -// -// record.bloodType = state.bloodType; -// record.sampleBarcode = state.sampleBarcode; -// record.userid = state.userid; -// record.date = intertime; -// record.isEmergency = true; -// record.sampleid = generateSampleId(intertime, -1); -// record.projIndex = state.projIndex; -// state.sampleid = record.sampleid; -// sampleRecordDBService.add(record); -// } -// - -} diff --git a/src/main/java/a8k/service/appdata/AppSettingsMgr.java b/src/main/java/a8k/service/appdata/AppSettingsMgr.java deleted file mode 100644 index 348345c..0000000 --- a/src/main/java/a8k/service/appdata/AppSettingsMgr.java +++ /dev/null @@ -1,123 +0,0 @@ -package a8k.service.appdata; - -import a8k.dbservice.AppSettingDBService; -import a8k.dbservice.type.AppSetting; -import a8k.dbservice.type.appsetting.AppSettingType; -import a8k.dbservice.type.appsetting.settingenum.*; -import a8k.controler.extapi.utils.ExtApiTab; -import a8k.controler.extapi.utils.ExtApiFn; -import a8k.controler.extapi.pagecontrol.ExtApiTabConfig; - -import a8k.dbservice.type.appsetting.AppSettingTab; -import a8k.dbservice.type.appsetting.AppSettingName; -import a8k.hardware.type.a8kcanprotocol.A8kEcode; -import a8k.type.exception.AppException; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import org.slf4j.Logger; -import org.springframework.stereotype.Component; - -import java.util.List; - -@Component -@ExtApiTab(cfg = ExtApiTabConfig.AppSettingsMgr) -public class AppSettingsMgr { - Logger logger = org.slf4j.LoggerFactory.getLogger(AppSettingsMgr.class); - - static class ORDER { - static final int getAppSettings = 1; - static final int getAppSettingByName = 2; - static final int getAppSettingByTab = 2; - static final int getTabs = 3; - static final int getAppSettingTypesRange = 4; - static final int getAppSettingNamesRange = 5; - static final int setOptionVal = 6; - } - - static Integer settingPageVersion = 1;// 如果配置项发生改变,修改这个数字,可以重置数据库 - - @Resource - AppSettingDBService appSettingDBService; - - @PostConstruct - public void init() { - logger.info("AppSettingsMgr init"); - var SETTING_PAGE_VERSION = appSettingDBService.getSettingByName(AppSettingName.SETTING_PAGE_VERSION); - if (SETTING_PAGE_VERSION == null || !SETTING_PAGE_VERSION.getValueAsInt().equals(settingPageVersion)) { - appSettingDBService.clearAllSettings(); - initsettingdb(); - } - } - - public void initsettingdb() { - appSettingDBService.addSettingVersion(settingPageVersion); - //AppSettingTab.DEVICE - appSettingDBService.addEnumSetting(AppSettingTab.DEVICE, AppSettingName.LANGUAGE, LanguageType.class, LanguageType.zh_CN); - appSettingDBService.addBooleanSetting(AppSettingTab.DEVICE, AppSettingName.AUTO_PRINT, false); - appSettingDBService.addEnumSetting(AppSettingTab.DEVICE, AppSettingName.AUTO_LOGOUT, AutoLogoutOption.class, AutoLogoutOption.T00_10); - - // AppSettingTab.LIS - appSettingDBService.addEnumSetting(AppSettingTab.LIS, AppSettingName.LIS_TYPE, LISTypeEnum.class, LISTypeEnum.SINGLE_TRACK); - appSettingDBService.addEnumSetting(AppSettingTab.LIS, AppSettingName.LIS_PROTOCOL, LISProtocolEnum.class, LISProtocolEnum.Boditech); - appSettingDBService.addEnumSetting(AppSettingTab.LIS, AppSettingName.LIS_IF, LISIFType.class, LISIFType.NETWORK); - appSettingDBService.addEnumSetting(AppSettingTab.LIS, AppSettingName.LIS_SERIAL_BAUDRATE, LISSerialBaudrate.class, LISSerialBaudrate.B9600); - appSettingDBService.addIpSetting(AppSettingTab.LIS, AppSettingName.LIS_NET_IP, "127.0.0.1"); - appSettingDBService.addPortSetting(AppSettingTab.LIS, AppSettingName.LIS_NET_PORT, 8080); - } - - Boolean isOptionLegal(AppSettingName name, String val) { - // TODO:添加校验逻辑 - return true; - } - - // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - // EXT FUNC - // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - @ExtApiFn(name = "getAppSettings", order = ORDER.getAppSettings) - public List getAppSettings() { - return (appSettingDBService.getAllSettings()); - } - - @ExtApiFn(name = "getAppSettingByName", order = ORDER.getAppSettingByName) - public AppSetting getAppSettingByName(AppSettingName name) { - return (appSettingDBService.getSettingByName(name)); - } - - @ExtApiFn(name = "getAppSettingByTab", order = ORDER.getAppSettingByTab) - public List getAppSettingByTab(AppSettingTab tab) { - return (appSettingDBService.getSettingsByTab(tab)); - } - - - @ExtApiFn(name = "getTabs", order = ORDER.getTabs) - public AppSettingTab[] getTabs() { - return (AppSettingTab.values()); - } - - @ExtApiFn(name = "getAppSettingTypesRange", order = ORDER.getAppSettingTypesRange) - public AppSettingType[] getAppSettingTypesRange() { - return (AppSettingType.values()); - } - - @ExtApiFn(name = "getAppSettingNamesRange", order = ORDER.getAppSettingNamesRange) - public AppSettingName[] getAppSettingNamesRange() { - return (AppSettingName.values()); - } - - @ExtApiFn(name = "setOptionVal", order = ORDER.setOptionVal) - public AppSetting setOptionVal(AppSettingName optionName, String val) throws AppException { - logger.info("setOptionVal {}={}", optionName, val); - if (!isOptionLegal(optionName, val)) { - throw new AppException(A8kEcode.FrontendParamTypeError); - } - appSettingDBService.updateSetting(optionName, val); - return getAppSettingByName(optionName); - } - - @ExtApiFn(name = "factoryReset") - public void factoryReset() { - appSettingDBService.clearAllSettings(); - initsettingdb(); - } -} diff --git a/src/main/java/a8k/service/appsetting/AppSettingsMgr.java b/src/main/java/a8k/service/appsetting/AppSettingsMgr.java new file mode 100644 index 0000000..76856f0 --- /dev/null +++ b/src/main/java/a8k/service/appsetting/AppSettingsMgr.java @@ -0,0 +1,123 @@ +package a8k.service.appsetting; + +import a8k.dbservice.AppSettingDBService; +import a8k.dbservice.type.AppSetting; +import a8k.dbservice.type.appsetting.AppSettingType; +import a8k.dbservice.type.appsetting.settingenum.*; +import a8k.controler.extapi.utils.ExtApiTab; +import a8k.controler.extapi.utils.ExtApiFn; +import a8k.controler.extapi.pagecontrol.ExtApiTabConfig; + +import a8k.dbservice.type.appsetting.AppSettingTab; +import a8k.dbservice.type.appsetting.AppSettingName; +import a8k.hardware.type.a8kcanprotocol.A8kEcode; +import a8k.type.exception.AppException; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +@ExtApiTab(cfg = ExtApiTabConfig.AppSettingsMgr) +public class AppSettingsMgr { + Logger logger = org.slf4j.LoggerFactory.getLogger(AppSettingsMgr.class); + + static class ORDER { + static final int getAppSettings = 1; + static final int getAppSettingByName = 2; + static final int getAppSettingByTab = 2; + static final int getTabs = 3; + static final int getAppSettingTypesRange = 4; + static final int getAppSettingNamesRange = 5; + static final int setOptionVal = 6; + } + + static Integer settingPageVersion = 1;// 如果配置项发生改变,修改这个数字,可以重置数据库 + + @Resource + AppSettingDBService appSettingDBService; + + @PostConstruct + public void init() { + logger.info("AppSettingsMgr init"); + var SETTING_PAGE_VERSION = appSettingDBService.getSettingByName(AppSettingName.SETTING_PAGE_VERSION); + if (SETTING_PAGE_VERSION == null || !SETTING_PAGE_VERSION.getValueAsInt().equals(settingPageVersion)) { + appSettingDBService.clearAllSettings(); + initsettingdb(); + } + } + + public void initsettingdb() { + appSettingDBService.addSettingVersion(settingPageVersion); + //AppSettingTab.DEVICE + appSettingDBService.addEnumSetting(AppSettingTab.DEVICE, AppSettingName.LANGUAGE, LanguageType.class, LanguageType.zh_CN); + appSettingDBService.addBooleanSetting(AppSettingTab.DEVICE, AppSettingName.AUTO_PRINT, false); + appSettingDBService.addEnumSetting(AppSettingTab.DEVICE, AppSettingName.AUTO_LOGOUT, AutoLogoutOption.class, AutoLogoutOption.T00_10); + + // AppSettingTab.LIS + appSettingDBService.addEnumSetting(AppSettingTab.LIS, AppSettingName.LIS_TYPE, LISTypeEnum.class, LISTypeEnum.SINGLE_TRACK); + appSettingDBService.addEnumSetting(AppSettingTab.LIS, AppSettingName.LIS_PROTOCOL, LISProtocolEnum.class, LISProtocolEnum.Boditech); + appSettingDBService.addEnumSetting(AppSettingTab.LIS, AppSettingName.LIS_IF, LISIFType.class, LISIFType.NETWORK); + appSettingDBService.addEnumSetting(AppSettingTab.LIS, AppSettingName.LIS_SERIAL_BAUDRATE, LISSerialBaudrate.class, LISSerialBaudrate.B9600); + appSettingDBService.addIpSetting(AppSettingTab.LIS, AppSettingName.LIS_NET_IP, "127.0.0.1"); + appSettingDBService.addPortSetting(AppSettingTab.LIS, AppSettingName.LIS_NET_PORT, 8080); + } + + Boolean isOptionLegal(AppSettingName name, String val) { + // TODO:添加校验逻辑 + return true; + } + + // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + // EXT FUNC + // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + @ExtApiFn(name = "getAppSettings", order = ORDER.getAppSettings) + public List getAppSettings() { + return (appSettingDBService.getAllSettings()); + } + + @ExtApiFn(name = "getAppSettingByName", order = ORDER.getAppSettingByName) + public AppSetting getAppSettingByName(AppSettingName name) { + return (appSettingDBService.getSettingByName(name)); + } + + @ExtApiFn(name = "getAppSettingByTab", order = ORDER.getAppSettingByTab) + public List getAppSettingByTab(AppSettingTab tab) { + return (appSettingDBService.getSettingsByTab(tab)); + } + + + @ExtApiFn(name = "getTabs", order = ORDER.getTabs) + public AppSettingTab[] getTabs() { + return (AppSettingTab.values()); + } + + @ExtApiFn(name = "getAppSettingTypesRange", order = ORDER.getAppSettingTypesRange) + public AppSettingType[] getAppSettingTypesRange() { + return (AppSettingType.values()); + } + + @ExtApiFn(name = "getAppSettingNamesRange", order = ORDER.getAppSettingNamesRange) + public AppSettingName[] getAppSettingNamesRange() { + return (AppSettingName.values()); + } + + @ExtApiFn(name = "setOptionVal", order = ORDER.setOptionVal) + public AppSetting setOptionVal(AppSettingName optionName, String val) throws AppException { + logger.info("setOptionVal {}={}", optionName, val); + if (!isOptionLegal(optionName, val)) { + throw new AppException(A8kEcode.FrontendParamTypeError); + } + appSettingDBService.updateSetting(optionName, val); + return getAppSettingByName(optionName); + } + + @ExtApiFn(name = "factoryReset") + public void factoryReset() { + appSettingDBService.clearAllSettings(); + initsettingdb(); + } +}