鞍钢鲅鱼圈能源管控系统后端代码
潘志宝
4 天以前 13ec40d641f489b0e30e198326737de2d6610ec8
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
package com.iailab.module.ansteel.api.controller.admin;
 
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.iailab.framework.common.exception.enums.GlobalErrorCodeConstants;
import com.iailab.framework.common.pojo.CommonResult;
import com.iailab.framework.common.util.date.DateUtils;
import com.iailab.module.ansteel.api.vo.PowerTransferDetRespVO;
import com.iailab.module.ansteel.api.vo.PowerTransferReqVO;
import com.iailab.module.ansteel.api.vo.PowerTransferRespVO;
import com.iailab.module.ansteel.common.enums.TransferTypeEnum;
import com.iailab.module.ansteel.common.utils.DecimalUtil;
import com.iailab.module.model.api.mcs.McsApi;
import com.iailab.module.model.api.mcs.dto.ChartParamDTO;
import com.iailab.module.model.api.mcs.dto.PredictTnValueReqVO;
import com.iailab.module.model.api.mdk.MdkApi;
import com.iailab.module.model.api.mdk.dto.MdkPredictDataDTO;
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 io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
 
import static com.iailab.framework.common.pojo.CommonResult.success;
 
/**
 * @author PanZhibao
 * @Description
 * @createTime 2025年03月31日
 */
@Slf4j
@RestController
@RequestMapping("/ansteel/api/model")
public class ModelController {
 
    @Autowired
    private MdkApi mdkApi;
 
    @Autowired
    private McsApi mcsApi;
 
    private String RPH_SCHEDULE_CODE = "AnSteelGasSchedule";
 
    /**
     * 负荷移植-负荷移植建议与方案
     *
     * @param reqVO
     * @return
     */
    @PostMapping("/power-transfer")
    @Operation(summary = "负荷移植-负荷移植建议与方案")
    public CommonResult<PowerTransferRespVO> scheduleEleLoad(@RequestBody PowerTransferReqVO reqVO) {
        log.info("异常工况下的负荷移植");
        if (reqVO.getTingjiZhong() == null) {
            reqVO.setTingjiZhong(0);
        }
        if (reqVO.getTingjiHou()== null) {
            reqVO.setTingjiHou(0);
        }
        if (reqVO.getTingjiRezha()== null) {
            reqVO.setTingjiRezha(0);
        }
 
        MdkScheduleReqDTO fhyzDto = new MdkScheduleReqDTO();
        PowerTransferRespVO result = new PowerTransferRespVO();
        List<PowerTransferDetRespVO> adviceList = new ArrayList<>();
        try {
            log.info("PowerTransferReqVO=" + JSONObject.toJSONString(reqVO));
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.SECOND,0);
            calendar.set(Calendar.MILLISECOND,0);
 
            String nowH = DateUtils.format(calendar.getTime(), "hh:mm");
            switch (TransferTypeEnum.getEumByCode(reqVO.getType())) {
                case XF:
                    // 0 建议编码
                    List<ChartParamDTO> chartParamList = mcsApi.getChartParamList(com.iailab.module.ansteel.common.constant.CommonConstant.FHYZ_ADVICE_CODE);
                    Map<String, Integer> fhyzAdviceCodeMap = new HashMap<>();
                    List<String> fhyzAdviceCodeList = new ArrayList<>();
                    if (chartParamList != null) {
                        for (ChartParamDTO chartParamDTO : chartParamList) {
                            fhyzAdviceCodeMap.put(chartParamDTO.getParamCode(), Integer.parseInt(chartParamDTO.getParamValue()));
                            fhyzAdviceCodeList.add(chartParamDTO.getParamCode());
                        }
                    }
 
                    // 1 日平衡
                    /*日平衡动态参数
                    zhiling_params  [休风高炉,休风时长]
                    jiaohua_params  [是否减焦化BFG,下限]
                    load_change_state   [热轧,厚板,中板,A系列烧结,B系列烧结]
                                        GASrezhaAdvice
                                        GAShoubanAdvice
                                        GASzhongbanAdvice
                                        GASAshaojieAdvice
                                        GASBshaojieAdvice
                    */
                    MdkScheduleReqDTO rphScheduleReqDTO = new MdkScheduleReqDTO();
                    rphScheduleReqDTO.setScheduleTime(calendar.getTime());
                    rphScheduleReqDTO.setScheduleCode(RPH_SCHEDULE_CODE);
                    Map<String, String> rphSettings = new HashMap<>();
                    List<Integer> zhilingParams = new ArrayList<>();
                    zhilingParams.add(reqVO.getBfg());
                    zhilingParams.add(reqVO.getMins());
                    rphSettings.put("zhiling_params", JSONArray.toJSONString(zhilingParams));
                    List<Integer> jiaohuaParams = new ArrayList<>();
                    jiaohuaParams.add(1);
                    jiaohuaParams.add(reqVO.getLimit().intValue());
                    rphSettings.put("jiaohua_params", JSONArray.toJSONString(jiaohuaParams));
                    List<Integer> loadChangeState = new ArrayList<>();
                    String[] loadChangeArr = {"GASrezhaAdvice", "GAShoubanAdvice", "GASzhongbanAdvice", "GASAshaojieAdvice", "GASBshaojieAdvice"};
                    for (int i = 0; i < loadChangeState.size(); i++) {
                        loadChangeState.add(reqVO.getAdviceCodeList().contains(loadChangeArr[i]) ? 1 : 0);
                    }
                    rphSettings.put("load_change_state", JSONArray.toJSONString(loadChangeState));
                    rphScheduleReqDTO.setDynamicSettings(rphSettings);
                    log.info("负荷移植调用日平衡开始执行," + JSONObject.toJSONString(rphScheduleReqDTO));
                    MdkScheduleRespDTO rphRespDTO = mdkApi.doSchedule(rphScheduleReqDTO);
                    log.info("负荷移植调用日平衡执行完成," + rphRespDTO);
                    String rphStatusCode = rphRespDTO.getStatusCode();
                    if (!CommonConstant.MDK_STATUS_100.equals(rphStatusCode)) {
                        log.info("rphStatusCode=" + rphStatusCode);
                        return CommonResult.error(GlobalErrorCodeConstants.UNKNOWN.getCode(), "负荷移植调用日平衡,无计算结果");
                    }
                    String gasUseAllnNew = rphRespDTO.getResult().get("Gas_Use_All_new").toString();
                    log.info("gasUseAllnNew=" + gasUseAllnNew);
 
 
                    // 高炉休风
                    fhyzDto.setScheduleTime(calendar.getTime());
                    fhyzDto.setScheduleCode("AnSteelpowertransfer");
                    Map<String, String> dynamicSettings = new HashMap<>();
                    Integer[] xiufengOrder = {
                            reqVO.getBfg(),
                            reqVO.getNow() == null ? Integer.parseInt(nowH) : reqVO.getNow(),
                            reqVO.getStart(),
                            reqVO.getMins()};
                    // 煤气日平衡输出
                    dynamicSettings.put("Gas_Use_All_new", gasUseAllnNew);
                    // 休风指令信息
                    dynamicSettings.put("xiufeng_order", JSONArray.toJSONString(xiufengOrder));
                    // 焦化保生产所需高炉煤气
                    dynamicSettings.put("jiaohua_BFG_down", reqVO.getLimit().toString());
                    // 停机时间
                    Integer[] tingjiOrder = {reqVO.getTingjiZhong(), reqVO.getTingjiHou(), reqVO.getTingjiRezha()};
                    dynamicSettings.put("tingji_order", JSONArray.toJSONString(tingjiOrder));
                    // 选择建议编码, 不选默认[-1]
                    List<Integer> choiceParams = new ArrayList<>();
                    if (CollectionUtils.isEmpty(reqVO.getAdviceCodeList())) {
                        choiceParams.add(-1);
                    } else {
                        for(String adviceCode : reqVO.getAdviceCodeList()) {
                            choiceParams.add(fhyzAdviceCodeMap.get(adviceCode));
                        }
                    }
                    dynamicSettings.put("choice_params", JSONArray.toJSONString(choiceParams));
                    fhyzDto.setDynamicSettings(dynamicSettings);
                    break;
                case JX:
                    // 产线检修
                    break;
                default:
                    return CommonResult.error(GlobalErrorCodeConstants.NOT_FOUND, "Type参数错误");
            }
 
            log.info("调度方案开始执行," + JSONObject.toJSONString(fhyzDto));
            MdkScheduleRespDTO mdkScheduleRespDTO = mdkApi.doSchedule(fhyzDto);
            log.info("调度方案执行完成," + mdkScheduleRespDTO);
 
            String statusCode = mdkScheduleRespDTO.getStatusCode();
            if (!CommonConstant.MDK_STATUS_100.equals(statusCode)) {
                log.info("statusCode=" + statusCode);
                return CommonResult.error(GlobalErrorCodeConstants.UNKNOWN.getCode(), "工序异常,无计算结果");
            }
 
            Map<String, Object> data = mdkScheduleRespDTO.getResult();
            // String fakeData = "{\"houbanAdvice\":[1000.0,150.0,16.97],\"2#LFAdvice\":[1000.0,150.0,11.8],\"1#2#zhiyangAdvice\":[1000.0,150.0,3.0],\"shaojieAdvice\":[1000.0,150.0,8.25],\"CCPPAdvice\":[1000.0,150.0,47.3],\"demand\":[34.4,0.0,3.0,0.0,0.0],\"rezhaAdvice\":[1000.0,150.0,45.86],\"best_total_power\":129.27,\"bfg_gap\":377924.37,\"zhongbanAdvice\":[1000.0,150.0,4.12],\"3#zhiyangAdvice\":[1000.0,150.0,25.3],\"cog_gap\":[800.0,59113.58],\"baihuiAdvice\":[1000.0,150.0,1.0],\"1#LFAdvice\":[1000.0,150.0,15.98]}";
            // Map<String, Object> data = JSONObject.parseObject(fakeData, Map.class);
            switch (TransferTypeEnum.getEumByCode(reqVO.getType())) {
                case XF:
                    // 高炉休风
                    result.setBestTotalPower(DecimalUtil.toBigDecimal(data.get("best_total_power")));//负荷调整总量
                    result.setBfgGap(DecimalUtil.toBigDecimal(data.get("bfg_gap")));//煤气送管网缺口
                    result.setDemand(data.get("demand"));//需量缺口
                    result.setCogGapTime(data.get("cog_gap") == null ? 0 : DecimalUtil.toBigDecimal(data.get("cog_gap"), 0).intValue()); //焦化减高炉煤气-时间
                    result.setCogGapAmount(data.get("cog_gap") == null ? 0 : DecimalUtil.toBigDecimal(data.get("cog_gap"), 1).intValue());//焦化减高炉煤气-数量
                    result.setBfgShengyue(DecimalUtil.toBigDecimal(data.get("BFG_shengyu")));
 
                    if (data.get("zhongbanAdvice") != null) {
                        adviceList.add(DecimalUtil.toPowerTransferDetRespVO("中板工序", data.get("zhongbanAdvice")));
                    }
                    if (data.get("houbanAdvice") != null) {
                        adviceList.add(DecimalUtil.toPowerTransferDetRespVO("厚板工序", data.get("houbanAdvice")));
                    }
                    if (data.get("rezhaAdvice") != null) {
                        adviceList.add(DecimalUtil.toPowerTransferDetRespVO("热轧工序", data.get("rezhaAdvice")));
                    }
                    if (data.get("baihuiAdvice") != null) {
                        adviceList.add(DecimalUtil.toPowerTransferDetRespVO("白灰工序", data.get("baihuiAdvice")));
                    }
                    if (data.get("3#zhiyangAdvice") != null) {
                        adviceList.add(DecimalUtil.toPowerTransferDetRespVO("3#制氧机", data.get("3#zhiyangAdvice")));
                    }
                    if (data.get("1#LFAdvice") != null) {
                        adviceList.add(DecimalUtil.toPowerTransferDetRespVO("1#LF炉", data.get("1#LFAdvice")));
                    }
                    if (data.get("2#LFAdvice") != null) {
                        adviceList.add(DecimalUtil.toPowerTransferDetRespVO("2#LF炉", data.get("2#LFAdvice")));
                    }
                    if (data.get("shaojieAdvice") != null) {
                        adviceList.add(DecimalUtil.toPowerTransferDetRespVO("B系列烧结", data.get("shaojieAdvice")));
                    }
                    if (data.get("CCPPAdvice") != null) {
                        adviceList.add(DecimalUtil.toPowerTransferDetRespVO("CCPP", data.get("CCPPAdvice")));
                    }
                    if (data.get("135Advice") != null) {
                        adviceList.add(DecimalUtil.toPowerTransferDetRespVO("135机组", data.get("135Advice")));
                    }
                    if (data.get("1#2#zhiyangAdvice") != null) {
                        adviceList.add(DecimalUtil.toPowerTransferDetRespVO("1#2#制氧机", data.get("1#2#zhiyangAdvice")));
                    }
                    if (data.get("2#lianganglianzhuAdvice") != null) {
                        adviceList.add(DecimalUtil.toPowerTransferDetRespVO("2#炼钢连铸", data.get("2#lianganglianzhuAdvice")));
                    }
                    result.setAdviceList(adviceList);
                    log.info("XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXF");
                    break;
               case JX:
                   // 产线检修
 
                   log.info("JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX");
                    break;
               default:
 
                    break;
 
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            return CommonResult.error(GlobalErrorCodeConstants.UNKNOWN.getCode(), ex.getMessage());
        }
        log.info("result=" + JSONObject.toJSONString(result));
        return CommonResult.success(result);
    }
 
    @PostMapping("/predict-data/tn-value")
    @Operation(summary = "获取T+N预测数据")
    public CommonResult<List<MdkPredictDataDTO>> getPredictTnValue(@RequestBody PredictTnValueReqVO reqVO) {
        log.info("PredictTnValueReqVO:"+reqVO);
        List<MdkPredictDataDTO> list = mcsApi.getPredictTnValue(reqVO);
        return success(list);
    }
}