From 35c07e7afeccebecf38d9d2cb2c1559cdbf63ff0 Mon Sep 17 00:00:00 2001 From: 潘志宝 <979469083@qq.com> Date: 星期一, 20 一月 2025 17:55:11 +0800 Subject: [PATCH] 预测消息 --- shasteel-biz/src/main/java/com/iailab/module/shasteel/job/task/RunScheduleSteamTask.java | 2 shasteel-biz/src/main/java/com/iailab/module/shasteel/mq/consumer/ModelPredictFinishConsumer.java | 126 ++++++++++++++++++++++++++++-------------- shasteel-biz/src/main/java/com/iailab/module/shasteel/mq/common/constant/CommonConstant.java | 4 3 files changed, 88 insertions(+), 44 deletions(-) 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 aca64a9..57d20aa 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 @@ -22,6 +22,8 @@ /** * 蒸汽调度 + * 定时触发 + * 30 0/2 * * * ? * * 参考点压力信号 pressure_flag * 锦丰调度建议 jinfengAdvice diff --git a/shasteel-biz/src/main/java/com/iailab/module/shasteel/mq/common/constant/CommonConstant.java b/shasteel-biz/src/main/java/com/iailab/module/shasteel/mq/common/constant/CommonConstant.java index 025a4de..25ca993 100644 --- a/shasteel-biz/src/main/java/com/iailab/module/shasteel/mq/common/constant/CommonConstant.java +++ b/shasteel-biz/src/main/java/com/iailab/module/shasteel/mq/common/constant/CommonConstant.java @@ -21,10 +21,10 @@ String OXYGEN_TWO_CODE = "oxygen02"; //超上限 - String EXCEEDING_UPPER_LIMIT = "UpperLimit"; + String EXCEEDING_UPPER_LIMIT = "超上限"; //超下限 - String EXCEEDING_LOWER_LIMIT = "LowerLimit"; + String EXCEEDING_LOWER_LIMIT = "超下限"; //电力管网触发条件 String TRIGGER_CONDITION_ELEC = "NET_ELE"; 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 802d502..0deb39e 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 @@ -18,13 +18,12 @@ import javax.annotation.Resource; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; /** * 监听预测完成 + * 根据预警配置产生预警信息 * * @author PanZhibao * @Description @@ -56,61 +55,104 @@ if (CollectionUtils.isEmpty(messageJson)) { return; } + Date predictTime = DateUtils.parse(messageJson.get("predictTime").toString(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND); + + + // 查询相关预警配置 List<AlarmConfigRespDTO> configList = mcsApi.listAlarmConfig(new HashMap<String, Object>()); if (CollectionUtils.isEmpty(configList)) { + log.info("AlarmConfigList is empty"); return; } - List<String> outputIdList = new ArrayList<>(); - configList.forEach(item -> { - outputIdList.add(item.getOutId()); - }); - configList.forEach(item -> { + List<String> outputIdList = configList.stream().map(item -> { + return item.getOutId(); + }).collect(Collectors.toList()); + + List<AlarmMessageRespDTO> alarmList = new ArrayList<>(); + for (AlarmConfigRespDTO configItem : configList) { PreDataJsonReqVO reqVO = new PreDataJsonReqVO(); - reqVO.setPredictTime(DateUtils.parse(messageJson.get("predictTime").toString(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)); + reqVO.setPredictTime(predictTime); reqVO.setOutputIdList(outputIdList); Map<String, List<Object[]>> preData = mcsApi.getPreDataCur(reqVO); if (CollectionUtils.isEmpty(preData)) { return; } - List<Object[]> result = preData.get(item.getOutId()); - int toIndex = result.size(); - if (toIndex <= 0) { - return; + Map<String, BigDecimal> culData = new HashMap<>(); + preData.forEach((key, value) -> { + double nv = value.stream().map(v1 -> { + return Double.parseDouble(v1[1].toString()); + }).collect(Collectors.toList()).stream().mapToDouble(Double::doubleValue).sum(); + culData.put(key, new BigDecimal(nv)); + }); + + + List<Object[]> result = preData.get(configItem.getOutId()); + if (CollectionUtils.isEmpty(result)) { + continue; } - int fromIndex = result.size() - item.getCompLength(); + // 累计值 + BigDecimal culValue = new BigDecimal(result.stream().map(v1 -> { + return Double.parseDouble(v1[1].toString()); + }).collect(Collectors.toList()).stream().mapToDouble(Double::doubleValue).sum()); + log.info("culValue:" + culValue); + + + // 生成预警信息 + AlarmMessageRespDTO alarmMessage = new AlarmMessageRespDTO(); + alarmMessage.setConfigId(configItem.getId()); + log.info("对比累计值是否超限"); + StringBuilder content = new StringBuilder(); + if (configItem.getCulUpper() != null && culValue.compareTo(configItem.getCulUpper()) > 0) { + content.append("即将超出累计值上限"); + alarmMessage.setAlarmType(CommonConstant.EXCEEDING_UPPER_LIMIT); + alarmMessage.setContent(content.toString()); + mcsApi.createAlarmMessage(alarmMessage); + alarmList.add(alarmMessage); + continue; + } + if (configItem.getCulLower() != null && culValue.compareTo(configItem.getCulLower()) < 0) { + content.append("即将低于累计值上限"); + alarmMessage.setAlarmType(CommonConstant.EXCEEDING_LOWER_LIMIT); + alarmMessage.setContent(content.toString()); + mcsApi.createAlarmMessage(alarmMessage); + alarmList.add(alarmMessage); + continue; + } + + + log.info("对比预测值是否超限"); + int toIndex = result.size(); + int fromIndex = result.size() - configItem.getCompLength(); List<Object[]> predictList = result.subList(fromIndex, toIndex); for (Object[] data : predictList) { BigDecimal dataValue = new BigDecimal(Double.parseDouble(data[1].toString())).setScale(2, BigDecimal.ROUND_HALF_UP); - if (!(dataValue.compareTo(item.getLowerLimit()) >= 0 && dataValue.compareTo(item.getUpperLimit()) <= 0)) { - AlarmMessageRespDTO alarmMessage = new AlarmMessageRespDTO(); - alarmMessage.setConfigId(item.getId()); - if (dataValue.compareTo(item.getLowerLimit()) < 0) { - alarmMessage.setAlarmType(CommonConstant.EXCEEDING_LOWER_LIMIT);//超下限 - } else if (dataValue.compareTo(item.getUpperLimit()) > 0) { - alarmMessage.setAlarmType(CommonConstant.EXCEEDING_UPPER_LIMIT);//超上限 - } - alarmMessage.setAlarmTime(DateUtils.parse(data[0].toString(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)); - StringBuffer sb = new StringBuffer(); - sb.append(data[0]); - sb.append(" "); - sb.append(item.getAlarmObj()); - if ("1".equals(alarmMessage.getAlarmType())) { - sb.append(CommonConstant.EXCEEDING_LOWER_LIMIT); - } else if ("2".equals(alarmMessage.getAlarmType())) { - sb.append(CommonConstant.EXCEEDING_UPPER_LIMIT); - } - sb.append(dataValue); - sb.append(item.getUnit()); - alarmMessage.setContent(sb.toString()); - System.out.println("预警消息=" + alarmMessage); - rabbitTemplate.convertAndSend(RoutingConstant.EXCHANGE, RoutingConstant.Iailab_Model_Alarm, alarmMessage); - break; + if (dataValue.compareTo(configItem.getLowerLimit()) >= 0 && dataValue.compareTo(configItem.getUpperLimit()) <= 0) { + log.info("预测值不超限"); + continue; } + alarmMessage.setOutTime(DateUtils.parse(data[0].toString(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)); + content.append(DateUtils.format(alarmMessage.getOutTime(), DateUtils.FORMAT_SIMPLE_TIME)); + content.append(","); + content.append("即将"); + if (dataValue.compareTo(configItem.getLowerLimit()) < 0) { + content.append("低与下限"); + alarmMessage.setAlarmType(CommonConstant.EXCEEDING_LOWER_LIMIT); + + } else if (dataValue.compareTo(configItem.getUpperLimit()) > 0) { + content.append("超出上限"); + alarmMessage.setAlarmType(CommonConstant.EXCEEDING_UPPER_LIMIT); + } + alarmMessage.setContent(content.toString()); + mcsApi.createAlarmMessage(alarmMessage); + alarmList.add(alarmMessage); } - System.out.println(preData); - }); + } + if (!CollectionUtils.isEmpty(alarmList)) { + log.info("发送预警消息"); + rabbitTemplate.convertAndSend(RoutingConstant.EXCHANGE, RoutingConstant.Iailab_Model_Alarm, alarmList); + } } catch (Exception e) { - return; + e.printStackTrace(); } } -- Gitblit v1.9.3