From 41763af08022b94fc34e24e9c07bcbfaa8432478 Mon Sep 17 00:00:00 2001 From: xiaoguangbin Date: Wed, 2 Apr 2025 13:55:29 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E5=8F=91=E9=80=81?= =?UTF-8?q?=E9=82=AE=E4=BB=B6=E6=A0=87=E9=A2=98=E5=92=8C=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/jeecg/common/util/TemplateUtil.java | 30 +++- .../jeecg/modules/base/enums/Template.java | 2 +- .../modules/redisStream/AnalysisConsumer.java | 162 ++++++++++++++---- 3 files changed, 162 insertions(+), 32 deletions(-) diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/TemplateUtil.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/TemplateUtil.java index f3fb479b..9a663397 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/TemplateUtil.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/TemplateUtil.java @@ -61,14 +61,42 @@ public class TemplateUtil { for (String key : keys) { contents.add(ReUtil.getGroup1(StrUtil.format(pattern, key), templateContent)); } - String join = StrUtil.SPACE + "#" + StrUtil.SPACE; + String join = StrUtil.SPACE+ "#"+StrUtil.SPACE; templateContent = CollUtil.join(contents, join); String content = FreemarkerParseFactory .parseTemplateContent(templateContent, data, true); messageDTO.setContent(content); + String title = FreemarkerParseFactory.parseTemplateContent(templateName,data); + messageDTO.setTitle(title); return messageDTO; } + public static MessageDTO parse1(String code, Map data,Map stationData){ + MessageDTO messageDTO = new MessageDTO(); + SysMessageTemplate template = templateService.getOne(code); + // 如果没有消息模板 + if(ObjectUtil.isNull(template)) + return messageDTO; + String templateName = template.getTemplateName(); + String templateContent = template.getTemplateContent(); + if (MapUtil.isEmpty(data)) + return messageDTO; + Set keys = data.keySet(); + String pattern = "\\<([^<>]*{}[^<>]*)\\>"; + List contents = new ArrayList<>(); + for (String key : keys) { + contents.add(ReUtil.getGroup1(StrUtil.format(pattern, key), templateContent)); + } + String replaceStr=System.lineSeparator()+StrUtil.SPACE; + String join = replaceStr+ "#"; + templateContent = CollUtil.join(contents, join); + String content = FreemarkerParseFactory + .parseTemplateContent(templateContent, data, true); + messageDTO.setContent(content.replace(":",":"+replaceStr)); + String title = FreemarkerParseFactory.parseTemplateContent(templateName,stationData); + messageDTO.setTitle(title); + return messageDTO; + } public static MessageDTO parse(String title, String code, Map data) { MessageDTO messageDTO = new MessageDTO(); SysMessageTemplate template = templateService.getOne(code); diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/enums/Template.java b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/enums/Template.java index 8e9a5c02..f5a83446 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/enums/Template.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/enums/Template.java @@ -11,7 +11,7 @@ import lombok.Getter; public enum Template { IDC_DATASOURCE_STATUS("IDC_Datasource_Status"), MONITOR_SERVER("Monitor_Server"), MONITOR_EMAIL("Monitor_Email"), - MONITOR_DATABASE("Monitor_Database"), ANALYSIS_NUCLIDE("Analysis_Nuclide"); + MONITOR_DATABASE("Monitor_Database"), ANALYSIS_NUCLIDE("Analysis_Nuclide"),ANALYSIS_NUCLIDE_NAME("Analysis_Nuclide_Name"); private final String code; } diff --git a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/redisStream/AnalysisConsumer.java b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/redisStream/AnalysisConsumer.java index 212a839f..1a6ab066 100644 --- a/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/redisStream/AnalysisConsumer.java +++ b/jeecg-module-abnormal-alarm/src/main/java/org/jeecg/modules/redisStream/AnalysisConsumer.java @@ -8,12 +8,14 @@ import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.google.common.collect.Maps; import lombok.Data; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.poi.hwpf.sprm.SprmIterator; +import org.apache.commons.compress.utils.Lists; import org.jeecg.common.api.dto.message.MessageDTO; import org.jeecg.common.config.mqtoken.UserTokenContext; +import org.jeecg.common.constant.RedisConstant; import org.jeecg.common.constant.SymbolConstant; import org.jeecg.common.constant.enums.SampleType; import org.jeecg.common.util.*; @@ -36,7 +38,7 @@ import org.springframework.stereotype.Component; import static org.jeecg.common.constant.enums.MessageTypeEnum.*; import static org.jeecg.common.util.TokenUtils.getTempToken; -import static org.jeecg.modules.base.enums.Template.ANALYSIS_NUCLIDE; +import static org.jeecg.modules.base.enums.Template.ANALYSIS_NUCLIDE_NAME; import java.math.BigDecimal; import java.time.LocalDate; @@ -59,6 +61,7 @@ public class AnalysisConsumer implements StreamListener nuclides = info.getNuclides(); + Map infoNuclideMap = info.getNuclides(); if (StrUtil.isBlank(stationId)) return; if (StrUtil.isBlank(sampleId)) return; - if (MapUtil.isEmpty(nuclides)) return; + if (MapUtil.isEmpty(infoNuclideMap)) return; List rules = ruleService.allAnalysisRule(); for (AlarmAnalysisRule rule : rules) { @@ -129,14 +132,19 @@ public class AnalysisConsumer implements StreamListener names = nuclides.keySet(); + Set names = infoNuclideMap.keySet(); List follow = ListUtil.toList(nuclidesStr.split(COMMA)); // 因数据库 Xe核素名称 M大小写不统一,先统一大小写再进行比较 - Collection follows = follow.stream().map(f->f.replace("M", "m")).collect(Collectors.toList()); + Collection follows = follow.stream().map(f -> { + if(f.toLowerCase().contains("xe")){ + return f.replace("M", "m"); + } + return f; + }).collect(Collectors.toList()); // 推送过来的核素集合与所关注核素集合取交集 Collection cross = CollectionUtil.intersection(names, follows); if (CollUtil.isEmpty(cross)) continue; - Map nuclidesCross = nuclides.entrySet().stream() + Map nuclidesCross = infoNuclideMap.entrySet().stream() .filter(entry -> cross.contains(entry.getKey())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); // 开始对交集中的核素进行条件判断 @@ -146,7 +154,12 @@ public class AnalysisConsumer implements StreamListener= 1) { - info.setIdentifyNuclideSet(Arrays.stream(inSplit).map(f->f.replace("M", "m")).collect(Collectors.toSet())); + info.setIdentifyNuclideSet(Arrays.stream(inSplit).map(f -> { + if(f.toLowerCase().contains("xe")){ + return f.replace("M", "m"); + } + return f; + }).collect(Collectors.toSet())); } } judge(info, nuclidesCross); @@ -159,6 +172,8 @@ public class AnalysisConsumer implements StreamListener stationMap = (HashMap)redisUtil.get(RedisConstant.STATION_CODE_MAP); String sampleId = info.getSampleId(); String sampleName = info.getSampleName(); Set identifyNuclideSet = info.getIdentifyNuclideSet(); @@ -167,26 +182,27 @@ public class AnalysisConsumer implements StreamListener conditions = ListUtil.toList(conditionStr.split(COMMA)); - List firstDetected = new ArrayList<>(); // 首次发现 + List firstDetected = new ArrayList<>(); // 首次发现 List moreThanAvg = new ArrayList<>(); // 超浓度均值 - List meanWhile = new ArrayList<>(); // 同时出现两种及以上核素 - List identifyNuclideResult = new ArrayList<>(); + List meanWhile = new ArrayList<>(); // 同时出现两种及以上核素 + Map nuclideInfoMap = Maps.newHashMap(); + List identifyNuclideResult = new ArrayList<>(); for (String con : conditions) { Condition condition = Condition.valueOf1(con); if (ObjectUtil.isNull(condition)) continue; switch (condition){ case FIRST_FOUND: // 首次发现该元素 - firstDetected = this.firstDetected(betaOrGamma, datasource, stationId, sampleId, nuclideNames); + firstDetected = this.firstDetected(betaOrGamma, datasource, stationId, sampleId, nuclidesCross); break; case ABOVE_AVERAGE: // 元素浓度高于均值 moreThanAvg = this.moreThanAvg(datasource, stationId, collDate, nuclidesCross); break; case MEANWHILE: // 同时出现两种及以上核素 - meanWhile = this.meanWhile(betaOrGamma, datasource, sampleId, nuclideNames); + meanWhile = this.meanWhile(betaOrGamma, datasource, sampleId, nuclidesCross); if (meanWhile.size() < 2) meanWhile = ListUtil.empty(); break; case IDENTIFY_NUCLIDES: // 识别到某个核素 - identifyNuclideResult = this.meanWhile(betaOrGamma, datasource, sampleId, identifyNuclideSet); + identifyNuclideResult = this.meanWhile(info.getNuclides(), datasource, identifyNuclideSet); break; default: break; @@ -194,24 +210,54 @@ public class AnalysisConsumer implements StreamListener item.getNuclide() + "(" + item.getValue() + ")" + " > " + item.getThreshold()) .collect(Collectors.joining(StrUtil.COMMA + StrUtil.SPACE)); dataTool.put("moreThanAvg", above); + for (NuclideInfo nuclideInfo : moreThanAvg) { + nuclideInfoMap.put(nuclideInfo.getNuclide(), nuclideInfo); + } } - if (CollUtil.isNotEmpty(meanWhile)) - dataTool.put("meanwhile", CollUtil.join(meanWhile, StrUtil.COMMA + StrUtil.SPACE)); - if (CollUtil.isNotEmpty(identifyNuclideResult)) - dataTool.put("identifyNuclide", CollUtil.join(identifyNuclideResult, StrUtil.COMMA + StrUtil.SPACE)); // 如果报警数据为空 则不需要发送报警信息和生成报警日志 if (MapUtil.isEmpty(dataTool.get())) return; // 产生报警信息的Sample信息 + if (CollUtil.isNotEmpty(stationMap)) + { + stationCode=stationMap.get(stationId).toString(); + } dataTool.put("sampleId", sampleId).put("sampleName", sampleName); - // 构建预警信息实例 准备发送预警信息 - MessageDTO messageDTO = TemplateUtil.parse1(ANALYSIS_NUCLIDE.getCode(), dataTool.get()); + DataTool titleData = DataTool.getInstance(); + titleData.put("stationCode",stationCode); + // 构建预警信息实例 准备发送预警信息,20250327--修改模版 + MessageDTO messageDTO = TemplateUtil.parse1(ANALYSIS_NUCLIDE_NAME.getCode(), dataTool.get(),titleData.get()); // 保存报警日志 AlarmAnalysisLog logInfo = new AlarmAnalysisLog(); BeanUtil.copyProperties(info, logInfo); @@ -219,8 +265,13 @@ public class AnalysisConsumer implements StreamListener nuclideInfoList = Lists.newArrayList(); + nuclideInfoMap.forEach((key, value) -> nuclideInfoList.add(nuclideInfoMap.get(key))); + logInfo.setNuclideInfoList(nuclideInfoList); + } logService.saveLog(logInfo); // 发送报警信息 String groupId = info.getGroupId(); @@ -231,8 +282,9 @@ public class AnalysisConsumer implements StreamListener firstDetected(String betaOrGamma, String dataSourceType, - String stationId, String sampleId, Set nuclideNames){ + private List firstDetected(String betaOrGamma, String dataSourceType, + String stationId, String sampleId, Map nuclidesCross){ + List result = Lists.newArrayList(); /* 查询用户关注的核素是否存在 如果不存在则为首次发现该核素 判断核素是否存在的条件: 该核素的Conc值是否大于MDC值 */ @@ -240,8 +292,22 @@ public class AnalysisConsumer implements StreamListener nuclideNames = nuclidesCross.keySet(); + List list = analysisResultService.nuclideFirst(betaOrGamma, dataSourceType, stationId, detectorId, sampleId, nuclideNames); + if(CollUtil.isNotEmpty(list)){ + for (Map.Entry f : nuclidesCross.entrySet()) { + if(list.contains(f.getKey())){ + NuclideInfo nuclideInfo = new NuclideInfo(); + nuclideInfo.setNuclide(f.getKey()); + nuclideInfo.setDatasource(DSType.typeOf(dataSourceType)); + // 对浓度值保留五位小数 + nuclideInfo.setValue(NumUtil.keepStr(f.getValue(), 5)); + result.add(nuclideInfo); + } + } + } + return result; } /** @@ -280,12 +346,47 @@ public class AnalysisConsumer implements StreamListener meanWhile(String betaOrGamma, String dataSourceType, - String sampleId, Set nuclideNames){ + private List meanWhile(String betaOrGamma, String dataSourceType, + String sampleId, Map nuclidesCross){ + List result = Lists.newArrayList(); /* 查询用户关注的核素中 该谱中是否存在两种及以上核素 判断核素是否存在的条件: 该核素的Conc值是否大于MDC值 */ - return analysisResultService.nuclideExist(betaOrGamma, dataSourceType, sampleId, nuclideNames); + Set nuclideNames = nuclidesCross.keySet(); + List list = analysisResultService.nuclideExist(betaOrGamma, dataSourceType, sampleId, nuclideNames); + if(CollUtil.isNotEmpty(list)){ + for (Map.Entry f : nuclidesCross.entrySet()) { + if(list.contains(f.getKey())){ + NuclideInfo nuclideInfo = new NuclideInfo(); + nuclideInfo.setNuclide(f.getKey()); + nuclideInfo.setDatasource(DSType.typeOf(dataSourceType)); + // 对浓度值保留五位小数 + nuclideInfo.setValue(NumUtil.keepStr(f.getValue(), 5)); + result.add(nuclideInfo); + } + } + } + return result; + } + /* + * 是否同时存在两种及以上核素 + * */ + private List meanWhile(Map nuclideMap, String dataSourceType, Set nuclideNames){ + List result = Lists.newArrayList(); + /* 查询用户关注的核素中 该谱中是否存在两种及以上核素 + 判断核素是否存在的条件: 该核素的Conc值是否大于MDC值 + */ + for (String name : nuclideNames) { + if(nuclideMap.containsKey(name)){ + NuclideInfo nuclideInfo = new NuclideInfo(); + nuclideInfo.setNuclide(name); + nuclideInfo.setDatasource(DSType.typeOf(dataSourceType)); + // 对浓度值保留五位小数 + nuclideInfo.setValue(NumUtil.keepStr(nuclideMap.get(name), 5)); + result.add(nuclideInfo); + } + } + return result; } private void init() { @@ -297,6 +398,7 @@ public class AnalysisConsumer implements StreamListener