dengzedong
2025-02-27 6205c22a959fbb3b69735f34af8d3316c4082a5d
提交 | 用户 | 时间
7fd198 1 package com.iailab.module.model.mdk.predict;
2
b3674c 3 import com.alibaba.fastjson.JSONArray;
1178da 4 import com.iailab.module.model.common.exception.ModelResultErrorException;
07890e 5 import com.iailab.module.model.mcs.pre.entity.MmItemOutputEntity;
4eb113 6 import com.iailab.module.model.mcs.pre.enums.ItemRunStatusEnum;
7fd198 7 import com.iailab.module.model.mcs.pre.enums.ItemStatus;
e691b9 8 import com.iailab.module.model.mcs.pre.enums.PredGranularityEnum;
4eb113 9 import com.iailab.module.model.mcs.pre.service.MmItemStatusService;
7fd198 10 import com.iailab.module.model.mdk.factory.PredictItemFactory;
11 import com.iailab.module.model.mdk.vo.ItemVO;
12 import com.iailab.module.model.mdk.vo.PredictResultVO;
b3674c 13 import com.iailab.module.model.mdk.vo.StAdjustDeviationDTO;
7fd198 14 import lombok.extern.slf4j.Slf4j;
15 import org.springframework.beans.factory.annotation.Autowired;
16 import org.springframework.stereotype.Component;
07890e 17 import org.springframework.util.CollectionUtils;
7fd198 18
19 import java.text.MessageFormat;
e691b9 20 import java.util.*;
7fd198 21
22 /**
23  * @author PanZhibao
24  * @Description
25  * @createTime 2024年08月30日
26  */
27 @Slf4j
28 @Component
29 public class PredictModuleHandler {
30
31
32     @Autowired
33     private PredictItemFactory predictItemFactory;
34
35     @Autowired
36     private PredictResultHandler predictResultHandler;
37
4eb113 38     @Autowired
39     private MmItemStatusService mmItemStatusService;
40
7fd198 41
4f1717 42     /**
43      * 预测处理
44      *
45      * @param predictItemList
46      * @param predictTime
47      * @param intervalTime
48      * @return
49      */
b3674c 50     public void predict(List<ItemVO> predictItemList, Date predictTime, int intervalTime, Map<String, PredictResultVO> predictResultMap) {
07890e 51         Map<String, double[]> predictValueMap = null;
D 52         if (!CollectionUtils.isEmpty(predictResultMap)) {
53             // 将predictResultMap处理成Map<outPutId, double[]>
54             predictValueMap = new HashMap<>();
55             for (Map.Entry<String, PredictResultVO> entry : predictResultMap.entrySet()) {
56                 for (Map.Entry<MmItemOutputEntity, double[]> mmItemOutputEntityEntry : entry.getValue().getPredictMatrixs().entrySet()) {
b3674c 57                     predictValueMap.put(mmItemOutputEntityEntry.getKey().getId(), mmItemOutputEntityEntry.getValue());
07890e 58                 }
D 59             }
60         }
7fd198 61         for (ItemVO predictItem : predictItemList) {
e691b9 62             // 根据item粒度处理预测时间
D 63             Calendar calendar = Calendar.getInstance();
64             calendar.setTime(predictTime);
65             calendar.set(Calendar.MILLISECOND, 0);
66             calendar.set(Calendar.SECOND, 0);
67             if (PredGranularityEnum.H1.getCode().equals(predictItem.getGranularity())) {
b3674c 68                 calendar.set(Calendar.MINUTE, 0);
69             } else if (PredGranularityEnum.D1.getCode().equals(predictItem.getGranularity())) {
70                 calendar.set(Calendar.MINUTE, 0);
71                 calendar.set(Calendar.HOUR_OF_DAY, 0);
e691b9 72             }
fde993 73             PredictResultVO predictResult;
1a2b62 74             if (!predictItem.getStatus().equals(ItemStatus.STATUS1.getCode())) {
7fd198 75                 continue;
76             }
4eb113 77             Long totalDur = 0L;
7f0bcd 78             ItemRunStatusEnum itemRunStatusEnum = ItemRunStatusEnum.PROCESSING;
7fd198 79             try {
e691b9 80                 mmItemStatusService.recordStatus(predictItem.getId(), itemRunStatusEnum, totalDur, calendar.getTime());
cf2287 81                 PredictItemHandler predictItemHandler = predictItemFactory.create(predictItem.getId());
a4fdfb 82                 long start = System.currentTimeMillis();
7fd198 83                 try {
4f1717 84                     // 预测项开始预测
e691b9 85                     predictResult = predictItemHandler.predict(calendar.getTime(), predictItem, predictValueMap);
1178da 86                 } catch (ModelResultErrorException e) {
D 87                     itemRunStatusEnum = ItemRunStatusEnum.MODELRESULTERROR;
88                     continue;
7fd198 89                 } catch (Exception e) {
1178da 90                     itemRunStatusEnum = ItemRunStatusEnum.FAIL;
ead005 91                     continue;
7fd198 92                 }
a4fdfb 93                 long end = System.currentTimeMillis();
94                 Long drtPre = end - start;
95                 log.info(MessageFormat.format("预测项:{0},预测时间:{1}ms", predictItem.getItemName(), drtPre));
4eb113 96                 totalDur = totalDur + drtPre;
4f1717 97                 predictResult.setGranularity(predictItem.getGranularity());
7fd198 98                 predictResult.setT(intervalTime);
99                 predictResult.setSaveIndex(predictItem.getSaveIndex());
100                 predictResult.setLt(1);
1178da 101                 predictResultMap.put(predictItem.getItemNo(), predictResult);
4f1717 102
103                 // 保存预测结果
1178da 104                 try {
D 105                     predictResultHandler.savePredictResult(predictResult);
106                 } catch (Exception e) {
107                     itemRunStatusEnum = ItemRunStatusEnum.MODELRESULTSAVEERROR;
108                     throw new RuntimeException("模型结果保存异常,result:" + predictResult);
109                 }
110                 itemRunStatusEnum = ItemRunStatusEnum.SUCCESS;
7fd198 111             } catch (Exception e) {
112                 e.printStackTrace();
113                 log.error(MessageFormat.format("预测项编号:{0},预测项名称:{1},预测失败:{2} 预测时刻:{3}",
114                         predictItem.getId(), predictItem.getItemName(), e.getMessage(), predictTime));
7f0bcd 115             } finally {
e691b9 116                 mmItemStatusService.recordStatus(predictItem.getId(), itemRunStatusEnum, totalDur, calendar.getTime());
7fd198 117             }
118         }
119     }
b3674c 120
121     public void predictAdjust(ItemVO predictItem, Date predictTime, List<StAdjustDeviationDTO> deviationList, String scheduleModelId) {
122         Calendar calendar = Calendar.getInstance();
123         calendar.setTime(predictTime);
124         calendar.set(Calendar.MILLISECOND, 0);
125         calendar.set(Calendar.SECOND, 0);
126         if (PredGranularityEnum.H1.getCode().equals(predictItem.getGranularity())) {
127             calendar.set(Calendar.MINUTE, 0);
128         } else if (PredGranularityEnum.D1.getCode().equals(predictItem.getGranularity())) {
129             calendar.set(Calendar.MINUTE, 0);
130             calendar.set(Calendar.HOUR_OF_DAY, 0);
131         }
132
133         try {
134             PredictItemHandler predictItemHandler = predictItemFactory.create(predictItem.getId());
135             PredictResultVO predictResult = predictItemHandler.predictAdjust(calendar.getTime(), predictItem, deviationList);
136
137             // 保存预测结果
138             predictResultHandler.savePredictAdjustResult(predictResult, JSONArray.toJSONString(deviationList), scheduleModelId);
139         } catch (Exception e) {
140             e.printStackTrace();
141             log.error(MessageFormat.format("预测项编号:{0},预测项名称:{1},预测失败:{2} 预测时刻:{3}",
142                     predictItem.getId(), predictItem.getItemName(), e.getMessage(), predictTime));
143         }
144     }
7fd198 145 }