From a3bb1815c3eb6b0f0cfe9d9d2ba5ee48279e26ed Mon Sep 17 00:00:00 2001 From: dongyukun <1208714201@qq.com> Date: 星期五, 28 三月 2025 11:30:49 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/RunScheduleAirClassAverageIndexTask.java | 88 ++++++++ shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/RunScheduleOnaOptTask.java | 107 ++++++++- shasteel-biz/src/main/java/com/iailab/module/shasteel/mq/consumer/ModelAlarmConsumer.java | 137 ++++++++++- shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/RunScheduleSteamTask.java | 50 +++ shasteel-biz/src/main/java/com/iailab/module/shasteel/framework/rpc/config/RpcConfiguration.java | 3 shasteel-biz/src/main/java/com/iailab/module/shasteel/mq/consumer/ModelPredictFinishConsumer.java | 66 +++-- shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/SyncSegmentedDataTask.java | 3 shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/SaveIndDataToPointDataTask.java | 87 +++++++ shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/RunScheduleAirDispatchTask.java | 70 +++-- 9 files changed, 517 insertions(+), 94 deletions(-) diff --git a/shasteel-biz/src/main/java/com/iailab/module/shasteel/framework/rpc/config/RpcConfiguration.java b/shasteel-biz/src/main/java/com/iailab/module/shasteel/framework/rpc/config/RpcConfiguration.java index 9a797c3..83d418d 100644 --- a/shasteel-biz/src/main/java/com/iailab/module/shasteel/framework/rpc/config/RpcConfiguration.java +++ b/shasteel-biz/src/main/java/com/iailab/module/shasteel/framework/rpc/config/RpcConfiguration.java @@ -1,5 +1,6 @@ package com.iailab.module.shasteel.framework.rpc.config; +import com.iailab.module.data.api.ind.IndItemApi; import com.iailab.module.data.api.point.DataPointApi; import com.iailab.module.infra.api.config.ConfigApi; import com.iailab.module.infra.api.db.DataSourceConfigServiceApi; @@ -12,6 +13,6 @@ import org.springframework.context.annotation.Configuration; @Configuration(proxyBeanMethods = false) -@EnableFeignClients(clients = {FileApi.class, WebSocketSenderApi.class, DataSourceConfigServiceApi.class, ConfigApi.class, TenantApi.class, McsApi.class, MdkApi.class, DataPointApi.class}) +@EnableFeignClients(clients = {FileApi.class, WebSocketSenderApi.class, DataSourceConfigServiceApi.class, ConfigApi.class, TenantApi.class, McsApi.class, MdkApi.class, DataPointApi.class, IndItemApi.class}) public class RpcConfiguration { } diff --git a/shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/RunScheduleAirClassAverageIndexTask.java b/shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/RunScheduleAirClassAverageIndexTask.java new file mode 100644 index 0000000..5c046ec --- /dev/null +++ b/shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/RunScheduleAirClassAverageIndexTask.java @@ -0,0 +1,88 @@ +package com.iailab.module.shasteel.job.task; + +import com.iailab.module.model.api.mcs.McsApi; +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.MdkScheduleReqDTO; +import com.iailab.module.model.api.mdk.dto.MdkScheduleRespDTO; +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 javax.annotation.Resource; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.*; + +/** + * 压缩空气班次指标累积评价 + * 动态数据长度,月初到当天 + * 每天更新,10 0 0 1/1 * ? + * + * @author PanZhibao + * @Description + * @createTime 2024年12月31日 + */ +@Component("runScheduleAirClassAverageIndexTask") +public class RunScheduleAirClassAverageIndexTask implements ITask { + private Logger logger = LoggerFactory.getLogger(getClass()); + + @Resource + private McsApi mcsApi; + + @Autowired + private MdkApi mdkApi; + + @Override + public void run(String params) { + logger.info("RunScheduleAirClassAverageIndexTask,参数为:{}", params); + try { + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.MILLISECOND, 0); + calendar.set(Calendar.SECOND, 0); + Date scheduleTime = calendar.getTime(); + if (StringUtils.isEmpty(params)) { + logger.info("参数为空"); + return; + } + // 根据条件查找方案 + List<StScheduleSchemeDTO> schemeList = mcsApi.listScheduleScheme(ScheduleTriggerMethodEnum.JOB.getCode(), params); + if (CollectionUtils.isEmpty(schemeList)) { + logger.info("方案为空"); + return; + } + + for (StScheduleSchemeDTO scheme : schemeList) { + MdkScheduleReqDTO dto = new MdkScheduleReqDTO(); + dto.setScheduleTime(scheduleTime); + dto.setScheduleCode(scheme.getCode()); + LocalDateTime now = LocalDateTime.now(); + LocalDate startOfMonth = LocalDate.now().withDayOfMonth(1); + LocalDateTime startOfMonthAtMidnight = startOfMonth.atStartOfDay(); + long timeDifference = ChronoUnit.MINUTES.between(startOfMonthAtMidnight, now); + Map<Integer, Integer> dynamicDataLength = new HashMap<>(); + dynamicDataLength.put(1, (int) timeDifference); + dynamicDataLength.put(2, (int) timeDifference); + dynamicDataLength.put(3, (int) timeDifference); + dynamicDataLength.put(4, (int) timeDifference); + dto.setDynamicDataLength(dynamicDataLength); + Map<String, String> dynamicSettings = new HashMap<>(); + dynamicSettings.put("embedDim", String.valueOf(timeDifference)); + dto.setDynamicSettings(dynamicSettings); + MdkScheduleRespDTO mdkScheduleRespDTO = mdkApi.doSchedule(dto); + // 结果写入测点 + mdkApi.scheduleModelOut(mdkScheduleRespDTO); + } + logger.info(params + "调度方案执行完成"); + } catch (Exception ex) { + logger.error("RunScheduleAirClassAverageIndexTask运行异常"); + ex.printStackTrace(); + } + logger.info("RunScheduleAirClassAverageIndexTask运行完成"); + } +} \ No newline at end of file diff --git a/shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/RunScheduleAirDispatchTask.java b/shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/RunScheduleAirDispatchTask.java index ca7f863..0e25f5d 100644 --- a/shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/RunScheduleAirDispatchTask.java +++ b/shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/RunScheduleAirDispatchTask.java @@ -16,9 +16,7 @@ import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; -import java.util.Calendar; -import java.util.Date; -import java.util.List; +import java.util.*; /** * 压缩空气优化调度 @@ -41,6 +39,16 @@ @Autowired private MdkApi mdkApi; + + /** + * 调度建议内容 + */ + private static Map<String, String> gasAdjustMode = new HashMap<>(); + + /** + * 调度建议时间 + */ + private static Map<String, Date> gasLastSugTime = new HashMap<>(); @Override public void run(String params) { @@ -71,7 +79,6 @@ logger.info("调度结果异常,STATUS=" + mdkScheduleRespDTO.getStatusCode()); return; } - // 保存预警信息 if (mdkScheduleRespDTO.getResult().get("pressureLWarning") != null && StringUtils.isNotEmpty(mdkScheduleRespDTO.getResult().get("pressureLWarning").toString())) { @@ -99,30 +106,10 @@ } // 保存调度建议 - if (mdkScheduleRespDTO.getResult().get("dispatchStart") != null && - StringUtils.isNotEmpty(mdkScheduleRespDTO.getResult().get("dispatchStart").toString())) { - String dispatchStart = mdkScheduleRespDTO.getResult().get("dispatchStart").toString(); - ScheduleSuggestRespDTO suggest = new ScheduleSuggestRespDTO(); - suggest.setTitle("空压机启动调度建议"); - suggest.setContent(dispatchStart); - suggest.setScheduleObj(scheme.getScheduleObj()); - suggest.setScheduleTime(scheduleTime); - suggest.setSort(0); - mcsApi.createScheduleSuggest(suggest); - } - - if (mdkScheduleRespDTO.getResult().get("dispatchClose") != null && - StringUtils.isNotEmpty(mdkScheduleRespDTO.getResult().get("dispatchClose").toString())) { - String dispatchClose = mdkScheduleRespDTO.getResult().get("dispatchClose").toString(); - ScheduleSuggestRespDTO suggest = new ScheduleSuggestRespDTO(); - suggest.setTitle("空压机关停调度建议"); - suggest.setContent(dispatchClose); - suggest.setScheduleObj(scheme.getScheduleObj()); - suggest.setScheduleTime(scheduleTime); - suggest.setSort(0); - mcsApi.createScheduleSuggest(suggest); - } - + this.saveScheduleSuggest("空压机启动调度建议", mdkScheduleRespDTO.getResult().get("dispatchStart"), scheme.getScheduleObj(), + scheduleTime, scheme.getAdjustRate()); + this.saveScheduleSuggest("空压机关停调度建议", mdkScheduleRespDTO.getResult().get("dispatchClose"), scheme.getScheduleObj(), + scheduleTime, scheme.getAdjustRate()); logger.info(params + "调度方案执行完成"); } catch (Exception ex) { logger.error("RunScheduleAirDispatchTask运行异常"); @@ -130,4 +117,31 @@ } logger.info("RunScheduleAirDispatchTask运行完成"); } + + private void saveScheduleSuggest(String title, Object content, String scheduleObj, Date scheduleTime, int adjustRate) { + if (content == null) { + logger.info(title + "调整值为空,不产生建议"); + return; + } + String contentStr = content.toString(); + if (StringUtils.isBlank(contentStr)) { + logger.info(title + "调整值为空,不产生建议"); + return; + } + if (gasAdjustMode.containsKey(title) && gasAdjustMode.get(title).equals(contentStr) && + gasLastSugTime.containsKey(title) && (scheduleTime.getTime() - gasLastSugTime.get(title).getTime() <= Integer.valueOf(adjustRate).longValue() * 60 * 1000)) { + logger.info("调整建议在有效期内"); + return; + } + gasAdjustMode.put(title, contentStr); + gasLastSugTime.put(title, scheduleTime); + + ScheduleSuggestRespDTO suggest = new ScheduleSuggestRespDTO(); + suggest.setTitle(title); + suggest.setContent(content.toString()); + suggest.setScheduleObj(scheduleObj); + suggest.setScheduleTime(scheduleTime); + suggest.setSort(0); + mcsApi.createScheduleSuggest(suggest); + } } \ No newline at end of file diff --git a/shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/RunScheduleOnaOptTask.java b/shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/RunScheduleOnaOptTask.java index 57ecf75..18734fe 100644 --- a/shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/RunScheduleOnaOptTask.java +++ b/shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/RunScheduleOnaOptTask.java @@ -1,6 +1,8 @@ package com.iailab.module.shasteel.job.task; +import com.alibaba.fastjson.JSONArray; import com.iailab.module.model.api.mcs.McsApi; +import com.iailab.module.model.api.mcs.dto.AlarmMessageRespDTO; 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; @@ -15,6 +17,7 @@ import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; +import java.math.BigDecimal; import java.util.*; /** @@ -53,6 +56,17 @@ private MdkApi mdkApi; private Map<String, StScheduleSchemeDTO> schemeMap = new HashMap<>(); + + /** + * 调度调整方向 + * 1:调整值为正数;-1:调整值为负数 + */ + private static Map<String, Integer> gasAdjustMode = new HashMap<>(); + + /** + * 调度建议时间 + */ + private static Map<String, Date> gasLastSugTime = new HashMap<>(); private static final String CODE06 = "06"; @@ -104,34 +118,50 @@ mdkApi.scheduleModelOut(entry.getValue()); logger.info("氧气班平衡计划下发参数: {}", entry.getValue()); } else if (entry.getKey().equals(CODE05)) { - String scheduleObj = schemeMap.get(CODE05).getScheduleObj(); + // 氧气系统优化调度决策 + StScheduleSchemeDTO scheduleScheme = schemeMap.get(CODE05); + String scheduleObj = scheduleScheme.getScheduleObj(); + /*String yingdiAdvice = entry.getValue().getResult().get("yingdiAdvice").toString(); String faAdvice = entry.getValue().getResult().get("faAdvice").toString(); String hongAdvice = entry.getValue().getResult().get("hongAdvice").toString(); String runAdvice = entry.getValue().getResult().get("runAdvice").toString(); - String yingdiAdvice = entry.getValue().getResult().get("yingdiAdvice").toString(); - if(!("压力正常".equals(yingdiAdvice)||"-2.0".equals(yingdiAdvice))){ + if(!yingdiAdvice.equals("压力正常")){ saveScheduleSuggest("盈德中压调整建议", yingdiAdvice, scheduleObj, scheduleTime); } - if(!("压力正常".equals(faAdvice)||"-2.0".equals(faAdvice))){ + if(!faAdvice.equals("压力正常")){ saveScheduleSuggest("法夜空调整建议", faAdvice, scheduleObj, scheduleTime); } - if(!("压力正常".equals(hongAdvice)||"-2.0".equals(hongAdvice))){ + if(!hongAdvice.equals("压力正常")){ saveScheduleSuggest("宏昌调整建议", hongAdvice, scheduleObj, scheduleTime); } - if(!("压力正常".equals(runAdvice)||"-2.0".equals(runAdvice))){ + if(!runAdvice.equals("压力正常")){ saveScheduleSuggest("润忠调整建议", runAdvice, scheduleObj, scheduleTime); - } - } else if (entry.getKey().equals(CODE01)) { - String scheduleObj = schemeMap.get(CODE01).getScheduleObj(); + }*/ + + BigDecimal adviceValues = new BigDecimal(entry.getValue().getResult().get("adviceValues").toString()); + logger.info("各制氧机组建议 adviceValues=" + adviceValues); + + String advice = entry.getValue().getResult().get("advice").toString(); - if(!("压力正常".equals(advice)||"-2.0".equals(advice))){ - saveScheduleSuggest("氮气预警", advice, scheduleObj, scheduleTime); + if(adviceValues.compareTo(BigDecimal.ZERO) != 0){ + saveScheduleSuggest("各制氧机组建议", advice, scheduleObj, scheduleTime, adviceValues, scheduleScheme.getAdjustRate()); + } + + } else if (entry.getKey().equals(CODE01)) { + StScheduleSchemeDTO scheduleScheme = schemeMap.get(CODE01); + String scheduleObj = scheduleScheme.getScheduleObj(); + BigDecimal adviceValues = new BigDecimal(entry.getValue().getResult().get("advicevalues").toString()); + logger.info("氮气预警 adviceValues=" + adviceValues); + + String advice = entry.getValue().getResult().get("advice").toString(); + if(adviceValues.compareTo(BigDecimal.ZERO) != 0){ + saveAlarmMessage("氮气预警", advice, scheduleObj, scheduleTime,adviceValues,scheduleScheme.getAdjustRate()); } } } logger.info(params + "调度方案执行完成"); } catch (Exception ex) { - logger.error("RunScheduleOnaOptTask运行异常"); + logger.error("RunScheduleOnaOptTask运行异常",ex); ex.printStackTrace(); } logger.info("RunScheduleOnaOptTask运行完成"); @@ -139,8 +169,10 @@ private void saveScheduleSuggest(String title, String content, String scheduleObj, Date scheduleTime) { if (StringUtils.isBlank(content)) { + logger.info(title + "调整值为空,不产生建议"); return; } + ScheduleSuggestRespDTO suggest = new ScheduleSuggestRespDTO(); suggest.setTitle(title); suggest.setContent(content); @@ -149,4 +181,55 @@ suggest.setSort(0); mcsApi.createScheduleSuggest(suggest); } + + private void saveScheduleSuggest(String title, String content, String scheduleObj, Date scheduleTime, BigDecimal adjustValue, int adjustRate) { + if (StringUtils.isBlank(content)) { + logger.info(title + "调整值为空,不产生建议"); + return; + } + if (adjustValue == null || adjustValue.doubleValue() == 0) { + logger.info(title + "调整值为空,不产生建议"); + return; + } + if (gasAdjustMode.containsKey(title) && gasAdjustMode.get(title).equals(adjustValue.compareTo(BigDecimal.ZERO)) && + gasLastSugTime.containsKey(title) && (scheduleTime.getTime() - gasLastSugTime.get(title).getTime() <= Integer.valueOf(adjustRate).longValue() * 60 * 1000)) { + logger.info("调整建议在有效期内"); + return; + } + gasAdjustMode.put(title, adjustValue.compareTo(BigDecimal.ZERO)); + gasLastSugTime.put(title, scheduleTime); + + ScheduleSuggestRespDTO suggest = new ScheduleSuggestRespDTO(); + suggest.setTitle(title); + suggest.setContent(content); + suggest.setScheduleObj(scheduleObj); + suggest.setScheduleTime(scheduleTime); + suggest.setSort(0); + mcsApi.createScheduleSuggest(suggest); + } + private void saveAlarmMessage(String title, String content, String scheduleObj, Date scheduleTime, BigDecimal adjustValue, int adjustRate) { + if (StringUtils.isBlank(content)) { + logger.info(title + "预警值为空,不产生预警"); + return; + } + if (adjustValue == null || adjustValue.doubleValue() == 0) { + logger.info(title + "预警值为空,不产生预警"); + return; + } + if (gasAdjustMode.containsKey(title) && gasAdjustMode.get(title).equals(adjustValue.compareTo(BigDecimal.ZERO)) && + gasLastSugTime.containsKey(title) && (scheduleTime.getTime() - gasLastSugTime.get(title).getTime() <= Integer.valueOf(adjustRate).longValue() * 60 * 1000)) { + logger.info("预警在有效期内"); + return; + } + gasAdjustMode.put(title, adjustValue.compareTo(BigDecimal.ZERO)); + gasLastSugTime.put(title, scheduleTime); + + AlarmMessageRespDTO alarm = new AlarmMessageRespDTO(); + alarm.setTitle(title); + alarm.setContent(content); + alarm.setAlarmObj(scheduleObj); + alarm.setAlarmType(adjustValue.compareTo(BigDecimal.ZERO) > 0 ? "超上限" : "超下限"); + alarm.setAlarmTime(scheduleTime); + mcsApi.createAlarmMessage(alarm); + } } \ No newline at end of file diff --git a/shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/RunScheduleSteamTask.java b/shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/RunScheduleSteamTask.java index 57d20aa..1f7a9c3 100644 --- a/shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/RunScheduleSteamTask.java +++ b/shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/RunScheduleSteamTask.java @@ -1,5 +1,6 @@ package com.iailab.module.shasteel.job.task; +import com.alibaba.fastjson.JSONArray; import com.iailab.module.model.api.mcs.McsApi; import com.iailab.module.model.api.mcs.dto.AlarmMessageRespDTO; import com.iailab.module.model.api.mcs.dto.ScheduleSuggestRespDTO; @@ -16,9 +17,8 @@ import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; -import java.util.Calendar; -import java.util.Date; -import java.util.List; +import java.math.BigDecimal; +import java.util.*; /** * 蒸汽调度 @@ -46,6 +46,17 @@ @Autowired private MdkApi mdkApi; + + /** + * 调度调整方向 + * 1:调整值为正数;-1:调整值为负数 + */ + private static Map<String, Integer> gasAdjustMode = new HashMap<>(); + + /** + * 调度建议时间 + */ + private static Map<String, Date> gasLastSugTime = new HashMap<>(); @Override public void run(String params) { @@ -75,12 +86,21 @@ logger.info("调度结果异常,STATUS=" + mdkScheduleRespDTO.getStatusCode()); return; } + // 用户调整量 + logger.info("user_adjust=" + mdkScheduleRespDTO.getResult().get("user_adjust")); + List<BigDecimal> adviceValues = new ArrayList<>(); + JSONArray ja0 = JSONArray.parseArray(mdkScheduleRespDTO.getResult().get("user_adjust").toString()); + JSONArray ja1 = ja0.getJSONArray(0); + for(int i = 0; i < ja1.size(); i++) { + adviceValues.add(new BigDecimal(ja1.get(i).toString())); + } + logger.info("adviceValues=" + JSONArray.toJSONString(adviceValues)); Object jinfengAdvice = mdkScheduleRespDTO.getResult().get("jinfengAdvice"); - saveScheduleSuggest("锦丰调度建议", jinfengAdvice, scheme.getScheduleObj(), scheduleTime); + saveScheduleSuggest("锦丰调度建议", jinfengAdvice, scheme.getScheduleObj(), scheduleTime, adviceValues.get(0), scheme.getAdjustRate()); Object daxinAdvice = mdkScheduleRespDTO.getResult().get("daxinAdvice"); - saveScheduleSuggest("大新调度建议", daxinAdvice, scheme.getScheduleObj(), scheduleTime); + saveScheduleSuggest("大新调度建议", daxinAdvice, scheme.getScheduleObj(), scheduleTime, adviceValues.get(1), scheme.getAdjustRate()); Object daxinWarning = mdkScheduleRespDTO.getResult().get("daxinWarning"); saveAlarmMessage("大新预警", daxinWarning, scheme.getScheduleObj(), scheduleTime); @@ -102,11 +122,25 @@ logger.info("RunScheduleSteamTask运行完成"); } - private void saveScheduleSuggest(String title, Object content, String scheduleObj, Date scheduleTime) { - if (content == null || StringUtils.isBlank(content.toString()) || "0".equals(content.toString())) { - logger.info(title + "content为空"); + private void saveScheduleSuggest(String title, Object content, String scheduleObj, Date scheduleTime, BigDecimal adjustValue, int adjustRate) { + if (content == null) { return; } + if (StringUtils.isBlank(content.toString())) { + return; + } + if (adjustValue == null || adjustValue.doubleValue() == 0) { + logger.info(title + "调整值为空,不产生建议"); + return; + } + if (gasAdjustMode.containsKey(title) && gasAdjustMode.get(title).equals(adjustValue.compareTo(BigDecimal.ZERO)) && + gasLastSugTime.containsKey(title) && (scheduleTime.getTime() - gasLastSugTime.get(title).getTime() <= Integer.valueOf(adjustRate).longValue() * 60 * 1000)) { + logger.info("调整建议在有效期内"); + return; + } + gasAdjustMode.put(title, adjustValue.compareTo(BigDecimal.ZERO)); + gasLastSugTime.put(title, scheduleTime); + ScheduleSuggestRespDTO suggest = new ScheduleSuggestRespDTO(); suggest.setTitle(title); suggest.setContent(content.toString()); diff --git a/shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/SaveIndDataToPointDataTask.java b/shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/SaveIndDataToPointDataTask.java new file mode 100644 index 0000000..ff6db1b --- /dev/null +++ b/shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/SaveIndDataToPointDataTask.java @@ -0,0 +1,87 @@ +package com.iailab.module.shasteel.job.task; + +import com.iailab.module.data.api.ind.IndItemApi; +import com.iailab.module.data.api.ind.dto.ApiIndItemValueDTO; +import com.iailab.module.data.api.point.DataPointApi; +import com.iailab.module.data.api.point.dto.ApiPointValueWriteDTO; +import com.iailab.module.model.api.mcs.McsApi; +import com.iailab.module.model.api.mcs.dto.ChartParamDTO; +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 java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.YearMonth; +import java.util.Calendar; +import java.util.List; + +/** + * 蒸汽评价指标(汽耗率) + * + * @author Jay + */ +@Component("saveIndDataToPointDataTask") +public class SaveIndDataToPointDataTask implements ITask { + private Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired + private McsApi mcsApi; + + @Autowired + private DataPointApi dataPointApi; + + @Autowired + private IndItemApi indItemApi; + + @Override + public void run(String params) { + logger.info("SaveIndDataToPointDataTask,参数为:{}", params); + try { + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.MILLISECOND, 0); + calendar.set(Calendar.SECOND, 0); + if (StringUtils.isEmpty(params)) { + logger.info("参数为空"); + return; + } + //获取当前月天数 + LocalDate today = LocalDate.now(); + // 使用YearMonth来获取当前年份和月份的天数 + YearMonth yearMonth = YearMonth.of(today.getYear(), today.getMonthValue()); + int lengthOfMonth = yearMonth.lengthOfMonth(); + List<ChartParamDTO> chartParamList = mcsApi.getChartParamList(params); + logger.info("当前月天数:" + lengthOfMonth); + chartParamList.forEach(chartParam -> { + logger.info("指标编码:" + chartParam.getParamCode()); + List<ApiIndItemValueDTO> indItemlist = indItemApi.queryIndItemDefaultValue(chartParam.getParamCode()); + logger.info("查询到的指标值:" + indItemlist); + if (indItemlist != null && indItemlist.size() > 0) { + try { + ApiPointValueWriteDTO apiPointValueWriteDTO = new ApiPointValueWriteDTO(); + apiPointValueWriteDTO.setPointNo(chartParam.getParamValue()); + BigDecimal indValue = BigDecimal.valueOf((Double) indItemlist.get(0).getDataValue()); + logger.info("指标值:" + indValue); + BigDecimal pointValue = indValue.divide(new BigDecimal(lengthOfMonth), 3, RoundingMode.HALF_UP); + logger.info("测点值:" + pointValue); + apiPointValueWriteDTO.setValue(pointValue); + logger.info("写入测点值:" + apiPointValueWriteDTO); + dataPointApi.writePointRealValue(apiPointValueWriteDTO); + }catch (Exception ex){ + logger.error("SaveIndDataToPointDataTask运行异常" + ex); + ex.printStackTrace(); + } + } + }); + + logger.info(params + "调度方案执行完成"); + } catch (Exception ex) { + logger.error("SaveIndDataToPointDataTask运行异常"); + ex.printStackTrace(); + } + logger.info("SaveIndDataToPointDataTask运行完成"); + } +} diff --git a/shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/SyncSegmentedDataTask.java b/shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/SyncSegmentedDataTask.java index e88f129..14b5ac5 100644 --- a/shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/SyncSegmentedDataTask.java +++ b/shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/SyncSegmentedDataTask.java @@ -118,7 +118,7 @@ String year = String.valueOf(date.getYear()); paramsMap.put("clock", year); logger.info("请求参数:" + JSON.toJSONString(paramsMap)); - String resp = HttpUtils.sendPost(QUERY_SEGMENTED_DATA_URL, JSON.toJSONString(paramsMap), accessToken); + String resp = HttpUtils.sendPostToken(QUERY_SEGMENTED_DATA_URL, JSON.toJSONString(paramsMap), accessToken); logger.info("获取分段数据的返回值:" + resp); JSONObject jsonObject = JSON.parseObject(resp); List<ElectricityPriceSegmentedDTO> list = jsonObject.getJSONArray("data").toJavaList(ElectricityPriceSegmentedDTO.class); @@ -132,4 +132,5 @@ cipher.init(Cipher.ENCRYPT_MODE, publicKey); return Base64.getEncoder().encodeToString(cipher.doFinal(data.getBytes())); } + } diff --git a/shasteel-biz/src/main/java/com/iailab/module/shasteel/mq/consumer/ModelAlarmConsumer.java b/shasteel-biz/src/main/java/com/iailab/module/shasteel/mq/consumer/ModelAlarmConsumer.java index cfb4427..7713b57 100644 --- a/shasteel-biz/src/main/java/com/iailab/module/shasteel/mq/consumer/ModelAlarmConsumer.java +++ b/shasteel-biz/src/main/java/com/iailab/module/shasteel/mq/consumer/ModelAlarmConsumer.java @@ -1,5 +1,6 @@ package com.iailab.module.shasteel.mq.consumer; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.iailab.framework.common.util.date.DateUtils; import com.iailab.module.model.api.mcs.McsApi; @@ -21,6 +22,7 @@ import org.springframework.util.CollectionUtils; import javax.annotation.Resource; +import java.math.BigDecimal; import java.util.*; /** @@ -42,16 +44,25 @@ private static String lastRunGasSchedule = ""; - // 最早调度时间 - private static Date earliestScheduleTime = null; + /** + * 煤气调度调整方向 + * 1:调整值为正数;-1:调整值为负数 + */ + private static Map<String, Integer> gasAdjustMode = new HashMap<>(); /** - * 监听报警信息,执行调度 + * 煤气调度建议时间 + */ + private static Map<String, Date> gasLastSugTime = new HashMap<>(); + + /** + * 监听报警信息,执行煤气调度 * * @param message */ @RabbitListener(queues = QueueModelAlarmConfig.QUEUE_NAME) public void listen(Message message) { + log.info("监听报警信息,执行煤气调度"); String routingKey = message.getMessageProperties().getReceivedRoutingKey(); log.info("routingKey:" + routingKey); String messageBody = new String(message.getBody()); @@ -65,29 +76,36 @@ log.info("过滤旧消息"); return; } - - // 判断predictTime 是否大于outTime,否则不执行调度 - if (earliestScheduleTime != null && predictTime.compareTo(earliestScheduleTime) < 0) { + if (!ModelPredictFinishConsumer.finishModuleMap.containsKey(predictTime.getTime())) { + log.info("finishModuleMap not containsKey:" + predictTime.getTime()); return; } + List<String> finishModuleList = ModelPredictFinishConsumer.finishModuleMap.get(predictTime.getTime()); + if (CollectionUtils.isEmpty(finishModuleList)) { + log.info("finishModuleList is empty"); + return; + } + if (!finishModuleList.contains(CommonConstant.NET_BFG) || !finishModuleList.contains(CommonConstant.NET_COG) || + !finishModuleList.contains(CommonConstant.NET_LDG)) { + log.info("finishModuleList:" + JSONArray.toJSONString(finishModuleList)); + log.info("等待全部预测完成"); + return; + } + log.info("已全部预测完成,清空finishModuleMap"); + ModelPredictFinishConsumer.finishModuleMap.clear(); - List<AlarmMessageRespDTO> alarmList = JSONObject.parseArray(messageJson.get("alarmList").toString(),AlarmMessageRespDTO.class); - // 取出最小outTime - Date minOutTime = alarmList.stream().filter(e -> e.getOutTime() != null).map(AlarmMessageRespDTO::getOutTime).min(Date::compareTo).get(); - earliestScheduleTime = minOutTime; - - - // 查找需要执行的调度方案 + log.info("查找需要执行的调度方案"); List<StScheduleSchemeDTO> scheduleSchemeList = mcsApi.listScheduleScheme(ScheduleTriggerMethodEnum.EVENT.getCode(), routingKey); if (CollectionUtils.isEmpty(scheduleSchemeList)) { log.info("routingKey:" + routingKey + ",调度方案为空。"); return; } for (StScheduleSchemeDTO stScheduleSchemeDTO : scheduleSchemeList) { - String runKey = "GasSchedule_" + stScheduleSchemeDTO.getCode() + "_" + predictTime.getTime(); + String runKey = "GasSchedule_" + stScheduleSchemeDTO.getCode() + "_" + predictTime.getTime(); log.info("runKey:" + runKey); log.info("lastRunGasSchedule:" + lastRunGasSchedule); if (lastRunGasSchedule.equals(runKey)) { + log.info("lastRunGasSchedule:" + lastRunGasSchedule + "已执行完成"); continue; } lastRunGasSchedule = runKey; @@ -114,11 +132,11 @@ mdkApi.scheduleModelOut(mdkScheduleRespDTO); // 保存调度建议 - saveScheduleSuggest("高炉煤气", result.get("adviceBFG"), "BFG", predictTime); - saveScheduleSuggest("焦炉煤气", result.get("adviceCOG"), "COG", predictTime); - saveScheduleSuggest("转炉5W+8W煤气柜", result.get("adviceLDG13W"), "LDG1", predictTime); - saveScheduleSuggest("宏发12W煤气柜", result.get("adviceLDG12W"), "LDG2", predictTime); - saveScheduleSuggest("转炉特钢煤气柜", result.get("adviceLDG12WT"), "LDGt", predictTime); + saveScheduleSuggest("高炉煤气", result.get("adviceBFG"), "BFG", predictTime, result.get("adjustValueBFG"), stScheduleSchemeDTO.getAdjustRate()); + saveScheduleSuggest("焦炉煤气", result.get("adviceCOG"), "COG", predictTime, result.get("adjustValueCOG"), stScheduleSchemeDTO.getAdjustRate()); + saveScheduleSuggest("转炉5W+8W煤气柜", result.get("adviceLDG13W"), "LDG1", predictTime, result.get("adjustValueLDG13W"), stScheduleSchemeDTO.getAdjustRate()); + saveScheduleSuggest("宏发12W煤气柜", result.get("adviceLDG12W"), "LDG2", predictTime, result.get("adjustValueLDG12W"), stScheduleSchemeDTO.getAdjustRate()); + saveScheduleSuggest("转炉特钢煤气柜", result.get("adviceLDG12WT"), "LDGt", predictTime, result.get("adjustValueLDG12WT"), stScheduleSchemeDTO.getAdjustRate()); // 模拟调整 MdkPredictSimAdjustReqDTO simAdjustReqDTO = new MdkPredictSimAdjustReqDTO(); @@ -128,7 +146,7 @@ Boolean simAdjustFlag = mdkApi.predictSimAdjust(simAdjustReqDTO); if (simAdjustFlag) { log.info("模拟调整成功,ScheduleCode:" + CommonConstant.GAS_MODEL_CODE); - }else { + } else { log.error("模拟调整失败,simAdjustReqDTO:" + simAdjustReqDTO); } @@ -220,14 +238,91 @@ } } - private void saveScheduleSuggest(String title, Object content, String scheduleObj, Date scheduleTime) { + /** + * 建议保持逻辑 + * <p> + * <p> + * BFG建议: + * 若触发第一条: + * 当前BFG建议 = adviceBFG + * 若后续BFG建议出现时间与当前BFG建议相差15分钟之内: + * 所后续BFG建议方向与当前BFG建议方向相反: + * 当前建议 = 后续BFG建议 + * 若不是: + * 当前建议保持不变 + * 若不是则: + * 当前建议 = 后续BFG建议 + * <p> + * COG建议: + * 若触发第一条: + * 当前COG建议 = adviceCOG + * 若后续COG建议出现时间与当前COG建议相差15分钟之内: + * 所后续COG建议方向与当前COG建议方向相反: + * 当前建议 = 后续COG建议 + * 若不是: + * 当前建议保持不变 + * 若不是则: + * 当前建议 = 后续COG建议 + * <p> + * LDG13W建议: + * 若触发第一条: + * 当前LDG13W建议 = adviceLDG13W + * 若后续LDG13W建议出现时间与当前LDG13W建议相差15分钟之内: + * 所后续LDG13W建议方向与当前LDG13W建议方向相反: + * 当前建议 = 后续LDG13W建议 + * 若不是: + * 当前建议保持不变 + * 若不是则: + * 当前建议 = 后续LDG13W建议 + * <p> + * LDG12W建议: + * 若触发第一条: + * 当前LDG12W建议 = adviceLDG12W + * 若后续LDG12W建议出现时间与当前LDG12W建议相差15分钟之内: + * 所后续LDG12W建议方向与当前LDG12W建议方向相反: + * 当前建议 = 后续LDG12W建议 + * 若不是: + * 当前建议保持不变 + * 若不是则: + * 当前建议 = 后续LDG12W建议 + * <p> + * 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())) { log.info(title + "content为空"); return; } + if (adjustObj == null || StringUtils.isBlank(adjustObj.toString()) || "0".equals(adjustObj.toString())) { + log.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)) { + log.info("调整建议在有效期内"); + 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); diff --git a/shasteel-biz/src/main/java/com/iailab/module/shasteel/mq/consumer/ModelPredictFinishConsumer.java b/shasteel-biz/src/main/java/com/iailab/module/shasteel/mq/consumer/ModelPredictFinishConsumer.java index 4f41447..c6c647b 100644 --- a/shasteel-biz/src/main/java/com/iailab/module/shasteel/mq/consumer/ModelPredictFinishConsumer.java +++ b/shasteel-biz/src/main/java/com/iailab/module/shasteel/mq/consumer/ModelPredictFinishConsumer.java @@ -1,5 +1,6 @@ package com.iailab.module.shasteel.mq.consumer; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.iailab.framework.common.util.date.DateUtils; import com.iailab.module.model.api.mcs.McsApi; @@ -19,6 +20,7 @@ import javax.annotation.Resource; import java.math.BigDecimal; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; /** @@ -39,7 +41,9 @@ @Resource private RabbitTemplate rabbitTemplate; - private static String lastRunAlarm = ""; + private static Map<String, Long> lastRunTime = new ConcurrentHashMap<>(); + + public static Map<Long, List<String>> finishModuleMap = new ConcurrentHashMap<>(); /** * 监听预测完成,产生预警消息 @@ -59,27 +63,39 @@ } // 预测时间 Date predictTime = DateUtils.parse(messageJson.get("predictTime").toString(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND); - // 预测模块/预测管网 + // 预测管网 String moduleType = messageJson.get("moduleType").toString(); - if (moduleType.equals(CommonConstant.NET_BFG) || moduleType.equals(CommonConstant.NET_COG) || moduleType.equals(CommonConstant.NET_LDG1) || moduleType.equals(CommonConstant.NET_LDG2) || moduleType.equals(CommonConstant.NET_LDG3)) { - String runKey = "GasAlarm_" + predictTime.getTime(); - log.info("runKey:" + runKey); - log.info("lastRunAlarm:" + lastRunAlarm); - if (lastRunAlarm.equals(runKey)) { + if (!finishModuleMap.containsKey(predictTime.getTime())) { + List<String> mList = new ArrayList<>(); + finishModuleMap.put(predictTime.getTime(), mList); + } + finishModuleMap.get(predictTime.getTime()).add(moduleType); + log.info("finishModuleMap:" + JSONObject.toJSONString(finishModuleMap)); + + if (moduleType.equals(CommonConstant.NET_BFG) || moduleType.equals(CommonConstant.NET_COG) || + moduleType.equals(CommonConstant.NET_LDG) || + moduleType.equals(CommonConstant.NET_LDG1) || + moduleType.equals(CommonConstant.NET_LDG2) || + moduleType.equals(CommonConstant.NET_LDG3)) { + log.info("moduleType:" + moduleType); + if (lastRunTime.containsKey(moduleType) && lastRunTime.get(moduleType) == predictTime.getTime()) { + log.info("moduleType return"); return; } - lastRunAlarm = runKey; - - // 预警信息列表 - List<AlarmMessageRespDTO> alarmList = new ArrayList<>(); - // 根据管网查询相关预警配置 - Map<String,Object> params = new HashMap<>(); - params.put("alarmObj",moduleType); + lastRunTime.put(moduleType, predictTime.getTime()); + log.info("lastRunTime=" + JSONObject.toJSONString(lastRunTime)); + log.info("开始处理预警"); + Map<String, Object> params = new HashMap<>(); + params.put("alarmObj", moduleType); List<AlarmConfigRespDTO> configList = mcsApi.listAlarmConfig(params); if (CollectionUtils.isEmpty(configList)) { log.info("AlarmConfigList is empty"); return; } + log.info("configList=" + JSONArray.toJSONString(configList)); + + // 预警信息列表 + List<AlarmMessageRespDTO> alarmList = new ArrayList<>(); List<String> outputIdList = configList.stream().map(item -> { return item.getOutId(); }).collect(Collectors.toList()); @@ -94,11 +110,12 @@ } outerLoop: for (AlarmConfigRespDTO configItem : configList) { - log.info("configItem: " + configItem); + log.info("AlarmConfigItem: " + configItem); List<Object[]> result = preData.get(configItem.getOutId()); if (CollectionUtils.isEmpty(result)) { continue; } + log.info("AlarmPreData: " + JSONArray.toJSONString(result)); // 对比预测值是否超限 int toIndex = result.size(); @@ -109,6 +126,7 @@ if (dataValue.compareTo(configItem.getLowerLimit()) >= 0 && dataValue.compareTo(configItem.getUpperLimit()) <= 0) { continue; } + log.info("AlarmOutValue: " + dataValue); // 预警记录 AlarmMessageRespDTO alarmMessage = new AlarmMessageRespDTO(); alarmMessage.setConfigId(configItem.getId()); @@ -124,7 +142,7 @@ content.append(","); content.append("即将"); if (dataValue.compareTo(configItem.getLowerLimit()) < 0) { - content.append("低与下限"); + content.append("低于下限"); alarmMessage.setAlarmType(CommonConstant.EXCEEDING_LOWER_LIMIT); } else if (dataValue.compareTo(configItem.getUpperLimit()) > 0) { @@ -176,17 +194,19 @@ } } - if (!CollectionUtils.isEmpty(alarmList)) { - log.info("发送预警消息"); - Map<String, Object> msg = new HashMap<>(2); - msg.put("predictTime", DateUtils.format(predictTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)); - msg.put("alarmList", alarmList); - rabbitTemplate.convertAndSend(RoutingConstant.EXCHANGE, RoutingConstant.Iailab_Model_Alarm, msg); + if (CollectionUtils.isEmpty(alarmList)) { + log.info("alarmList is empty"); + return; } + log.info("发送预警消息"); + Map<String, Object> msg = new HashMap<>(2); + msg.put("predictTime", DateUtils.format(predictTime, DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)); + msg.put("alarmList", alarmList); + msg.put("moduleType", moduleType); + rabbitTemplate.convertAndSend(RoutingConstant.EXCHANGE, RoutingConstant.Iailab_Model_Alarm, msg); } } catch (Exception e) { e.printStackTrace(); } - } } \ No newline at end of file -- Gitblit v1.9.3