沙钢智慧能源系统后端代码
dongyukun
5 天以前 a3bb1815c3eb6b0f0cfe9d9d2ba5ee48279e26ed
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
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
package com.iailab.module.shasteel.mq.consumer;
 
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.iailab.framework.common.util.date.DateUtils;
import com.iailab.module.model.api.mcs.McsApi;
import com.iailab.module.model.api.mcs.dto.AlarmMessageRespDTO;
import com.iailab.module.model.api.mcs.dto.ScheduleSuggestRespDTO;
import com.iailab.module.model.api.mcs.dto.StScheduleSchemeDTO;
import com.iailab.module.model.api.mdk.MdkApi;
import com.iailab.module.model.api.mdk.dto.MdkPredictSimAdjustReqDTO;
import com.iailab.module.model.api.mdk.dto.MdkScheduleReqDTO;
import com.iailab.module.model.api.mdk.dto.MdkScheduleRespDTO;
import com.iailab.module.model.enums.ScheduleTriggerMethodEnum;
import com.iailab.module.shasteel.mq.common.constant.CommonConstant;
import com.iailab.module.shasteel.mq.config.QueueModelAlarmConfig;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
 
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
 
/**
 * 监听报警信息
 *
 * @author PanZhibao
 * @Description
 * @createTime 2024年12月11日
 */
@Slf4j
@Component
public class ModelAlarmConsumer {
 
    @Resource
    private McsApi mcsApi;
 
    @Resource
    private MdkApi mdkApi;
 
    private static String lastRunGasSchedule = "";
 
    /**
     * 煤气调度调整方向
     * 1:调整值为正数;-1:调整值为负数
     */
    private static Map<String, Integer> gasAdjustMode = new HashMap<>();
 
    /**
     * 煤气调度建议时间
     */
    private static Map<String, Date> gasLastSugTime = new HashMap<>();
 
    /**
     * 监听报警信息,执行煤气调度
     *
     * @param message
     */
    @RabbitListener(queues = QueueModelAlarmConfig.QUEUE_NAME)
    public void listen(Message message) {
        log.info("监听报警信息,执行煤气调度");
        String routingKey = message.getMessageProperties().getReceivedRoutingKey();
        log.info("routingKey:" + routingKey);
        String messageBody = new String(message.getBody());
        log.info("messageBody:" + messageBody);
        Map<String, Object> messageJson = JSONObject.parseObject(messageBody);
        if (CollectionUtils.isEmpty(messageJson)) {
            return;
        }
        Date predictTime = DateUtils.parse(messageJson.get("predictTime").toString(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
        if (new Date().getTime() - predictTime.getTime() > 1000 * 60 * 10) {
            log.info("过滤旧消息");
            return;
        }
        if (!ModelPredictFinishConsumer.finishModuleMap.containsKey(predictTime.getTime())) {
            log.info("finishModuleMap not containsKey:" + predictTime.getTime());
            return;
        }
        List<String> finishModuleList = ModelPredictFinishConsumer.finishModuleMap.get(predictTime.getTime());
        if (CollectionUtils.isEmpty(finishModuleList)) {
            log.info("finishModuleList is empty");
            return;
        }
        if (!finishModuleList.contains(CommonConstant.NET_BFG) || !finishModuleList.contains(CommonConstant.NET_COG) ||
                !finishModuleList.contains(CommonConstant.NET_LDG)) {
            log.info("finishModuleList:" + JSONArray.toJSONString(finishModuleList));
            log.info("等待全部预测完成");
            return;
        }
        log.info("已全部预测完成,清空finishModuleMap");
        ModelPredictFinishConsumer.finishModuleMap.clear();
 
        log.info("查找需要执行的调度方案");
        List<StScheduleSchemeDTO> scheduleSchemeList = mcsApi.listScheduleScheme(ScheduleTriggerMethodEnum.EVENT.getCode(), routingKey);
        if (CollectionUtils.isEmpty(scheduleSchemeList)) {
            log.info("routingKey:" + routingKey + ",调度方案为空。");
            return;
        }
        for (StScheduleSchemeDTO stScheduleSchemeDTO : scheduleSchemeList) {
            String runKey = "GasSchedule_" + stScheduleSchemeDTO.getCode() + "_" + predictTime.getTime();
            log.info("runKey:" + runKey);
            log.info("lastRunGasSchedule:" + lastRunGasSchedule);
            if (lastRunGasSchedule.equals(runKey)) {
                log.info("lastRunGasSchedule:" + lastRunGasSchedule + "已执行完成");
                continue;
            }
            lastRunGasSchedule = runKey;
            MdkScheduleReqDTO mdkScheduleReqDTO = new MdkScheduleReqDTO();
            mdkScheduleReqDTO.setScheduleCode(stScheduleSchemeDTO.getCode());
            mdkScheduleReqDTO.setScheduleTime(predictTime);
            //执行调度方案
            MdkScheduleRespDTO mdkScheduleRespDTO = mdkApi.doSchedule(mdkScheduleReqDTO);
            if (mdkScheduleRespDTO == null) {
                return;
            }
 
            Map<String, Object> result = mdkScheduleRespDTO.getResult();
            switch (mdkScheduleRespDTO.getScheduleCode()) {
                case CommonConstant.GAS_MODEL_CODE:
 
                    if (CollectionUtils.isEmpty(result)) {
                        log.info("煤气调度结果为空," + result);
                        break;
                    }
 
                    log.info("煤气调度");
                    // 结果写入测点
                    mdkApi.scheduleModelOut(mdkScheduleRespDTO);
 
                    // 保存调度建议
                    saveScheduleSuggest("高炉煤气", result.get("adviceBFG"), "BFG", predictTime, result.get("adjustValueBFG"), stScheduleSchemeDTO.getAdjustRate());
                    saveScheduleSuggest("焦炉煤气", result.get("adviceCOG"), "COG", predictTime, result.get("adjustValueCOG"), stScheduleSchemeDTO.getAdjustRate());
                    saveScheduleSuggest("转炉5W+8W煤气柜", result.get("adviceLDG13W"), "LDG1", predictTime, result.get("adjustValueLDG13W"), stScheduleSchemeDTO.getAdjustRate());
                    saveScheduleSuggest("宏发12W煤气柜", result.get("adviceLDG12W"), "LDG2", predictTime, result.get("adjustValueLDG12W"), stScheduleSchemeDTO.getAdjustRate());
                    saveScheduleSuggest("转炉特钢煤气柜", result.get("adviceLDG12WT"), "LDGt", predictTime, result.get("adjustValueLDG12WT"), stScheduleSchemeDTO.getAdjustRate());
 
                    // 模拟调整
                    MdkPredictSimAdjustReqDTO simAdjustReqDTO = new MdkPredictSimAdjustReqDTO();
                    simAdjustReqDTO.setPredictTime(predictTime);
                    simAdjustReqDTO.setScheduleCode(CommonConstant.GAS_MODEL_CODE);
                    simAdjustReqDTO.setModelResult(result);
                    Boolean simAdjustFlag = mdkApi.predictSimAdjust(simAdjustReqDTO);
                    if (simAdjustFlag) {
                        log.info("模拟调整成功,ScheduleCode:" + CommonConstant.GAS_MODEL_CODE);
                    } else {
                        log.error("模拟调整失败,simAdjustReqDTO:" + simAdjustReqDTO);
                    }
 
                    break;
                case CommonConstant.OXYGEN_ONE_CODE:
                    if (!result.containsKey("faAdvice") || !result.containsKey("yingDiAdvice") || !result.containsKey("yingZhongAdvice")
                            || !result.containsKey("hongAdvice") || !result.containsKey("RunAdvice")) {
                        return;
                    }
                    for (String key : result.keySet()) {
                        if ("faAdvice".equals(key) && !"".equals(result.get("faAdvice").toString())) {
                            ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO();
                            suggestRespDTO.setId(UUID.randomUUID().toString());
                            suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj());
                            suggestRespDTO.setContent(result.get("faAdvice").toString());//法夜空建议送出量建议
                            suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId());
                            mcsApi.createScheduleSuggest(suggestRespDTO);
                        } else if ("yingDiAdvice".equals(key) && !"".equals(result.get("yingDiAdvice").toString())) {
                            ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO();
                            suggestRespDTO.setId(UUID.randomUUID().toString());
                            suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj());
                            suggestRespDTO.setContent(result.get("yingDiAdvice").toString());//盈德低压建议送出量建议
                            suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId());
                            mcsApi.createScheduleSuggest(suggestRespDTO);
                        } else if ("yingZhongAdvice".equals(key) && !"".equals(result.get("yingZhongAdvice").toString())) {
                            ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO();
                            suggestRespDTO.setId(UUID.randomUUID().toString());
                            suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj());
                            suggestRespDTO.setContent(result.get("yingZhongAdvice").toString());//盈德中压建议送出量建议
                            suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId());
                            mcsApi.createScheduleSuggest(suggestRespDTO);
                        } else if ("hongAdvice".equals(key) && !"".equals(result.get("hongAdvice").toString())) {
                            ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO();
                            suggestRespDTO.setId(UUID.randomUUID().toString());
                            suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj());
                            suggestRespDTO.setContent(result.get("hongAdvice").toString());//宏昌建议送出量建议
                            suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId());
                            mcsApi.createScheduleSuggest(suggestRespDTO);
                        } else if ("RunAdvice".equals(key) && !"".equals(result.get("RunAdvice").toString())) {
                            ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO();
                            suggestRespDTO.setId(UUID.randomUUID().toString());
                            suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj());
                            suggestRespDTO.setContent(result.get("RunAdvice").toString());//润忠建议送出量建议
                            suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId());
                            mcsApi.createScheduleSuggest(suggestRespDTO);
                        }
                    }
                    break;
                case CommonConstant.OXYGEN_TWO_CODE://氧气系统优化调度决策方案
                    if (!result.containsKey("yingdiAdvice") || !result.containsKey("faAdvice") || !result.containsKey("hongAdvice")
                            || !result.containsKey("RunAdvice")) {
                        return;
                    }
                    for (String key : result.keySet()) {
                        if ("yingdiAdvice".equals(key) && !"".equals(result.get("yingdiAdvice").toString())) {
                            ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO();
                            suggestRespDTO.setId(UUID.randomUUID().toString());
                            suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj());
                            suggestRespDTO.setContent(result.get("yingdiAdvice").toString());//盈德中压建议调整量建议
                            suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId());
                            mcsApi.createScheduleSuggest(suggestRespDTO);
                        } else if ("faAdvice".equals(key) && !"".equals(result.get("faAdvice").toString())) {
                            ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO();
                            suggestRespDTO.setId(UUID.randomUUID().toString());
                            suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj());
                            suggestRespDTO.setContent(result.get("faAdvice").toString());//法夜空建议调整量建议
                            suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId());
                            mcsApi.createScheduleSuggest(suggestRespDTO);
                        } else if ("hongAdvice".equals(key) && !"".equals(result.get("hongAdvice").toString())) {
                            ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO();
                            suggestRespDTO.setId(UUID.randomUUID().toString());
                            suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj());
                            suggestRespDTO.setContent(result.get("hongAdvice").toString());//宏昌建议调整量建议
                            suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId());
                            mcsApi.createScheduleSuggest(suggestRespDTO);
                        } else if ("RunAdvice".equals(key) && !"".equals(result.get("RunAdvice").toString())) {
                            ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO();
                            suggestRespDTO.setId(UUID.randomUUID().toString());
                            suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj());
                            suggestRespDTO.setContent(result.get("RunAdvice").toString());//润忠建议调整量建议
                            suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId());
                            mcsApi.createScheduleSuggest(suggestRespDTO);
                        }
                    }
                    break;
                default:
                    break;
            }
        }
    }
 
    /**
     * 建议保持逻辑
     * <p>
     * <p>
     * BFG建议:
     * 若触发第一条:
     * 当前BFG建议 = adviceBFG
     * 若后续BFG建议出现时间与当前BFG建议相差15分钟之内:
     * 所后续BFG建议方向与当前BFG建议方向相反:
     * 当前建议 = 后续BFG建议
     * 若不是:
     * 当前建议保持不变
     * 若不是则:
     * 当前建议 = 后续BFG建议
     * <p>
     * COG建议:
     * 若触发第一条:
     * 当前COG建议 = adviceCOG
     * 若后续COG建议出现时间与当前COG建议相差15分钟之内:
     * 所后续COG建议方向与当前COG建议方向相反:
     * 当前建议 = 后续COG建议
     * 若不是:
     * 当前建议保持不变
     * 若不是则:
     * 当前建议 = 后续COG建议
     * <p>
     * LDG13W建议:
     * 若触发第一条:
     * 当前LDG13W建议 = adviceLDG13W
     * 若后续LDG13W建议出现时间与当前LDG13W建议相差15分钟之内:
     * 所后续LDG13W建议方向与当前LDG13W建议方向相反:
     * 当前建议 = 后续LDG13W建议
     * 若不是:
     * 当前建议保持不变
     * 若不是则:
     * 当前建议 = 后续LDG13W建议
     * <p>
     * LDG12W建议:
     * 若触发第一条:
     * 当前LDG12W建议 = adviceLDG12W
     * 若后续LDG12W建议出现时间与当前LDG12W建议相差15分钟之内:
     * 所后续LDG12W建议方向与当前LDG12W建议方向相反:
     * 当前建议 = 后续LDG12W建议
     * 若不是:
     * 当前建议保持不变
     * 若不是则:
     * 当前建议 = 后续LDG12W建议
     * <p>
     * LDG12WT建议:
     * 若触发第一条:
     * 当前LDG12WT建议 = adviceLDG12WT
     * 若后续LDG12WT建议出现时间与当前LDG12WT建议相差15分钟之内:
     * 所后续LDG12WT建议方向与当前LDG12WT建议方向相反:
     * 当前建议 = 后续LDG12WT建议
     * 若不是:
     * 当前建议保持不变
     * 若不是则:
     * 当前建议 = 后续LDG12WT建议
     *
     * @param title
     * @param content
     * @param scheduleObj
     * @param scheduleTime
     */
    private void saveScheduleSuggest(String title, Object content, String scheduleObj, Date scheduleTime, Object adjustObj, int adjustRate) {
        if (content == null || StringUtils.isBlank(content.toString()) || "0".equals(content.toString())) {
            log.info(title + "content为空");
            return;
        }
        if (adjustObj == null || StringUtils.isBlank(adjustObj.toString()) || "0".equals(adjustObj.toString())) {
            log.info(title + "调整值为空,不产生建议");
            return;
        }
        BigDecimal adjustValue = new BigDecimal(adjustObj.toString());
        if (gasAdjustMode.containsKey(scheduleObj) && gasAdjustMode.get(scheduleObj).equals(adjustValue.compareTo(BigDecimal.ZERO)) &&
                gasLastSugTime.containsKey(scheduleObj) && (scheduleTime.getTime() - gasLastSugTime.get(scheduleObj).getTime() <= Integer.valueOf(adjustRate).longValue() * 60 * 1000)) {
            log.info("调整建议在有效期内");
            return;
        }
        gasAdjustMode.put(scheduleObj, adjustValue.compareTo(BigDecimal.ZERO));
        gasLastSugTime.put(scheduleObj, scheduleTime);
        ScheduleSuggestRespDTO suggest = new ScheduleSuggestRespDTO();
        suggest.setTitle(title);
        suggest.setContent(content.toString());
        suggest.setAdjustValue(adjustValue);
        suggest.setScheduleObj(scheduleObj);
        suggest.setScheduleTime(scheduleTime);
        suggest.setSort(0);
        mcsApi.createScheduleSuggest(suggest);
    }
}