houzhongjian
8 天以前 3058865fa4dfa634a92b4ebd826d8b1264dc90a3
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
package com.iailab.module.model.mdk.predict;
 
import com.alibaba.fastjson.JSONArray;
import com.iailab.module.model.common.exception.ModelResultErrorException;
import com.iailab.module.model.mcs.pre.entity.MmItemOutputEntity;
import com.iailab.module.model.mcs.pre.enums.ItemRunStatusEnum;
import com.iailab.module.model.mcs.pre.enums.ItemStatus;
import com.iailab.module.model.mcs.pre.enums.PredGranularityEnum;
import com.iailab.module.model.mcs.pre.service.MmItemStatusService;
import com.iailab.module.model.mdk.factory.PredictItemFactory;
import com.iailab.module.model.mdk.vo.ItemVO;
import com.iailab.module.model.mdk.vo.PredictResultVO;
import com.iailab.module.model.mdk.vo.StAdjustDeviationDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
 
import java.text.MessageFormat;
import java.util.*;
 
/**
 * @author PanZhibao
 * @Description
 * @createTime 2024年08月30日
 */
@Slf4j
@Component
public class PredictModuleHandler {
 
 
    @Autowired
    private PredictItemFactory predictItemFactory;
 
    @Autowired
    private PredictResultHandler predictResultHandler;
 
    @Autowired
    private MmItemStatusService mmItemStatusService;
 
 
    /**
     * 预测处理
     *
     * @param predictItemList
     * @param predictTime
     * @param intervalTime
     * @return
     */
    public void predict(List<ItemVO> predictItemList, Date predictTime, int intervalTime, Map<String, PredictResultVO> predictResultMap) {
        Map<String, double[]> predictValueMap = null;
        if (!CollectionUtils.isEmpty(predictResultMap)) {
            // 将predictResultMap处理成Map<outPutId, double[]>
            predictValueMap = new HashMap<>();
            for (Map.Entry<String, PredictResultVO> entry : predictResultMap.entrySet()) {
                for (Map.Entry<MmItemOutputEntity, double[]> mmItemOutputEntityEntry : entry.getValue().getPredictMatrixs().entrySet()) {
                    predictValueMap.put(mmItemOutputEntityEntry.getKey().getId(), mmItemOutputEntityEntry.getValue());
                }
            }
        }
        for (ItemVO predictItem : predictItemList) {
            // 根据item粒度处理预测时间
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(predictTime);
            calendar.set(Calendar.MILLISECOND, 0);
            calendar.set(Calendar.SECOND, 0);
            if (PredGranularityEnum.H1.getCode().equals(predictItem.getGranularity())) {
                calendar.set(Calendar.MINUTE, 0);
            } else if (PredGranularityEnum.D1.getCode().equals(predictItem.getGranularity())) {
                calendar.set(Calendar.MINUTE, 0);
                calendar.set(Calendar.HOUR_OF_DAY, 0);
            }
            PredictResultVO predictResult;
            if (!predictItem.getStatus().equals(ItemStatus.STATUS1.getCode())) {
                continue;
            }
            Long totalDur = 0L;
            ItemRunStatusEnum itemRunStatusEnum = ItemRunStatusEnum.PROCESSING;
            try {
                mmItemStatusService.recordStatus(predictItem.getId(), itemRunStatusEnum, totalDur, calendar.getTime());
                PredictItemHandler predictItemHandler = predictItemFactory.create(predictItem.getId());
                long start = System.currentTimeMillis();
                try {
                    // 预测项开始预测
                    predictResult = predictItemHandler.predict(calendar.getTime(), predictItem, predictValueMap);
                } catch (ModelResultErrorException e) {
                    itemRunStatusEnum = ItemRunStatusEnum.MODELRESULTERROR;
                    continue;
                } catch (Exception e) {
                    itemRunStatusEnum = ItemRunStatusEnum.FAIL;
                    continue;
                }
                long end = System.currentTimeMillis();
                Long drtPre = end - start;
                log.info(MessageFormat.format("预测项:{0},预测时间:{1}ms", predictItem.getItemName(), drtPre));
                totalDur = totalDur + drtPre;
                predictResult.setGranularity(predictItem.getGranularity());
                predictResult.setT(intervalTime);
                predictResult.setSaveIndex(predictItem.getSaveIndex());
                predictResult.setLt(1);
                predictResultMap.put(predictItem.getItemNo(), predictResult);
 
                // 保存预测结果
                try {
                    predictResultHandler.savePredictResult(predictResult);
                } catch (Exception e) {
                    e.printStackTrace();
                    itemRunStatusEnum = ItemRunStatusEnum.MODELRESULTSAVEERROR;
                    throw new RuntimeException("模型结果保存异常,result:" + predictResult);
                }
                itemRunStatusEnum = ItemRunStatusEnum.SUCCESS;
            } catch (Exception e) {
                e.printStackTrace();
                log.error(MessageFormat.format("预测项编号:{0},预测项名称:{1},预测失败:{2} 预测时刻:{3}",
                        predictItem.getId(), predictItem.getItemName(), e.getMessage(), predictTime));
            } finally {
                mmItemStatusService.recordStatus(predictItem.getId(), itemRunStatusEnum, totalDur, calendar.getTime());
            }
        }
    }
 
    public void predictAdjust(ItemVO predictItem, Date predictTime, List<StAdjustDeviationDTO> deviationList, String scheduleModelId, String configId) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(predictTime);
        calendar.set(Calendar.MILLISECOND, 0);
        calendar.set(Calendar.SECOND, 0);
        if (PredGranularityEnum.H1.getCode().equals(predictItem.getGranularity())) {
            calendar.set(Calendar.MINUTE, 0);
        } else if (PredGranularityEnum.D1.getCode().equals(predictItem.getGranularity())) {
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.HOUR_OF_DAY, 0);
        }
 
        try {
            PredictItemHandler predictItemHandler = predictItemFactory.create(predictItem.getId());
            PredictResultVO predictResult = predictItemHandler.predictAdjust(calendar.getTime(), predictItem, deviationList);
            predictResult.setGranularity(predictItem.getGranularity());
            predictResult.setSaveIndex(predictItem.getSaveIndex());
 
            // 保存预测结果
            predictResultHandler.savePredictAdjustResult(predictResult, JSONArray.toJSONString(deviationList), scheduleModelId,configId);
        } catch (Exception e) {
            e.printStackTrace();
            log.error(MessageFormat.format("预测项编号:{0},预测项名称:{1},预测失败:{2} 预测时刻:{3}",
                    predictItem.getId(), predictItem.getItemName(), e.getMessage(), predictTime));
        }
    }
}