feat:Analysis Warn模板
This commit is contained in:
parent
71a4860c63
commit
73f1dea4e0
|
@ -1,13 +1,20 @@
|
||||||
package org.jeecg.common.util;
|
package org.jeecg.common.util;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.map.MapUtil;
|
import cn.hutool.core.map.MapUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
|
import cn.hutool.core.util.ReUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import org.jeecg.common.api.dto.message.MessageDTO;
|
import org.jeecg.common.api.dto.message.MessageDTO;
|
||||||
import org.jeecg.common.util.dynamic.db.FreemarkerParseFactory;
|
import org.jeecg.common.util.dynamic.db.FreemarkerParseFactory;
|
||||||
import org.jeecg.modules.base.entity.postgre.SysMessageTemplate;
|
import org.jeecg.modules.base.entity.postgre.SysMessageTemplate;
|
||||||
import org.jeecg.modules.base.service.ISysMessageTemplateService;
|
import org.jeecg.modules.base.service.ISysMessageTemplateService;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 模板工具类
|
* 模板工具类
|
||||||
|
@ -37,6 +44,30 @@ public class TemplateUtil {
|
||||||
return messageDTO;
|
return messageDTO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static MessageDTO parse1(String code, Map<String, Object> data){
|
||||||
|
MessageDTO messageDTO = new MessageDTO();
|
||||||
|
SysMessageTemplate template = templateService.getOne(code);
|
||||||
|
// 如果没有消息模板
|
||||||
|
if(ObjectUtil.isNull(template))
|
||||||
|
return messageDTO;
|
||||||
|
String templateName = template.getTemplateName();
|
||||||
|
String templateContent = template.getTemplateContent();
|
||||||
|
messageDTO.setTitle(templateName);
|
||||||
|
if (MapUtil.isEmpty(data))
|
||||||
|
return messageDTO;
|
||||||
|
Set<String> keys = data.keySet();
|
||||||
|
String pattern = "\\<([^<>]*{}[^<>]*)\\>";
|
||||||
|
List<String> contents = new ArrayList<>();
|
||||||
|
for (String key : keys) {
|
||||||
|
contents.add(ReUtil.getGroup1(StrUtil.format(pattern, key), templateContent));
|
||||||
|
}
|
||||||
|
templateContent = CollUtil.join(contents, "#");
|
||||||
|
String content = FreemarkerParseFactory
|
||||||
|
.parseTemplateContent(templateContent, data, true);
|
||||||
|
messageDTO.setContent(content);
|
||||||
|
return messageDTO;
|
||||||
|
}
|
||||||
|
|
||||||
public static MessageDTO parse(String title, String code, Map<String, Object> data) {
|
public static MessageDTO parse(String title, String code, Map<String, Object> data) {
|
||||||
MessageDTO messageDTO = new MessageDTO();
|
MessageDTO messageDTO = new MessageDTO();
|
||||||
SysMessageTemplate template = templateService.getOne(code);
|
SysMessageTemplate template = templateService.getOne(code);
|
||||||
|
@ -53,4 +84,28 @@ public class TemplateUtil {
|
||||||
messageDTO.setContent(content);
|
messageDTO.setContent(content);
|
||||||
return messageDTO;
|
return messageDTO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static MessageDTO parse1(String title, String code, Map<String, Object> data) {
|
||||||
|
MessageDTO messageDTO = new MessageDTO();
|
||||||
|
SysMessageTemplate template = templateService.getOne(code);
|
||||||
|
// 如果没有消息模板
|
||||||
|
if(ObjectUtil.isNull(template))
|
||||||
|
return messageDTO;
|
||||||
|
String templateName = template.getTemplateName();
|
||||||
|
String templateContent = template.getTemplateContent();
|
||||||
|
messageDTO.setTitle(StrUtil.isBlank(title) ? templateName : title);
|
||||||
|
if (MapUtil.isEmpty(data))
|
||||||
|
return messageDTO;
|
||||||
|
Set<String> keys = data.keySet();
|
||||||
|
String pattern = "\\<([^<>]*{}[^<>]*)\\>";
|
||||||
|
List<String> contents = new ArrayList<>();
|
||||||
|
for (String key : keys) {
|
||||||
|
contents.add(ReUtil.getGroup1(StrUtil.format(pattern, key), templateContent));
|
||||||
|
}
|
||||||
|
templateContent = CollUtil.join(contents, "#");
|
||||||
|
String content = FreemarkerParseFactory
|
||||||
|
.parseTemplateContent(templateContent, data, true);
|
||||||
|
messageDTO.setContent(content);
|
||||||
|
return messageDTO;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,8 +5,10 @@ import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.collection.CollectionUtil;
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
import cn.hutool.core.collection.ListUtil;
|
import cn.hutool.core.collection.ListUtil;
|
||||||
import cn.hutool.core.map.MapUtil;
|
import cn.hutool.core.map.MapUtil;
|
||||||
|
import cn.hutool.core.text.StrBuilder;
|
||||||
import cn.hutool.core.util.NumberUtil;
|
import cn.hutool.core.util.NumberUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
|
import cn.hutool.core.util.ReUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
@ -16,8 +18,10 @@ import org.jeecg.common.config.mqtoken.UserTokenContext;
|
||||||
import org.jeecg.common.constant.CommonConstant;
|
import org.jeecg.common.constant.CommonConstant;
|
||||||
import org.jeecg.common.constant.SymbolConstant;
|
import org.jeecg.common.constant.SymbolConstant;
|
||||||
import org.jeecg.common.constant.enums.SampleType;
|
import org.jeecg.common.constant.enums.SampleType;
|
||||||
|
import org.jeecg.common.util.DataTool;
|
||||||
import org.jeecg.common.util.RedisStreamUtil;
|
import org.jeecg.common.util.RedisStreamUtil;
|
||||||
import org.jeecg.common.util.SpringContextUtils;
|
import org.jeecg.common.util.SpringContextUtils;
|
||||||
|
import org.jeecg.common.util.TemplateUtil;
|
||||||
import org.jeecg.modules.base.dto.NuclideInfo;
|
import org.jeecg.modules.base.dto.NuclideInfo;
|
||||||
import org.jeecg.modules.base.dto.Info;
|
import org.jeecg.modules.base.dto.Info;
|
||||||
import org.jeecg.modules.base.entity.postgre.AlarmAnalysisLog;
|
import org.jeecg.modules.base.entity.postgre.AlarmAnalysisLog;
|
||||||
|
@ -36,9 +40,13 @@ import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import static org.jeecg.common.constant.enums.MessageTypeEnum.*;
|
import static org.jeecg.common.constant.enums.MessageTypeEnum.*;
|
||||||
import static org.jeecg.common.util.TokenUtils.getTempToken;
|
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.MONITOR_EMAIL;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
|
@ -143,71 +151,61 @@ public class AnalysisConsumer implements StreamListener<String, ObjectRecord<Str
|
||||||
|
|
||||||
private void judge(Info info, Map<String,String> nuclidesCross){
|
private void judge(Info info, Map<String,String> nuclidesCross){
|
||||||
Set<String> nuclideNames = nuclidesCross.keySet();
|
Set<String> nuclideNames = nuclidesCross.keySet();
|
||||||
StringBuilder alarmInfo = new StringBuilder();
|
|
||||||
List<String> firstDetected;
|
|
||||||
List<NuclideInfo> moreThanAvg = new ArrayList<>();
|
|
||||||
String conditionStr = info.getConditions();
|
String conditionStr = info.getConditions();
|
||||||
String betaOrGamma = info.getBetaOrGamma();
|
String betaOrGamma = info.getBetaOrGamma();
|
||||||
String datasource = info.getDatasource();
|
String datasource = info.getDatasource();
|
||||||
List<String> conditions = ListUtil.toList(conditionStr.split(COMMA));
|
List<String> conditions = ListUtil.toList(conditionStr.split(COMMA));
|
||||||
List<String> first = new ArrayList<>();
|
List<String> firstDetected = new ArrayList<>(); // 首次发现
|
||||||
List<String> average = new ArrayList<>();
|
List<NuclideInfo> moreThanAvg = new ArrayList<>(); // 超浓度均值
|
||||||
List<String> meanwhile = new ArrayList<>();
|
List<String> meanwhile = new ArrayList<>(); // 同时出现两种及以上核素
|
||||||
for (String con : conditions) {
|
for (String con : conditions) {
|
||||||
Condition condition = Condition.valueOf1(con);
|
Condition condition = Condition.valueOf1(con);
|
||||||
if (ObjectUtil.isNotNull(condition)){
|
if (ObjectUtil.isNotNull(condition)){
|
||||||
switch (condition){
|
switch (condition){
|
||||||
case FIRST_FOUND: // 首次发现该元素
|
case FIRST_FOUND: // 首次发现该元素
|
||||||
firstDetected = firstDetected(betaOrGamma, datasource, nuclideNames);
|
firstDetected = firstDetected(betaOrGamma, datasource, nuclideNames);
|
||||||
if (CollUtil.isNotEmpty(firstDetected)){
|
|
||||||
String message = "First discovery of nuclides: [" + StrUtil.join(COMMA, firstDetected) + "]";
|
|
||||||
alarmInfo.append(message);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case ABOVE_AVERAGE: // 元素浓度高于均值
|
case ABOVE_AVERAGE: // 元素浓度高于均值
|
||||||
moreThanAvg = moreThanAvg(datasource,nuclidesCross);
|
moreThanAvg = moreThanAvg(datasource,nuclidesCross);
|
||||||
if (CollUtil.isNotEmpty(moreThanAvg)){
|
|
||||||
for (NuclideInfo nuclideInfo : moreThanAvg) {
|
|
||||||
String nuclide = nuclideInfo.getNuclide();
|
|
||||||
String threshold = nuclideInfo.getThreshold();
|
|
||||||
String message = "Nuclide " + nuclide + " is above average: " + threshold;
|
|
||||||
alarmInfo.append(COMMA).append(message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case MEANWHILE: // 同时出现两种及以上核素
|
case MEANWHILE: // 同时出现两种及以上核素
|
||||||
if (nuclideNames.size() >= 2){
|
if (CollUtil.isNotEmpty(nuclideNames) && nuclideNames.size() >= 2)
|
||||||
String message = "Simultaneously detecting nuclides: [" + StrUtil.join(COMMA, nuclideNames) + "]";
|
meanwhile.addAll(nuclideNames);
|
||||||
alarmInfo.append(COMMA).append(message);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (StrUtil.isNotBlank(alarmInfo.toString())){
|
// 构建预警信息
|
||||||
// 保存报警日志
|
DataTool dataTool = DataTool.getInstance();
|
||||||
AlarmAnalysisLog logInfo = new AlarmAnalysisLog();
|
if (CollUtil.isNotEmpty(firstDetected))
|
||||||
BeanUtil.copyProperties(info,logInfo);
|
dataTool.put("firstDetected", CollUtil.join(firstDetected, StrUtil.COMMA + StrUtil.SPACE));
|
||||||
SampleType sampleType = SampleType.typeOf(betaOrGamma);
|
if (CollUtil.isNotEmpty(moreThanAvg)){
|
||||||
if (ObjectUtil.isNotNull(sampleType))
|
String above = moreThanAvg.stream()
|
||||||
logInfo.setSampleType(sampleType.getValue());
|
.map(item -> item.getNuclide() + "(" + item.getValue() + ")" + " > " + item.getThreshold())
|
||||||
if (alarmInfo.toString().startsWith(COMMA))
|
.collect(Collectors.joining(StrUtil.COMMA + StrUtil.SPACE));
|
||||||
alarmInfo = new StringBuilder(StrUtil.sub(alarmInfo.toString(), 1, alarmInfo.length()));
|
dataTool.put("moreThanAvg", above);
|
||||||
logInfo.setAlarmInfo(alarmInfo.toString());
|
|
||||||
if (CollUtil.isNotEmpty(moreThanAvg))
|
|
||||||
logInfo.setNuclideInfoList(moreThanAvg);
|
|
||||||
logService.saveLog(logInfo);
|
|
||||||
// 发送报警信息
|
|
||||||
String groupId = info.getGroupId();
|
|
||||||
MessageDTO messageDTO = new MessageDTO();
|
|
||||||
messageDTO.setTitle("Nuclied Warn Info").setContent(alarmInfo.toString());
|
|
||||||
if (StrUtil.isNotBlank(groupId)) {
|
|
||||||
systemClient.sendMessage(messageDTO, groupId, ALL.getValue());
|
|
||||||
systemClient.pushMessageToSingle(messageDTO, groupId);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if (CollUtil.isNotEmpty(meanwhile))
|
||||||
|
dataTool.put("meanwhile", CollUtil.join(meanwhile, StrUtil.COMMA + StrUtil.SPACE));
|
||||||
|
// 如果报警数据为空 则不需要发送报警信息和生成报警日志
|
||||||
|
if (MapUtil.isEmpty(dataTool.get())) return;
|
||||||
|
MessageDTO messageDTO = TemplateUtil.parse1(ANALYSIS_NUCLIDE.getCode(), dataTool.get());
|
||||||
|
// 保存报警日志
|
||||||
|
AlarmAnalysisLog logInfo = new AlarmAnalysisLog();
|
||||||
|
BeanUtil.copyProperties(info, logInfo);
|
||||||
|
SampleType sampleType = SampleType.typeOf(betaOrGamma);
|
||||||
|
if (ObjectUtil.isNotNull(sampleType))
|
||||||
|
logInfo.setSampleType(sampleType.getValue());
|
||||||
|
logInfo.setAlarmInfo(messageDTO.getContent());
|
||||||
|
if (CollUtil.isNotEmpty(moreThanAvg))
|
||||||
|
logInfo.setNuclideInfoList(moreThanAvg);
|
||||||
|
logService.saveLog(logInfo);
|
||||||
|
// 发送报警信息
|
||||||
|
String groupId = info.getGroupId();
|
||||||
|
systemClient.sendMessage(messageDTO, groupId, ALL.getValue());
|
||||||
|
systemClient.pushMessageToSingle(messageDTO, groupId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue
Block a user