沙钢智慧能源系统后端代码
潘志宝
8 天以前 dafd58d88b4b7c3993f0c0e82ad875aa1c47832e
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
package com.iailab.module.shasteel.job.task;
 
import com.iailab.module.model.api.mcs.McsApi;
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.MdkScheduleReqDTO;
import com.iailab.module.model.api.mdk.dto.MdkScheduleRespDTO;
import com.iailab.module.model.enums.CommonConstant;
import com.iailab.module.model.enums.ScheduleTriggerMethodEnum;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
 
import java.math.BigDecimal;
import java.util.*;
 
/**
 * 06
 * 氧气班平衡计划
 * 法夜空建议送出量    faAdvice
 * 盈德低压建议送出量    yingDiAdvice
 * 盈德中压建议送出量    yingZhongAdvice
 * 宏昌建议送出量    hongAdvice
 * 润忠建议送出量    RunAdvice
 * 调整值    adviceValues
 *
 * 05
 * 氧气系统优化调度决策
 * 盈德中压建议调整量    yingdiAdvice
 * 法夜空建议调整量    faAdvice
 * 宏昌建议调整量    hongAdvice
 * 润忠建议调整量    RunAdvice
 *
 * 01
 * 氮气预警模型
 * 预警信号    advice
 *
 * @author PanZhibao
 * @Description
 * @createTime 2025年01月07日
 */
@Component("runScheduleOnaOptTask")
public class RunScheduleOnaOptTask implements ITask {
    private Logger logger = LoggerFactory.getLogger(getClass());
 
    @Autowired
    private McsApi mcsApi;
 
    @Autowired
    private MdkApi mdkApi;
 
    private Map<String, StScheduleSchemeDTO> schemeMap = new HashMap<>();
 
    /**
     * 调度调整方向
     * 1:调整值为正数;-1:调整值为负数
     */
    private static Map<String, Integer> gasAdjustMode = new HashMap<>();
 
    /**
     * 调度建议时间
     */
    private static Map<String, Date> gasLastSugTime = new HashMap<>();
 
    private static final String CODE06 = "06";
 
    private static final String CODE05 = "05";
 
    private static final String CODE01 = "01";
 
    @Override
    public void run(String params) {
        logger.info("RunScheduleOnaOptTask,参数为:{}", params);
        try {
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.MILLISECOND, 0);
            calendar.set(Calendar.SECOND, 0);
            Date scheduleTime = calendar.getTime();
            if (StringUtils.isEmpty(params)) {
                logger.info("参数为空");
                return;
            }
 
            // 根据条件查找方案
            List<StScheduleSchemeDTO> schemeList = mcsApi.listScheduleScheme(ScheduleTriggerMethodEnum.JOB.getCode(), params);
            if (CollectionUtils.isEmpty(schemeList)) {
                logger.info("方案为空");
                return;
            }
            schemeMap.clear();
            Map<String, MdkScheduleRespDTO> resultMap = new HashMap<String, MdkScheduleRespDTO>();
            schemeList.forEach(scheme -> {
                schemeMap.put(scheme.getCode(), scheme);
                MdkScheduleReqDTO dto = new MdkScheduleReqDTO();
                dto.setScheduleTime(scheduleTime);
                dto.setScheduleCode(scheme.getCode());
                MdkScheduleRespDTO mdkScheduleRespDTO = mdkApi.doSchedule(dto);
                resultMap.put(scheme.getCode(), mdkScheduleRespDTO);
            });
            if (CollectionUtils.isEmpty(resultMap)) {
                logger.info("resultMap为空");
                return;
            }
            for (Map.Entry<String, MdkScheduleRespDTO> entry : resultMap.entrySet()) {
                if (!CommonConstant.MDK_STATUS_100.equals(entry.getValue().getStatusCode())) {
                    logger.info("调度结果异常,STATUS=" + entry.getValue().getStatusCode());
                    continue;
                }
 
                if (entry.getKey().equals(CODE06)) {
                    // 氧气班平衡计划,建议值写入测点
                    mdkApi.scheduleModelOut(entry.getValue());
                    logger.info("氧气班平衡计划下发参数: {}", entry.getValue());
                } else if (entry.getKey().equals(CODE05)) {
                    // 氧气系统优化调度决策
                    StScheduleSchemeDTO scheduleScheme = schemeMap.get(CODE05);
                    String scheduleObj = scheduleScheme.getScheduleObj();
                    /*String yingdiAdvice = entry.getValue().getResult().get("yingdiAdvice").toString();
                    String faAdvice = entry.getValue().getResult().get("faAdvice").toString();
                    String hongAdvice = entry.getValue().getResult().get("hongAdvice").toString();
                    String runAdvice = entry.getValue().getResult().get("runAdvice").toString();
                    if(!yingdiAdvice.equals("压力正常")){
                        saveScheduleSuggest("盈德中压调整建议", yingdiAdvice, scheduleObj, scheduleTime);
                    }
                    if(!faAdvice.equals("压力正常")){
                        saveScheduleSuggest("法夜空调整建议", faAdvice, scheduleObj, scheduleTime);
                    }
                    if(!hongAdvice.equals("压力正常")){
                        saveScheduleSuggest("宏昌调整建议", hongAdvice, scheduleObj, scheduleTime);
                    }
                    if(!runAdvice.equals("压力正常")){
                        saveScheduleSuggest("润忠调整建议", runAdvice, scheduleObj, scheduleTime);
                    }*/
 
                    double[][] adviceValues = (double[][])entry.getValue().getResult().get("adviceValues");
                    logger.info("adviceValues=" + Arrays.toString(adviceValues));
                    String advice = entry.getValue().getResult().get("advice").toString();
                    if(!advice.contains("压力正常")){
                        saveScheduleSuggest("各制氧机组建议", advice, scheduleObj, scheduleTime, new BigDecimal(adviceValues[0][0]), scheduleScheme.getAdjustRate());
                    }
 
                } else if (entry.getKey().equals(CODE01)) {
                    StScheduleSchemeDTO scheduleScheme = schemeMap.get(CODE05);
                    String scheduleObj = scheduleScheme.getScheduleObj();
                    String advice = entry.getValue().getResult().get("advice").toString();
                    if(!"压力正常".equals(advice)){
                        saveScheduleSuggest("氮气预警", advice, scheduleObj, scheduleTime);
                    }
                }
            }
            logger.info(params + "调度方案执行完成");
        } catch (Exception ex) {
            logger.error("RunScheduleOnaOptTask运行异常");
            ex.printStackTrace();
        }
        logger.info("RunScheduleOnaOptTask运行完成");
    }
 
    private void saveScheduleSuggest(String title, String content, String scheduleObj, Date scheduleTime) {
        if (StringUtils.isBlank(content)) {
            logger.info(title + "调整值为空,不产生建议");
            return;
        }
 
        ScheduleSuggestRespDTO suggest = new ScheduleSuggestRespDTO();
        suggest.setTitle(title);
        suggest.setContent(content);
        suggest.setScheduleObj(scheduleObj);
        suggest.setScheduleTime(scheduleTime);
        suggest.setSort(0);
        mcsApi.createScheduleSuggest(suggest);
    }
 
    private void saveScheduleSuggest(String title, String content, String scheduleObj, Date scheduleTime, BigDecimal adjustValue, int adjustRate) {
        if (StringUtils.isBlank(content)) {
            logger.info(title + "调整值为空,不产生建议");
            return;
        }
        if (adjustValue == null || adjustValue.doubleValue() == 0) {
            logger.info(title + "调整值为空,不产生建议");
            return;
        }
        if (gasAdjustMode.containsKey(title) && gasAdjustMode.get(title).equals(adjustValue.compareTo(BigDecimal.ZERO)) &&
                gasLastSugTime.containsKey(title) && (scheduleTime.getTime() - gasLastSugTime.get(title).getTime() <= Integer.valueOf(adjustRate).longValue() * 60 * 1000)) {
            logger.info("调整建议在有效期内");
            return;
        }
        gasAdjustMode.put(title,  adjustValue.compareTo(BigDecimal.ZERO));
        gasLastSugTime.put(title, scheduleTime);
 
        ScheduleSuggestRespDTO suggest = new ScheduleSuggestRespDTO();
        suggest.setTitle(title);
        suggest.setContent(content);
        suggest.setScheduleObj(scheduleObj);
        suggest.setScheduleTime(scheduleTime);
        suggest.setSort(0);
        mcsApi.createScheduleSuggest(suggest);
    }
}