From 1ab11991a6bc2b0496c83cb969b0f5bc6f22a309 Mon Sep 17 00:00:00 2001 From: dengzedong <dengzedong@email> Date: 星期四, 20 二月 2025 11:22:42 +0800 Subject: [PATCH] 模型输入添加IND_ASCII类型,用于输入字符串类型数据 --- iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/utils/DateUtils.java | 2 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/common/enums/ModelParamType.java | 3 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/PredictSampleDataConstructor.java | 97 ++++++++++++++++++++++--------- iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/ScheduleSampleInfoConstructor.java | 2 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/PredictSampleInfoConstructor.java | 2 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/SampleInfoConstructor.java | 3 + iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/utils/ASCIIUtil.java | 23 +++++++ iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/SampleDataConstructor.java | 1 8 files changed, 101 insertions(+), 32 deletions(-) diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/utils/ASCIIUtil.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/utils/ASCIIUtil.java new file mode 100644 index 0000000..35c6bbc --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/utils/ASCIIUtil.java @@ -0,0 +1,23 @@ +package com.iailab.module.model.common.utils; + +/** + * @description: + * @author: dzd + * @date: 2025/2/19 16:22 + **/ +public class ASCIIUtil { + + /** + * @description: String 转 ASCII码double[] + **/ + public static double[] stringToAsciiArray(String str) { + int length = str.length(); + double[] asciiArray = new double[length]; + // 遍历字符串中的每个字符 + for (int i = 0; i < length; i++) { + // 获取当前字符的 ASCII 码值 + asciiArray[i] = str.charAt(i); + } + return asciiArray; + } +} diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/utils/DateUtils.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/utils/DateUtils.java index 2d4fddc..2df9fc9 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/utils/DateUtils.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/utils/DateUtils.java @@ -37,6 +37,8 @@ public final static String DATE_PATTERN_YEAR = "yyyy"; + public final static String DATE_TIME_STRING = "yyyyMMddHHmmssSSS"; + /** * 日期格式化 日期格式为:yyyy-MM-dd * @param date 日期 diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/common/enums/ModelParamType.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/common/enums/ModelParamType.java index 30b7b94..2b8703e 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/common/enums/ModelParamType.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/common/enums/ModelParamType.java @@ -17,7 +17,8 @@ DATAPOINT("DATAPOINT", "测点值"), NORMALITEM("NormalItem", "预测值(NormalItem)"), MERGEITEM("MergeItem", "MergeItem"), - IND("IND", "指标值"), + IND("IND", "指标值(double)"), + IND_ASCII("IND_ASCII", "指标值(ASCII)"), PLAN("PLAN", "计划值"); private String code; diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/PredictSampleDataConstructor.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/PredictSampleDataConstructor.java index b755a2a..c2bfd25 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/PredictSampleDataConstructor.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/PredictSampleDataConstructor.java @@ -13,6 +13,7 @@ import com.iailab.module.data.api.point.dto.ApiPointValueQueryDTO; import com.iailab.module.data.common.ApiDataQueryDTO; import com.iailab.module.data.common.ApiDataValueDTO; +import com.iailab.module.model.common.utils.ASCIIUtil; import com.iailab.module.model.mcs.pre.service.MmItemOutputService; import com.iailab.module.model.mcs.pre.service.MmItemResultJsonService; import com.iailab.module.model.mcs.pre.service.MmItemResultService; @@ -76,47 +77,84 @@ Map<String, ApiPointDTO> pointMap = sampleInfo.getPointMap(); Map<String, ApiPlanItemDTO> planMap = sampleInfo.getPlanMap(); Map<String, ApiIndItemDTO> indMap = sampleInfo.getIndMap(); + // 校验数据 + for (ColumnItemPort itemPort : sampleInfo.getColumnInfo()) { + for (ColumnItem columnItem : itemPort.getColumnItemList()) { + if (columnItem.getParamType().equals(ModelParamType.IND_ASCII.getCode())) { + if (columnItem.getModelParamOrder() != 1 || itemPort.getColumnItemList().size() != 1) { + throw new RuntimeException("模型输入数据异常:IND_ASCII类型输入独占一个端口;ParamPortOrder:" + columnItem.getModelParamPortOrder() + ",ParamOrder:" + columnItem.getModelParamOrder()); + } + } + } + } + //对每个爪分别进行计算 for (ColumnItemPort entry : sampleInfo.getColumnInfo()) { - //先依据爪内数据项的modelParamOrder进行排序——重写comparator匿名函数 - Collections.sort(entry.getColumnItemList(), new Comparator<ColumnItem>() { - @Override - public int compare(ColumnItem o1, ColumnItem o2) { - return o1.getModelParamOrder() - o2.getModelParamOrder(); + double[][] matrix = new double[0][0]; + // 特殊处理IND_ASCII类型 + if (entry.getColumnItemList().get(0).getParamType().equals(ModelParamType.IND_ASCII.getCode())) { + // 获取指标数据 + ColumnItem columnItem = entry.getColumnItemList().get(0); + ApiIndItemQueryDTO queryIndItemDTO = new ApiIndItemQueryDTO(); + ApiIndItemDTO intItem = indMap.get(columnItem.getParamId()); + queryIndItemDTO.setItemNo(intItem.getItemNo()); + queryIndItemDTO.setStart(columnItem.getStartTime()); + queryIndItemDTO.setEnd(columnItem.getEndTime()); + List<ApiIndItemValueDTO> indItemValueList = indItemApi.queryIndItemHistoryValue(queryIndItemDTO); + if (!CollectionUtils.isEmpty(indItemValueList)) { + matrix = new double[entry.getDataLength()][0]; + if (indItemValueList.size() > entry.getDataLength()) { + indItemValueList = indItemValueList.subList(0,entry.getDataLength()); + } + for (int i = 0; i < indItemValueList.size(); i++) { + String stringValue = indItemValueList.get(i).getDataValue().toString(); + double[] asciiArray = ASCIIUtil.stringToAsciiArray(stringValue); + matrix[i] = asciiArray; + } } - }); + }else { + //先依据爪内数据项的modelParamOrder进行排序——重写comparator匿名函数 + Collections.sort(entry.getColumnItemList(), new Comparator<ColumnItem>() { + @Override + public int compare(ColumnItem o1, ColumnItem o2) { + return o1.getModelParamOrder() - o2.getModelParamOrder(); + } + }); - //默认都是double类型的数据,且按列向量进行拼接,默认初始值为0.0 - double[][] matrix = new double[entry.getDataLength()][entry.getColumnItemList().size()]; - for (int i = 0; i < entry.getColumnItemList().size(); i++) { - for (int j = 0; j < entry.getDataLength(); j++) { - matrix[j][i] = -2.0; + //默认都是double类型的数据,且按列向量进行拼接,默认初始值为0.0 + matrix = new double[entry.getDataLength()][entry.getColumnItemList().size()]; + for (int i = 0; i < entry.getColumnItemList().size(); i++) { + for (int j = 0; j < entry.getDataLength(); j++) { + matrix[j][i] = -2.0; + } } - } - //对每一项依次进行数据查询,然后将查询出的值赋给matrix对应的位置 - for (int i = 0; i < entry.getColumnItemList().size(); i++) { - try { - List<DataValueVO> dataEntityList = getData(entry.getColumnItemList().get(i), pointMap, planMap,indMap); - //补全数据 - ColumnItem columnItem = entry.getColumnItemList().get(i); - dataEntityList = super.completionData(matrix.length, dataEntityList, columnItem.startTime, columnItem.endTime, columnItem.getParamType(),columnItem.getGranularity()); + //对每一项依次进行数据查询,然后将查询出的值赋给matrix对应的位置 + for (int i = 0; i < entry.getColumnItemList().size(); i++) { + try { + List<DataValueVO> dataEntityList = getData(entry.getColumnItemList().get(i), pointMap, planMap,indMap); + //补全数据 + ColumnItem columnItem = entry.getColumnItemList().get(i); + dataEntityList = super.completionData(matrix.length, dataEntityList, columnItem.startTime, columnItem.endTime, columnItem.getParamType(),columnItem.getGranularity()); - /** 如果数据取不满,把缺失的数据点放在后面 */ - if (dataEntityList != null && dataEntityList.size() != 0) { - logger.info("设置matrix, i = " + i + ", size = " + dataEntityList.size()); - for (int k = 0; k < dataEntityList.size(); k++) { - Double dataValue = dataEntityList.get(k).getDataValue(); - if (null != dataValue) { - matrix[k][i] = dataValue; + /** 如果数据取不满,把缺失的数据点放在后面 */ + if (dataEntityList != null && dataEntityList.size() != 0) { + logger.info("设置matrix, i = " + i + ", size = " + dataEntityList.size()); + for (int k = 0; k < dataEntityList.size(); k++) { + Double dataValue = dataEntityList.get(k).getDataValue(); + if (null != dataValue) { + matrix[k][i] = dataValue; + } } } + } catch (Exception e) { + e.printStackTrace(); + throw e; } - } catch (Exception e) { - e.printStackTrace(); - throw e; } } + + SampleData sampleData = new SampleData(); sampleData.setMatrix(matrix); sampleDataList.add(sampleData); @@ -196,6 +234,7 @@ vo.setDataValue(Double.valueOf(t.getDataValue().toString())); return vo; }).collect(Collectors.toList()); + break; default: break; } diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/PredictSampleInfoConstructor.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/PredictSampleInfoConstructor.java index 6d93c9f..a5fd90d 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/PredictSampleInfoConstructor.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/PredictSampleInfoConstructor.java @@ -90,7 +90,7 @@ List<ApiPlanItemDTO> plans = planItemApi.getInfoByIds(planIds); Map<String, ApiPlanItemDTO> planMap = plans.stream().collect(Collectors.toMap(ApiPlanItemDTO::getId, Function.identity(), (e1, e2) -> e1)); // 统一获取指标数据的信息 - Set<String> indIds = modelInputParamEntityList.stream().filter(e -> ModelParamType.getEumByCode(e.getModelparamtype()).equals(ModelParamType.IND)).map(MmModelParamEntity::getModelparamid).collect(Collectors.toSet()); + Set<String> indIds = modelInputParamEntityList.stream().filter(e -> ModelParamType.getEumByCode(e.getModelparamtype()).equals(ModelParamType.IND) || ModelParamType.getEumByCode(e.getModelparamtype()).equals(ModelParamType.IND_ASCII)).map(MmModelParamEntity::getModelparamid).collect(Collectors.toSet()); List<ApiIndItemDTO> inds = indItemApi.getInfoByIds(indIds); Map<String, ApiIndItemDTO> indMap = inds.stream().collect(Collectors.toMap(ApiIndItemDTO::getId, Function.identity(), (e1, e2) -> e1)); diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/SampleDataConstructor.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/SampleDataConstructor.java index 6915322..c01e92a 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/SampleDataConstructor.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/SampleDataConstructor.java @@ -90,6 +90,7 @@ mins = ((end - start) / oneMin); break; case IND: + case IND_ASCII: // 测点值 oneMin = 1000L * granularity; // 设置时间偏移量 diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/SampleInfoConstructor.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/SampleInfoConstructor.java index 48fa7e8..ce08ee6 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/SampleInfoConstructor.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/SampleInfoConstructor.java @@ -86,6 +86,7 @@ dateTime = calculateTime(originalTime, true, columnItem.getDataLength(), columnItem.getGranularity()); break; case IND: + case IND_ASCII: dateTime = calculateTime(originalTime, true, columnItem.getDataLength()-1, columnItem.getGranularity()); break; case NORMALITEM: @@ -113,6 +114,7 @@ switch (ModelParamType.getEumByCode(columnItem.getParamType())) { case DATAPOINT: case IND: + case IND_ASCII: case PLAN: dateTime = calendar.getTime(); break; @@ -146,6 +148,7 @@ granularity = mmPredictItemService.getItemByOutPutId(columnItem.getParamId()).getGranularity(); break; case IND: + case IND_ASCII: ApiIndItemDTO indItemDTO = indMap.get(columnItem.getParamId()); granularity = TimeGranularitySecEnum.getEumByCode(indItemDTO.getTimeGranularity()).getValue();; break; diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/ScheduleSampleInfoConstructor.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/ScheduleSampleInfoConstructor.java index 36683ef..e8aa4a0 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/ScheduleSampleInfoConstructor.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/sample/ScheduleSampleInfoConstructor.java @@ -65,7 +65,7 @@ List<ApiPlanItemDTO> plans = planItemApi.getInfoByIds(planIds); Map<String, ApiPlanItemDTO> planMap = plans.stream().collect(Collectors.toMap(ApiPlanItemDTO::getId, Function.identity(), (e1, e2) -> e1)); // 统一获取指标数据的信息 - Set<String> indIds = modelInputParamEntityList.stream().filter(e -> ModelParamType.getEumByCode(e.getModelparamtype()).equals(ModelParamType.IND)).map(StScheduleModelParamEntity::getModelparamid).collect(Collectors.toSet()); + Set<String> indIds = modelInputParamEntityList.stream().filter(e -> ModelParamType.getEumByCode(e.getModelparamtype()).equals(ModelParamType.IND) || ModelParamType.getEumByCode(e.getModelparamtype()).equals(ModelParamType.IND_ASCII)).map(StScheduleModelParamEntity::getModelparamid).collect(Collectors.toSet()); List<ApiIndItemDTO> inds = indItemApi.getInfoByIds(indIds); Map<String, ApiIndItemDTO> indMap = inds.stream().collect(Collectors.toMap(ApiIndItemDTO::getId, Function.identity(), (e1, e2) -> e1)); -- Gitblit v1.9.3