shasteel-biz/src/main/java/com/iailab/module/shasteel/mq/common/constant/CommonConstant.java
@@ -1,8 +1,5 @@ package com.iailab.module.shasteel.mq.common.constant; import java.math.BigDecimal; /** * @Description: 通用常量 */ @@ -31,4 +28,22 @@ //电力管网触发条件 String TRIGGER_CONDITION_ELEC = "NET_ELE"; String NET_COG = "NET_COG"; String NET_BFG = "NET_BFG"; String NET_ELE = "NET_ELE"; String NET_O2 = "NET_O2"; String NET_LDG = "NET_LDG"; String NET_STEAM = "NET_STEAM"; String NET_N2 = "NET_N2"; String NET_TEST = "NET_TEST"; String NET_GAS = "NET_GAS"; } shasteel-biz/src/main/java/com/iailab/module/shasteel/mq/consumer/ModelAlarmConsumer.java
@@ -40,10 +40,7 @@ @Resource private MdkApi mdkApi; /** * 事件标识 */ private final String EVENT_FLAG = "GasAlarm"; private static String lastRunGasSchedule = ""; /** * 监听报警信息,执行调度 @@ -61,16 +58,31 @@ return; } Date predictTime = DateUtils.parse(messageJson.get("predictTime").toString(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND); if (new Date().getTime() - predictTime.getTime() > 1000 * 60 * 3) { log.info("过滤旧消息"); return; } // 查找需要执行的调度方案 List<StScheduleSchemeDTO> scheduleSchemeList = mcsApi.listScheduleScheme(ScheduleTriggerMethodEnum.EVENT.getCode(), routingKey); for(StScheduleSchemeDTO stScheduleSchemeDTO : scheduleSchemeList){ if (CollectionUtils.isEmpty(scheduleSchemeList)) { log.info("routingKey:" + routingKey + ",调度方案为空。"); return; } for (StScheduleSchemeDTO stScheduleSchemeDTO : scheduleSchemeList) { String runKey = "GasSchedule_" + stScheduleSchemeDTO.getCode() + "_" + predictTime.getTime(); log.info("runKey:" + runKey); log.info("lastRunGasSchedule:" + lastRunGasSchedule); if (lastRunGasSchedule.equals(runKey)) { continue; } lastRunGasSchedule = runKey; MdkScheduleReqDTO mdkScheduleReqDTO = new MdkScheduleReqDTO(); mdkScheduleReqDTO.setScheduleCode(stScheduleSchemeDTO.getCode()); mdkScheduleReqDTO.setScheduleTime(stScheduleSchemeDTO.getScheduleTime()); //执行调度方案 MdkScheduleRespDTO mdkScheduleRespDTO = mdkApi.doSchedule(mdkScheduleReqDTO); if(mdkScheduleRespDTO == null){ if (mdkScheduleRespDTO == null) { return; } Map<String, Object> result = mdkScheduleRespDTO.getResult(); @@ -86,8 +98,8 @@ mdkApi.scheduleModelOut(mdkScheduleRespDTO); break; case CommonConstant.OXYGEN_ONE_CODE: if(!result.containsKey("faAdvice") || !result.containsKey("yingDiAdvice") || !result.containsKey("yingZhongAdvice") || !result.containsKey("hongAdvice") || !result.containsKey("RunAdvice")){ if (!result.containsKey("faAdvice") || !result.containsKey("yingDiAdvice") || !result.containsKey("yingZhongAdvice") || !result.containsKey("hongAdvice") || !result.containsKey("RunAdvice")) { return; } for (String key : result.keySet()) { @@ -98,28 +110,28 @@ suggestRespDTO.setContent(result.get("faAdvice").toString());//法夜空建议送出量建议 suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId()); mcsApi.createScheduleSuggest(suggestRespDTO); }else if ("yingDiAdvice".equals(key) && !"".equals(result.get("yingDiAdvice").toString())) { } else if ("yingDiAdvice".equals(key) && !"".equals(result.get("yingDiAdvice").toString())) { ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO(); suggestRespDTO.setId(UUID.randomUUID().toString()); suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj()); suggestRespDTO.setContent(result.get("yingDiAdvice").toString());//盈德低压建议送出量建议 suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId()); mcsApi.createScheduleSuggest(suggestRespDTO); }else if ("yingZhongAdvice".equals(key) && !"".equals(result.get("yingZhongAdvice").toString())) { } else if ("yingZhongAdvice".equals(key) && !"".equals(result.get("yingZhongAdvice").toString())) { ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO(); suggestRespDTO.setId(UUID.randomUUID().toString()); suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj()); suggestRespDTO.setContent(result.get("yingZhongAdvice").toString());//盈德中压建议送出量建议 suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId()); mcsApi.createScheduleSuggest(suggestRespDTO); }else if ("hongAdvice".equals(key) && !"".equals(result.get("hongAdvice").toString())) { } else if ("hongAdvice".equals(key) && !"".equals(result.get("hongAdvice").toString())) { ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO(); suggestRespDTO.setId(UUID.randomUUID().toString()); suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj()); suggestRespDTO.setContent(result.get("hongAdvice").toString());//宏昌建议送出量建议 suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId()); mcsApi.createScheduleSuggest(suggestRespDTO); }else if ("RunAdvice".equals(key) && !"".equals(result.get("RunAdvice").toString())) { } else if ("RunAdvice".equals(key) && !"".equals(result.get("RunAdvice").toString())) { ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO(); suggestRespDTO.setId(UUID.randomUUID().toString()); suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj()); @@ -130,8 +142,8 @@ } break; case CommonConstant.OXYGEN_TWO_CODE://氧气系统优化调度决策方案 if(!result.containsKey("yingdiAdvice") || !result.containsKey("faAdvice") || !result.containsKey("hongAdvice") || !result.containsKey("RunAdvice")){ if (!result.containsKey("yingdiAdvice") || !result.containsKey("faAdvice") || !result.containsKey("hongAdvice") || !result.containsKey("RunAdvice")) { return; } for (String key : result.keySet()) { @@ -142,21 +154,21 @@ suggestRespDTO.setContent(result.get("yingdiAdvice").toString());//盈德中压建议调整量建议 suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId()); mcsApi.createScheduleSuggest(suggestRespDTO); }else if ("faAdvice".equals(key) && !"".equals(result.get("faAdvice").toString())) { } else if ("faAdvice".equals(key) && !"".equals(result.get("faAdvice").toString())) { ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO(); suggestRespDTO.setId(UUID.randomUUID().toString()); suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj()); suggestRespDTO.setContent(result.get("faAdvice").toString());//法夜空建议调整量建议 suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId()); mcsApi.createScheduleSuggest(suggestRespDTO); }else if ("hongAdvice".equals(key) && !"".equals(result.get("hongAdvice").toString())) { } else if ("hongAdvice".equals(key) && !"".equals(result.get("hongAdvice").toString())) { ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO(); suggestRespDTO.setId(UUID.randomUUID().toString()); suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj()); suggestRespDTO.setContent(result.get("hongAdvice").toString());//宏昌建议调整量建议 suggestRespDTO.setSchemeId(stScheduleSchemeDTO.getId()); mcsApi.createScheduleSuggest(suggestRespDTO); }else if ("RunAdvice".equals(key) && !"".equals(result.get("RunAdvice").toString())) { } else if ("RunAdvice".equals(key) && !"".equals(result.get("RunAdvice").toString())) { ScheduleSuggestRespDTO suggestRespDTO = new ScheduleSuggestRespDTO(); suggestRespDTO.setId(UUID.randomUUID().toString()); suggestRespDTO.setScheduleObj(stScheduleSchemeDTO.getScheduleObj()); shasteel-biz/src/main/java/com/iailab/module/shasteel/mq/consumer/ModelPredictFinishConsumer.java
@@ -39,6 +39,8 @@ @Resource private RabbitTemplate rabbitTemplate; private static String lastRunAlarm = ""; /** * 监听预测完成,产生预警消息 * @@ -55,8 +57,10 @@ if (CollectionUtils.isEmpty(messageJson)) { return; } // 预测时间 Date predictTime = DateUtils.parse(messageJson.get("predictTime").toString(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND); // 预测模块/预测管网 String moduleType = messageJson.get("moduleType").toString(); // 查询相关预警配置 List<AlarmConfigRespDTO> configList = mcsApi.listAlarmConfig(new HashMap<String, Object>()); if (CollectionUtils.isEmpty(configList)) { @@ -66,87 +70,95 @@ 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(predictTime); reqVO.setOutputIdList(outputIdList); Map<String, List<Object[]>> preData = mcsApi.getPreDataCur(reqVO); if (CollectionUtils.isEmpty(preData)) { if (moduleType.equals(CommonConstant.NET_BFG) || moduleType.equals(CommonConstant.NET_COG) || moduleType.equals(CommonConstant.NET_LDG)) { String runKey = "GasAlarm_" + predictTime.getTime(); log.info("runKey:" + runKey); log.info("lastRunAlarm:" + lastRunAlarm); if (lastRunAlarm.equals(runKey)) { 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)); }); 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)); }); 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(); 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(configItem.getLowerLimit()) >= 0 && dataValue.compareTo(configItem.getUpperLimit()) <= 0) { log.info("预测值不超限"); List<Object[]> result = preData.get(configItem.getOutId()); if (CollectionUtils.isEmpty(result)) { 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); // 累计值 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); } else if (dataValue.compareTo(configItem.getUpperLimit()) > 0) { content.append("超出上限"); // 生成预警信息 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(); 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; } alarmMessage.setContent(content.toString()); mcsApi.createAlarmMessage(alarmMessage); alarmList.add(alarmMessage); 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(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); } } } if (!CollectionUtils.isEmpty(alarmList)) {