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 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); } if (reqVO.getIsReduceCog() == null) { return CommonResult.error(GlobalErrorCodeConstants.UNKNOWN.getCode(), "IsReduceCog is null"); } MdkScheduleReqDTO fhyzDto = new MdkScheduleReqDTO(); PowerTransferRespVO result = new PowerTransferRespVO(); List demandAdviceList = new ArrayList<>(); List gasAdviceList = new ArrayList<>(); try { log.info("PowerTransferReqVO=" + JSONObject.toJSONString(reqVO)); Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.SECOND,0); calendar.set(Calendar.MILLISECOND,0); // 0 建议编码 List demandParamList = mcsApi.getChartParamList(com.iailab.module.ansteel.common.constant.CommonConstant.FHYZ_DEMAND_ADVICE); Map demandAdviceCodeMap = new HashMap<>(); List demandAdviceCodeList = new ArrayList<>(); if (demandParamList != null) { for (ChartParamDTO chartParamDTO : demandParamList) { demandAdviceCodeMap.put(chartParamDTO.getParamCode(), chartParamDTO); demandAdviceCodeList.add(chartParamDTO.getParamCode()); } } List gasParamList = mcsApi.getChartParamList(com.iailab.module.ansteel.common.constant.CommonConstant.FHYZ_GAS_ADVICE); Map gasAdviceCodeMap = new HashMap<>(); List gasAdviceCodeList = new ArrayList<>(); if (gasParamList != null) { for (ChartParamDTO chartParamDTO : gasParamList) { gasAdviceCodeMap.put(chartParamDTO.getParamCode(), chartParamDTO); gasAdviceCodeList.add(chartParamDTO.getParamCode()); } } String nowH = DateUtils.format(calendar.getTime(), "hh:mm"); switch (TransferTypeEnum.getEumByCode(reqVO.getType())) { case XF: // 1 日平衡 /*日平衡动态参数 zhiling_params [休风高炉,休风时长] jiaohua_params [是否减焦化BFG,下限] testlist [热轧,厚板,中板,A系列烧结,B系列烧结] GASrezhaAdvice GAShoubanAdvice GASzhongbanAdvice GASAshaojieAdvice GASBshaojieAdvice */ MdkScheduleReqDTO rphScheduleReqDTO = new MdkScheduleReqDTO(); rphScheduleReqDTO.setScheduleTime(calendar.getTime()); rphScheduleReqDTO.setScheduleCode(RPH_SCHEDULE_CODE); Map rphSettings = new HashMap<>(); List zhilingParams = new ArrayList<>(); zhilingParams.add(reqVO.getBfg()); zhilingParams.add(reqVO.getMins()); rphSettings.put("zhiling_params", JSONArray.toJSONString(zhilingParams)); List jiaohuaParams = new ArrayList<>(); jiaohuaParams.add(reqVO.getIsReduceCog() == 0 ? 0 : 1); jiaohuaParams.add(reqVO.getLimit().intValue()); rphSettings.put("jiaohua_params", JSONArray.toJSONString(jiaohuaParams)); List loadChangeState = new ArrayList<>(); String[] loadChangeArr = {"GASrezhaAdvice", "GAShoubanAdvice", "GASzhongbanAdvice", "GASAshaojieAdvice", "GASBshaojieAdvice"}; for (int i = 0; i < loadChangeArr.length; i++) { loadChangeState.add(reqVO.getAdviceCodeList().contains(loadChangeArr[i]) ? 1 : 0); } rphSettings.put("testlist", 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 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 choiceParams = new ArrayList<>(); if (CollectionUtils.isEmpty(reqVO.getAdviceCodeList())) { choiceParams.add(-1); } else { for(String adviceCode : reqVO.getAdviceCodeList()) { choiceParams.add(Integer.parseInt(demandAdviceCodeMap.get(adviceCode).getParamValue())); } } 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 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 data = JSONObject.parseObject(fakeData, Map.class); switch (TransferTypeEnum.getEumByCode(reqVO.getType())) { case XF: // 高炉休风 result.setDemand(data.get("demand")); result.setGasGap(data.get("gas_gap")); result.setFadian(data.get("fadian")); for (String adviceCode : demandAdviceCodeList) { if (data.get(adviceCode) != null) { demandAdviceList.add(DecimalUtil.toPowerTransferDetRespVO(demandAdviceCodeMap.get(adviceCode).getParamName(), data.get(adviceCode))); } } for (String adviceCode : gasAdviceCodeList) { if (data.get(adviceCode) != null) { demandAdviceList.add(DecimalUtil.toPowerTransferDetRespVO(gasAdviceCodeMap.get(adviceCode).getParamName(), data.get(adviceCode))); } } result.setDemandAdviceList(demandAdviceList); 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> getPredictTnValue(@RequestBody PredictTnValueReqVO reqVO) { log.info("PredictTnValueReqVO:"+reqVO); List list = mcsApi.getPredictTnValue(reqVO); return success(list); } }