From e6b9276f3b1317070be0fe641ebc81cc38b459b4 Mon Sep 17 00:00:00 2001 From: dengzedong <dengzedong@email> Date: 星期二, 18 二月 2025 10:23:09 +0800 Subject: [PATCH] 预警判断 累计超限逻辑修改,累计记录超限时间,设置最早调度时间 --- shasteel-biz/src/main/java/com/iailab/module/shasteel/mq/consumer/ModelAlarmConsumer.java | 15 ++++ shasteel-biz/src/main/java/com/iailab/module/shasteel/mq/consumer/ModelPredictFinishConsumer.java | 109 ++++++++++++++++++++---------------- 2 files changed, 75 insertions(+), 49 deletions(-) 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 c4b608d..232af5a 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,6 +1,5 @@ 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; @@ -42,6 +41,9 @@ private static String lastRunGasSchedule = ""; + // 最早调度时间 + private static Date earliestScheduleTime = null; + /** * 监听报警信息,执行调度 * @@ -63,6 +65,17 @@ return; } + // 判断predictTime 是否大于outTime,否则不执行调度 + if (earliestScheduleTime != null && predictTime.compareTo(earliestScheduleTime) < 0) { + return; + } + + 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; + + // 查找需要执行的调度方案 List<StScheduleSchemeDTO> scheduleSchemeList = mcsApi.listScheduleScheme(ScheduleTriggerMethodEnum.EVENT.getCode(), routingKey); if (CollectionUtils.isEmpty(scheduleSchemeList)) { 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 bc5631a..8e890a1 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 @@ -80,59 +80,23 @@ return; } lastRunAlarm = runKey; - for (AlarmConfigRespDTO configItem : configList) { - PreDataJsonReqVO reqVO = new PreDataJsonReqVO(); - reqVO.setPredictTime(predictTime); - reqVO.setOutputIdList(outputIdList); - Map<String, List<Object[]>> preData = mcsApi.getPreDataCur(reqVO); - if (CollectionUtils.isEmpty(preData)) { - 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)); - }); + // 查询预测结果 + PreDataJsonReqVO reqVO = new PreDataJsonReqVO(); + reqVO.setPredictTime(predictTime); + reqVO.setOutputIdList(outputIdList); + Map<String, List<Object[]>> preData = mcsApi.getPreDataCur(reqVO); + if (CollectionUtils.isEmpty(preData)) { + return; + } + outerLoop: + for (AlarmConfigRespDTO configItem : configList) { List<Object[]> result = preData.get(configItem.getOutId()); if (CollectionUtils.isEmpty(result)) { continue; } - // 累计值 - 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()); - alarmMessage.setTitle(configItem.getTitle()); - alarmMessage.setAlarmObj(configItem.getAlarmObj()); - alarmMessage.setAlarmTime(predictTime); - log.info("对比累计值是否超限"); - StringBuilder content = new StringBuilder(); - content.append(configItem.getTitle().replace("预警", "")); - 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); @@ -142,7 +106,17 @@ log.info("预测值不超限"); continue; } + // 预警记录 + AlarmMessageRespDTO alarmMessage = new AlarmMessageRespDTO(); + alarmMessage.setConfigId(configItem.getId()); + alarmMessage.setTitle(configItem.getTitle()); + alarmMessage.setAlarmObj(configItem.getAlarmObj()); + alarmMessage.setAlarmTime(predictTime); + // 设置超出时间 alarmMessage.setOutTime(DateUtils.parse(data[0].toString(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)); + // 预警消息 + StringBuilder content = new StringBuilder(); + content.append(configItem.getTitle().replace("预警", "")); content.append(DateUtils.format(alarmMessage.getOutTime(), DateUtils.FORMAT_SIMPLE_TIME)); content.append(","); content.append("即将"); @@ -157,7 +131,46 @@ alarmMessage.setContent(content.toString()); mcsApi.createAlarmMessage(alarmMessage); alarmList.add(alarmMessage); - break; + continue outerLoop; + } + + // 对比累计值是否超限 + if (configItem.getCulUpper() != null && configItem.getCulLower() != null) { + Double culValue = Double.valueOf(0.0); + for (Object[] data : result) { + culValue += Double.parseDouble(data[1].toString()); + if (culValue.compareTo(configItem.getCulLower().doubleValue()) >= 0 && culValue.compareTo(configItem.getCulUpper().doubleValue()) <= 0) { + log.info("累计值不超限"); + continue; + } + + // 生成预警信息 + AlarmMessageRespDTO alarmMessage = new AlarmMessageRespDTO(); + alarmMessage.setConfigId(configItem.getId()); + alarmMessage.setTitle(configItem.getTitle()); + alarmMessage.setAlarmObj(configItem.getAlarmObj()); + alarmMessage.setAlarmTime(predictTime); + // 设置超出时间 + alarmMessage.setOutTime(DateUtils.parse(data[0].toString(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)); + StringBuilder content = new StringBuilder(); + content.append(configItem.getTitle().replace("预警", "")); + content.append(DateUtils.format(alarmMessage.getOutTime(), DateUtils.FORMAT_SIMPLE_TIME)); + content.append(","); + content.append("即将"); + + if (culValue.compareTo(configItem.getCulUpper().doubleValue()) > 0) { + content.append("超出累计值上限"); + alarmMessage.setAlarmType(CommonConstant.EXCEEDING_UPPER_LIMIT); + } + if (culValue.compareTo(configItem.getCulLower().doubleValue()) < 0) { + content.append("低于累计值下限"); + alarmMessage.setAlarmType(CommonConstant.EXCEEDING_LOWER_LIMIT); + } + alarmMessage.setContent(content.toString()); + mcsApi.createAlarmMessage(alarmMessage); + alarmList.add(alarmMessage); + continue outerLoop; + } } } } -- Gitblit v1.9.3