houzhongjian
8 天以前 3058865fa4dfa634a92b4ebd826d8b1264dc90a3
提交 | 用户 | 时间
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) {
f93760 107                     e.printStackTrace();
1178da 108                     itemRunStatusEnum = ItemRunStatusEnum.MODELRESULTSAVEERROR;
D 109                     throw new RuntimeException("模型结果保存异常,result:" + predictResult);
110                 }
111                 itemRunStatusEnum = ItemRunStatusEnum.SUCCESS;
7fd198 112             } catch (Exception e) {
113                 e.printStackTrace();
114                 log.error(MessageFormat.format("预测项编号:{0},预测项名称:{1},预测失败:{2} 预测时刻:{3}",
115                         predictItem.getId(), predictItem.getItemName(), e.getMessage(), predictTime));
7f0bcd 116             } finally {
e691b9 117                 mmItemStatusService.recordStatus(predictItem.getId(), itemRunStatusEnum, totalDur, calendar.getTime());
7fd198 118             }
119         }
120     }
b3674c 121
67f59a 122     public void predictAdjust(ItemVO predictItem, Date predictTime, List<StAdjustDeviationDTO> deviationList, String scheduleModelId, String configId) {
b3674c 123         Calendar calendar = Calendar.getInstance();
124         calendar.setTime(predictTime);
125         calendar.set(Calendar.MILLISECOND, 0);
126         calendar.set(Calendar.SECOND, 0);
127         if (PredGranularityEnum.H1.getCode().equals(predictItem.getGranularity())) {
128             calendar.set(Calendar.MINUTE, 0);
129         } else if (PredGranularityEnum.D1.getCode().equals(predictItem.getGranularity())) {
130             calendar.set(Calendar.MINUTE, 0);
131             calendar.set(Calendar.HOUR_OF_DAY, 0);
132         }
133
134         try {
135             PredictItemHandler predictItemHandler = predictItemFactory.create(predictItem.getId());
136             PredictResultVO predictResult = predictItemHandler.predictAdjust(calendar.getTime(), predictItem, deviationList);
67f59a 137             predictResult.setGranularity(predictItem.getGranularity());
D 138             predictResult.setSaveIndex(predictItem.getSaveIndex());
b3674c 139
140             // 保存预测结果
67f59a 141             predictResultHandler.savePredictAdjustResult(predictResult, JSONArray.toJSONString(deviationList), scheduleModelId,configId);
b3674c 142         } catch (Exception e) {
143             e.printStackTrace();
144             log.error(MessageFormat.format("预测项编号:{0},预测项名称:{1},预测失败:{2} 预测时刻:{3}",
145                     predictItem.getId(), predictItem.getItemName(), e.getMessage(), predictTime));
146         }
147     }
7fd198 148 }