From c508cba402a4f522b039c27348c71c432f2056f6 Mon Sep 17 00:00:00 2001 From: 潘志宝 <979469083@qq.com> Date: 星期二, 24 六月 2025 18:42:29 +0800 Subject: [PATCH] 负荷移植建议与方案 修改 --- ansteel-biz/src/main/java/com/iailab/module/ansteel/api/controller/admin/ModelController.java | 184 +++++++++++++++++++++++++++++++++++---------- 1 files changed, 141 insertions(+), 43 deletions(-) diff --git a/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/controller/admin/ModelController.java b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/controller/admin/ModelController.java index 1357808..9b18901 100644 --- a/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/controller/admin/ModelController.java +++ b/ansteel-biz/src/main/java/com/iailab/module/ansteel/api/controller/admin/ModelController.java @@ -10,19 +10,28 @@ 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 @@ -37,6 +46,11 @@ @Autowired private MdkApi mdkApi; + @Autowired + private McsApi mcsApi; + + private String RPH_SCHEDULE_CODE = "AnSteelGasSchedule"; + /** * 负荷移植-负荷移植建议与方案 * @@ -47,29 +61,124 @@ @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); + } + if (reqVO.getIsReduceCog() == null) { + return CommonResult.error(GlobalErrorCodeConstants.UNKNOWN.getCode(), "IsReduceCog is null"); + } + + MdkScheduleReqDTO fhyzDto = new MdkScheduleReqDTO(); PowerTransferRespVO result = new PowerTransferRespVO(); - List<PowerTransferDetRespVO> adviceList = new ArrayList<>(); + List<PowerTransferDetRespVO> demandAdviceList = new ArrayList<>(); + List<PowerTransferDetRespVO> gasAdviceList = new ArrayList<>(); try { log.info("PowerTransferReqVO=" + JSONObject.toJSONString(reqVO)); Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.SECOND,0); calendar.set(Calendar.MILLISECOND,0); - MdkScheduleReqDTO dto = new MdkScheduleReqDTO(); - dto.setScheduleTime(calendar.getTime()); + + // 0 建议编码 + List<ChartParamDTO> demandParamList = mcsApi.getChartParamList(com.iailab.module.ansteel.common.constant.CommonConstant.FHYZ_DEMAND_ADVICE); + Map<String, ChartParamDTO> demandAdviceCodeMap = new HashMap<>(); + List<String> demandAdviceCodeList = new ArrayList<>(); + if (demandParamList != null) { + for (ChartParamDTO chartParamDTO : demandParamList) { + demandAdviceCodeMap.put(chartParamDTO.getParamCode(), chartParamDTO); + demandAdviceCodeList.add(chartParamDTO.getParamCode()); + } + } + + List<ChartParamDTO> gasParamList = mcsApi.getChartParamList(com.iailab.module.ansteel.common.constant.CommonConstant.FHYZ_GAS_ADVICE); + Map<String, ChartParamDTO> gasAdviceCodeMap = new HashMap<>(); + List<String> 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<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(reqVO.getIsReduceCog() == 0 ? 0 : 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 < 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); + // 高炉休风 - dto.setScheduleCode("AnSteelpowertransfer"); + fhyzDto.setScheduleTime(calendar.getTime()); + fhyzDto.setScheduleCode("AnSteelpowertransfer"); Map<String, String> dynamicSettings = new HashMap<>(); Integer[] xiufengOrder = { reqVO.getBfg(), - reqVO.getStart(), 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()); - dto.setDynamicSettings(dynamicSettings); + // 停机时间 + 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(Integer.parseInt(demandAdviceCodeMap.get(adviceCode).getParamValue())); + } + } + dynamicSettings.put("choice_params", JSONArray.toJSONString(choiceParams)); + fhyzDto.setDynamicSettings(dynamicSettings); break; case JX: // 产线检修 @@ -78,56 +187,37 @@ return CommonResult.error(GlobalErrorCodeConstants.NOT_FOUND, "Type参数错误"); } - log.info("调度方案开始执行," + JSONObject.toJSONString(dto)); - MdkScheduleRespDTO mdkScheduleRespDTO = mdkApi.doSchedule(dto); + log.info("调度方案开始执行," + JSONObject.toJSONString(fhyzDto)); + MdkScheduleRespDTO mdkScheduleRespDTO = mdkApi.doSchedule(fhyzDto); log.info("调度方案执行完成," + mdkScheduleRespDTO); - /*String statusCode = mdkScheduleRespDTO.getStatusCode(); + 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); + 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.setDemand(data.get("demand")); + result.setGasGap(data.get("gas_gap")); + result.setFadian(data.get("fadian")); - if (data.get("zhongabnAdvice") != null) { - adviceList.add(DecimalUtil.toPowerTransferDetRespVO("中板工序", data.get("zhongabnAdvice"))); + for (String adviceCode : demandAdviceCodeList) { + if (data.get(adviceCode) != null) { + demandAdviceList.add(DecimalUtil.toPowerTransferDetRespVO(demandAdviceCodeMap.get(adviceCode).getParamName(), data.get(adviceCode))); + } } - if (data.get("houbanAdvice") != null) { - adviceList.add(DecimalUtil.toPowerTransferDetRespVO("厚板工序", data.get("houbanAdvice"))); + for (String adviceCode : gasAdviceCodeList) { + if (data.get(adviceCode) != null) { + demandAdviceList.add(DecimalUtil.toPowerTransferDetRespVO(gasAdviceCodeMap.get(adviceCode).getParamName(), data.get(adviceCode))); + } } - 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("zhiyangAdvice") != null) { - adviceList.add(DecimalUtil.toPowerTransferDetRespVO("3#制氧机", data.get("zhiyangAdvice"))); - } - if (data.get("1LFAdvice") != null) { - adviceList.add(DecimalUtil.toPowerTransferDetRespVO("1#LF炉", data.get("1LFAdvice"))); - } - if (data.get("2LFAdvice") != null) { - adviceList.add(DecimalUtil.toPowerTransferDetRespVO("2#LF炉", data.get("2LFAdvice"))); - } - if (data.get("shaojieAdvice") != null) { - adviceList.add(DecimalUtil.toPowerTransferDetRespVO("B系列烧结", data.get("shaojieAdvice"))); - } - if (data.get("shaojieAdvice") != null) { - adviceList.add(DecimalUtil.toPowerTransferDetRespVO("CCPP", data.get("CCPPAdvice"))); - } - result.setAdviceList(adviceList); + result.setDemandAdviceList(demandAdviceList); log.info("XFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXF"); break; case JX: @@ -147,4 +237,12 @@ 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); + } } \ No newline at end of file -- Gitblit v1.9.3