| | |
| | | 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 |
| | |
| | | @Autowired |
| | | private MdkApi mdkApi; |
| | | |
| | | @Autowired |
| | | private McsApi mcsApi; |
| | | |
| | | private String RPH_SCHEDULE_CODE = "AnSteelGasSchedule"; |
| | | |
| | | /** |
| | | * 负荷移植-负荷移植建议与方案 |
| | | * |
| | |
| | | @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 { |
| | |
| | | Calendar calendar = Calendar.getInstance(); |
| | | calendar.set(Calendar.SECOND,0); |
| | | calendar.set(Calendar.MILLISECOND,0); |
| | | MdkScheduleReqDTO dto = new MdkScheduleReqDTO(); |
| | | dto.setScheduleTime(calendar.getTime()); |
| | | |
| | | 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); |
| | | |
| | | |
| | | // 高炉休风 |
| | | 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(fhyzAdviceCodeMap.get(adviceCode)); |
| | | } |
| | | } |
| | | dynamicSettings.put("choice_params", JSONArray.toJSONString(choiceParams)); |
| | | fhyzDto.setDynamicSettings(dynamicSettings); |
| | | break; |
| | | case JX: |
| | | // 产线检修 |
| | |
| | | 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(); |
| | |
| | | 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.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("zhongabnAdvice") != null) { |
| | | adviceList.add(DecimalUtil.toPowerTransferDetRespVO("中板工序", data.get("zhongabnAdvice"))); |
| | | 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("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("3#zhiyangAdvice") != null) { |
| | | adviceList.add(DecimalUtil.toPowerTransferDetRespVO("3#制氧机", data.get("3#zhiyangAdvice"))); |
| | | } |
| | | if (data.get("1LFAdvice") != null) { |
| | | adviceList.add(DecimalUtil.toPowerTransferDetRespVO("1#LF炉", data.get("1LFAdvice"))); |
| | | if (data.get("1#LFAdvice") != null) { |
| | | adviceList.add(DecimalUtil.toPowerTransferDetRespVO("1#LF炉", data.get("1#LFAdvice"))); |
| | | } |
| | | if (data.get("2LFAdvice") != null) { |
| | | adviceList.add(DecimalUtil.toPowerTransferDetRespVO("2#LF炉", data.get("2LFAdvice"))); |
| | | 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("shaojieAdvice") != null) { |
| | | 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"); |
| | |
| | | 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); |
| | | } |
| | | } |