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.MdkPredictSimAdjustReqDTO; 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.*; /** * 煤气调度 * 高炉煤气调整量 adjustBFG * 焦炉煤气调整量 adjustCOG * 转炉煤气调整量 adjustLDG * 高炉煤气调度建议 adviceBFG * 焦炉煤气调度建议 adviceCOG * 转炉煤气调度建议 adviceLDG * 机组的煤气(折高)流量 gasConsumption * 机组的负荷率 loadRates * 机组的气耗 gasVolume * * @author PanZhibao * @Description * @createTime 2025年01月08日 */ @Component("runScheduleGasTask") public class RunScheduleGasTask implements ITask { private Logger logger = LoggerFactory.getLogger(getClass()); @Autowired private McsApi mcsApi; @Autowired private MdkApi mdkApi; /** * 煤气调度调整方向 * 1:调整值为正数;-1:调整值为负数 */ private static Map gasAdjustMode = new HashMap<>(); /** * 煤气调度建议时间 */ private static Map gasLastSugTime = new HashMap<>(); @Override public void run(String params) { logger.info("RunScheduleGasTask,参数为:{}", params); try { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.MILLISECOND, 0); calendar.set(Calendar.SECOND, 0); Date predictTime = calendar.getTime(); if (StringUtils.isEmpty(params)) { logger.info("参数为空"); return; } // 根据条件查找方案 List schemeList = mcsApi.listScheduleScheme(ScheduleTriggerMethodEnum.JOB.getCode(), params); if (CollectionUtils.isEmpty(schemeList)) { logger.info("方案为空"); return; } StScheduleSchemeDTO scheme = schemeList.get(0); MdkScheduleReqDTO dto = new MdkScheduleReqDTO(); dto.setScheduleTime(predictTime); dto.setScheduleCode(scheme.getCode()); MdkScheduleRespDTO mdkScheduleRespDTO = mdkApi.doSchedule(dto); if (!CommonConstant.MDK_STATUS_100.equals(mdkScheduleRespDTO.getStatusCode())) { logger.info("调度结果异常,STATUS=" + mdkScheduleRespDTO.getStatusCode()); return; } if (CollectionUtils.isEmpty(mdkScheduleRespDTO.getResult())) { logger.info("煤气调度结果为空"); return; } Map result = mdkScheduleRespDTO.getResult(); // 结果写入测点 mdkApi.scheduleModelOut(mdkScheduleRespDTO); // 保存调度建议 saveScheduleSuggest("高炉煤气", result.get("adviceBFG"), "BFG", predictTime, result.get("adjustValueBFG"), scheme.getAdjustRate()); saveScheduleSuggest("焦炉煤气", result.get("adviceCOG"), "COG", predictTime, result.get("adjustValueCOG"), scheme.getAdjustRate()); saveScheduleSuggest("转炉5W+8W煤气柜", result.get("adviceLDG13W"), "LDG1", predictTime, result.get("adjustValueLDG13W"), scheme.getAdjustRate()); saveScheduleSuggest("宏发12W煤气柜", result.get("adviceLDG12W"), "LDG2", predictTime, result.get("adjustValueLDG12W"), scheme.getAdjustRate()); saveScheduleSuggest("转炉特钢煤气柜", result.get("adviceLDG12WT"), "LDGt", predictTime, result.get("adjustValueLDG12WT"), scheme.getAdjustRate()); saveScheduleSuggest("高炉煤气预警", result.get("BFG_warning_advice"), "BFG_ALARM", predictTime, result.get("adjustValueBFG"), scheme.getAdjustRate()); saveScheduleSuggest("焦炉煤气预警", result.get("COG_warning_advice"), "COG_ALARM", predictTime, result.get("adjustValueCOG"), scheme.getAdjustRate()); saveScheduleSuggest("转炉5W+8W煤气柜预警", result.get("LDG_1_warning_advice"), "LDG1_ALARM", predictTime, result.get("adjustValueLDG13W"), scheme.getAdjustRate()); saveScheduleSuggest("宏发12W煤气柜预警", result.get("LDG_2_warning_advice"), "LDG2_ALARM", predictTime, result.get("adjustValueLDG12W"), scheme.getAdjustRate()); saveScheduleSuggest("转炉特钢12W煤气柜预警", result.get("LDG_3_warning_advice"), "LDGt_ALARM", predictTime, result.get("adjustValueLDG12WT"), scheme.getAdjustRate()); // 模拟调整 MdkPredictSimAdjustReqDTO simAdjustReqDTO = new MdkPredictSimAdjustReqDTO(); simAdjustReqDTO.setPredictTime(predictTime); simAdjustReqDTO.setScheduleCode(com.iailab.module.shasteel.mq.common.constant.CommonConstant.GAS_MODEL_CODE); simAdjustReqDTO.setModelResult(result); Boolean simAdjustFlag = mdkApi.predictSimAdjust(simAdjustReqDTO); if (simAdjustFlag) { logger.info("模拟调整成功,ScheduleCode:" + com.iailab.module.shasteel.mq.common.constant.CommonConstant.GAS_MODEL_CODE); } else { logger.error("模拟调整失败,simAdjustReqDTO:" + simAdjustReqDTO); } logger.info(params + "调度方案执行完成"); } catch (Exception ex) { logger.error("RunScheduleGasTask运行异常"); ex.printStackTrace(); } logger.info("RunScheduleGasTask运行完成"); } /** * 建议保持逻辑 *

*

* BFG建议: * 若触发第一条: * 当前BFG建议 = adviceBFG * 若后续BFG建议出现时间与当前BFG建议相差15分钟之内: * 所后续BFG建议方向与当前BFG建议方向相反: * 当前建议 = 后续BFG建议 * 若不是: * 当前建议保持不变 * 若不是则: * 当前建议 = 后续BFG建议 *

* COG建议: * 若触发第一条: * 当前COG建议 = adviceCOG * 若后续COG建议出现时间与当前COG建议相差15分钟之内: * 所后续COG建议方向与当前COG建议方向相反: * 当前建议 = 后续COG建议 * 若不是: * 当前建议保持不变 * 若不是则: * 当前建议 = 后续COG建议 *

* LDG13W建议: * 若触发第一条: * 当前LDG13W建议 = adviceLDG13W * 若后续LDG13W建议出现时间与当前LDG13W建议相差15分钟之内: * 所后续LDG13W建议方向与当前LDG13W建议方向相反: * 当前建议 = 后续LDG13W建议 * 若不是: * 当前建议保持不变 * 若不是则: * 当前建议 = 后续LDG13W建议 *

* LDG12W建议: * 若触发第一条: * 当前LDG12W建议 = adviceLDG12W * 若后续LDG12W建议出现时间与当前LDG12W建议相差15分钟之内: * 所后续LDG12W建议方向与当前LDG12W建议方向相反: * 当前建议 = 后续LDG12W建议 * 若不是: * 当前建议保持不变 * 若不是则: * 当前建议 = 后续LDG12W建议 *

* LDG12WT建议: * 若触发第一条: * 当前LDG12WT建议 = adviceLDG12WT * 若后续LDG12WT建议出现时间与当前LDG12WT建议相差15分钟之内: * 所后续LDG12WT建议方向与当前LDG12WT建议方向相反: * 当前建议 = 后续LDG12WT建议 * 若不是: * 当前建议保持不变 * 若不是则: * 当前建议 = 后续LDG12WT建议 * * @param title * @param content * @param scheduleObj * @param scheduleTime */ private void saveScheduleSuggest(String title, Object content, String scheduleObj, Date scheduleTime, Object adjustObj, int adjustRate) { if (content == null || StringUtils.isBlank(content.toString()) || "0".equals(content.toString())) { logger.info(title + "content为空"); return; } if (!title.contains("预警") && (adjustObj == null || StringUtils.isBlank(adjustObj.toString()) || "0".equals(adjustObj.toString()))) { logger.info(title + "调整值为空,不产生建议"); return; } BigDecimal adjustValue = new BigDecimal(adjustObj.toString()); if (gasAdjustMode.containsKey(scheduleObj) && gasAdjustMode.get(scheduleObj).equals(adjustValue.compareTo(BigDecimal.ZERO)) && gasLastSugTime.containsKey(scheduleObj) && (scheduleTime.getTime() - gasLastSugTime.get(scheduleObj).getTime() <= Integer.valueOf(adjustRate).longValue() * 60 * 1000)) { logger.info(title + "调整建议在有效期内"); return; } gasAdjustMode.put(scheduleObj, adjustValue.compareTo(BigDecimal.ZERO)); gasLastSugTime.put(scheduleObj, scheduleTime); ScheduleSuggestRespDTO suggest = new ScheduleSuggestRespDTO(); suggest.setTitle(title); suggest.setContent(content.toString()); suggest.setAdjustValue(adjustValue); suggest.setScheduleObj(scheduleObj); suggest.setScheduleTime(scheduleTime); suggest.setSort(0); mcsApi.createScheduleSuggest(suggest); } }