dengzedong
2025-02-27 6205c22a959fbb3b69735f34af8d3316c4082a5d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
package com.iailab.module.model.mdk.sample;
 
import cn.hutool.core.date.DateUtil;
import com.iailab.module.data.api.ind.IndItemApi;
import com.iailab.module.data.api.ind.dto.ApiIndItemDTO;
import com.iailab.module.data.api.ind.dto.ApiIndItemQueryDTO;
import com.iailab.module.data.api.ind.dto.ApiIndItemValueDTO;
import com.iailab.module.data.api.plan.PlanItemApi;
import com.iailab.module.data.api.plan.dto.ApiPlanItemDTO;
import com.iailab.module.data.api.point.DataPointApi;
import com.iailab.module.data.api.point.dto.ApiPointDTO;
import com.iailab.module.data.api.point.dto.ApiPointValueDTO;
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;
import com.iailab.module.model.mcs.pre.service.MmItemTypeService;
import com.iailab.module.model.mdk.common.enums.ModelParamType;
import com.iailab.module.model.mdk.sample.dto.ColumnItem;
import com.iailab.module.model.mdk.sample.dto.ColumnItemPort;
import com.iailab.module.model.mdk.sample.dto.SampleData;
import com.iailab.module.model.mdk.sample.dto.SampleInfo;
import com.iailab.module.model.mdk.vo.DataValueVO;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
 
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
 
/**
 * 预测样本数据构造
 */
@Slf4j
@Component
public class PredictSampleDataConstructor extends SampleDataConstructor {
 
    private Logger logger = LoggerFactory.getLogger(getClass());
 
    @Autowired
    private DataPointApi dataPointApi;
 
    @Autowired
    private PlanItemApi planItemApi;
 
    @Autowired
    private IndItemApi indItemApi;
 
    @Autowired
    private MmItemResultService mmItemResultService;
 
    @Autowired
    private MmItemResultJsonService mmItemResultJsonService;
 
    @Autowired
    private MmItemTypeService mmItemTypeService;
 
    @Autowired
    private MmItemOutputService mmItemOutputService;
 
    /**
     * alter by zfc 2020.11.24 修改数据样本构造方案:sampleInfo中数据已按爪子进行分类,但爪内数据为无序的,
     * 对爪内数据样本拼接:先基于modelParamOrder对项进行排序(重写comparator匿名函数),再逐项拼接
     *
     * @param sampleInfo
     * @return
     */
    @Override
    public List<SampleData> prepareSampleData(SampleInfo sampleInfo) throws Exception {
        List<SampleData> sampleDataList = new ArrayList<>();
        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());
                    }
                }
            }
        }
 
        int portIdx = 0;
        //对每个爪分别进行计算
        for (ColumnItemPort entry : sampleInfo.getColumnInfo()) {
            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
                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);
 
                        double adjustVal = SampleInfo.getAdjustValueFromDeviation(portIdx, i, sampleInfo.getDeviation());
                        if (adjustVal != 0) {
                            logger.info("设置调整值adjustVal:" + adjustVal);
                            for (int dataKey = 1; dataKey < dataEntityList.size(); dataKey++) {
                                DataValueVO item = dataEntityList.get(dataKey);
                                item.setDataValue(item.getDataValue() + adjustVal);
                            }
                        }
 
                        //补全数据
                        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;
                                }
                            }
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        throw e;
                    }
                }
 
                portIdx++;
            }
            SampleData sampleData = new SampleData();
            sampleData.setMatrix(matrix);
            sampleDataList.add(sampleData);
        }
        return sampleDataList;
    }
 
    /**
     * getData
     *
     * @param columnItem
     * @param pointMap
     * @param planMap
     * @param indMap
     * @return
     * @throws Exception
     */
    private List<DataValueVO> getData(ColumnItem columnItem, Map<String, ApiPointDTO> pointMap, Map<String, ApiPlanItemDTO> planMap, Map<String, ApiIndItemDTO> indMap) throws Exception {
        List<DataValueVO> dataList = new ArrayList<>();
        String paramType = columnItem.getParamType();
        switch (ModelParamType.getEumByCode(paramType)) {
            case DATAPOINT:
                ApiPointValueQueryDTO queryDto = new ApiPointValueQueryDTO();
                queryDto.setPointNo(pointMap.get(columnItem.getParamId()).getPointNo());
                queryDto.setStart(columnItem.getStartTime());
                queryDto.setEnd(columnItem.getEndTime());
                List<ApiPointValueDTO> pointValueList = dataPointApi.queryPointHistoryValue(queryDto);
                if (CollectionUtils.isEmpty(pointValueList)) {
                    break;
                }
                dataList = pointValueList.stream().map(t -> {
                    DataValueVO vo = new DataValueVO();
                    vo.setDataTime(t.getT());
                    vo.setDataValue(t.getV());
                    return vo;
                }).collect(Collectors.toList());
                break;
            case NORMALITEM:
            case MERGEITEM:
                List<DataValueVO> predictValue = mmItemResultService.getPredictValue(columnItem.getParamId(), columnItem.getStartTime(), columnItem.getEndTime());
 
                if (CollectionUtils.isEmpty(predictValue)) {
                    break;
                }
                dataList = predictValue;
                break;
            case PLAN:
                ApiDataQueryDTO queryPlanItemDto = new ApiDataQueryDTO();
                queryPlanItemDto.setItemNo(planMap.get(columnItem.getParamId()).getItemNo());
                queryPlanItemDto.setStart(columnItem.getStartTime());
                queryPlanItemDto.setEnd(columnItem.getEndTime());
                List<ApiDataValueDTO> planValueList = planItemApi.queryPlanItemHistoryValue(queryPlanItemDto);
                if (CollectionUtils.isEmpty(planValueList)) {
                    break;
                }
                dataList = planValueList.stream().map(t -> {
                    DataValueVO vo = new DataValueVO();
                    vo.setDataTime(t.getDataTime());
                    vo.setDataValue(t.getDataValue());
                    return vo;
                }).collect(Collectors.toList());
                break;
            case IND:
                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)) {
                    break;
                }
 
                dataList = indItemValueList.stream().map(t -> {
                    DataValueVO vo = new DataValueVO();
                    vo.setDataTime(DateUtil.parse(t.getDataTime()));
                    vo.setDataValue(Double.valueOf(t.getDataValue().toString()));
                    return vo;
                }).collect(Collectors.toList());
                break;
            default:
                break;
        }
        // 避免生产环境日志过多,分级打印
        log.debug("数据获取,columnItem:" + columnItem + ",dataList:" + dataList);
        log.info("数据获取,columnItem:" + columnItem + ",dataListLength:" + dataList.size());
        return dataList;
    }
}