沙钢智慧能源系统后端代码
潘志宝
2025-03-19 9028d0694549df46adf4cca71de823b5b35fc4c8
shasteel-biz/src/main/java/com/iailab/module/shasteel/mq/consumer/ModelAlarmConsumer.java
@@ -1,5 +1,6 @@
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;
@@ -7,6 +8,7 @@
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;
@@ -44,13 +46,16 @@
    // 最早调度时间
    private static Date earliestScheduleTime = null;
    private static Date lastScheduleTime = null;
    /**
     * 监听报警信息,执行调度
     * 监听报警信息,执行煤气调度
     *
     * @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());
@@ -64,29 +69,41 @@
            log.info("过滤旧消息");
            return;
        }
        // 判断predictTime 是否大于outTime,否则不执行调度
        if (earliestScheduleTime != null && predictTime.compareTo(earliestScheduleTime) < 0) {
        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();
        List<AlarmMessageRespDTO> alarmList = JSONObject.parseArray(messageJson.get("alarmList").toString(),AlarmMessageRespDTO.class);
        // 取出最小outTime
        Date minOutTime = alarmList.stream().filter(e -> e.getOutTime() != null).map(AlarmMessageRespDTO::getOutTime).min(Date::compareTo).get();
        earliestScheduleTime = minOutTime;
        // 查找需要执行的调度方案
        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();
            if (lastScheduleTime != null && stScheduleSchemeDTO.getAdjustRate() != null && stScheduleSchemeDTO.getAdjustRate() > 0 &&
                    (predictTime.getTime() - lastScheduleTime.getTime() > 1000 * 60 * stScheduleSchemeDTO.getAdjustRate().longValue()) ) {
                log.info("调整速率有效期内,跳过执行");
                continue;
            }
            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;
@@ -102,6 +119,13 @@
            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);
@@ -111,6 +135,19 @@
                    saveScheduleSuggest("转炉5W+8W煤气柜", result.get("adviceLDG13W"), "LDG1", predictTime);
                    saveScheduleSuggest("宏发12W煤气柜", result.get("adviceLDG12W"), "LDG2", predictTime);
                    saveScheduleSuggest("转炉特钢煤气柜", result.get("adviceLDG12WT"), "LDGt", predictTime);
                    // 模拟调整
                    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")
@@ -197,6 +234,8 @@
                    break;
            }
        }
        lastScheduleTime = predictTime;
    }
    private void saveScheduleSuggest(String title, Object content, String scheduleObj, Date scheduleTime) {