Merge remote-tracking branch 'origin/station' into station

This commit is contained in:
qiaoqinzheng 2023-08-16 08:55:48 +08:00
commit 2bc6d4352b
42 changed files with 472 additions and 182 deletions

View File

@ -28,8 +28,8 @@ public enum MessageTypeEnum {
MessageTypeEnum(String type, String note, String value){
this.type = type;
this.value = value;
this.note = note;
this.value = value;
}
/**

View File

@ -3,7 +3,6 @@ package org.jeecg.common.util;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.constant.RedisConstant;
import org.jeecg.common.constant.SymbolConstant;
import org.jeecg.modules.base.dto.RuleDto;
@ -159,7 +158,7 @@ public class RedisStreamUtil {
*
* @param ruleDto
*/
public String pushWarn(RuleDto ruleDto){
public String pushAlarm(RuleDto ruleDto){
String warnKey = RedisConstant.STREAM_ALARM;
ObjectRecord<String, RuleDto> record = StreamRecords.newRecord()
.in(warnKey).ofObject(ruleDto);
@ -167,6 +166,14 @@ public class RedisStreamUtil {
return putRecord(record);
}
public String pushAnalysis(RuleDto ruleDto){
String analysisKey = RedisConstant.STREAM_ANALYSIS;
ObjectRecord<String, RuleDto> record = StreamRecords.newRecord()
.in(analysisKey).ofObject(ruleDto);
// 向Redis Stream中推送消息
return putRecord(record);
}
public void setSilence(Map<String, Long> silenceMap){
// 返回批处理的执行结果
List<Object> execResult = redisTemplate.executePipelined((RedisConnection connection) -> {

View File

@ -14,31 +14,7 @@ public class NuclideInfo implements Serializable {
private String threshold;
private String armdarr;
private String datasource;
private String armdrrr;
private String idcarr;
private String idcrrr;
@JsonProperty("ARMDARR")
public void setArmdarr(String armdarr) {
this.armdarr = armdarr;
}
@JsonProperty("ARMDRRR")
public void setArmdrrr(String armdrrr) {
this.armdrrr = armdrrr;
}
@JsonProperty("IDCARR")
public void setIdcarr(String idcarr) {
this.idcarr = idcarr;
}
@JsonProperty("IDCRRR")
public void setIdcrrr(String idcrrr) {
this.idcrrr = idcrrr;
}
private String value;
}

View File

@ -2,6 +2,7 @@ package org.jeecg.modules.base.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.jeecg.modules.base.enums.SourceType;
@ -11,6 +12,7 @@ import java.util.Map;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class RuleDto implements Serializable{
// 资源类型
@ -25,6 +27,9 @@ public class RuleDto implements Serializable{
// 台站id
private String stationId;
// 谱id
private String sampleId;
// 数据源类型(ARMDARR=1|ARMDRRR=2|IDCARR=3|IDCRRR=4)
private String dataSourceType;

View File

@ -1,17 +1,22 @@
package org.jeecg.modules.base.entity.postgre;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import javafx.util.converter.LocalDateTimeStringConverter;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.jeecg.modules.base.dto.NuclideInfo;
import org.springframework.format.annotation.DateTimeFormat;
import org.jeecgframework.poi.excel.annotation.Excel;
@ -28,15 +33,18 @@ public class AlarmAnalysisLog implements Serializable{
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "UTC+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date alarmStartDate;
private LocalDateTime alarmStartDate = LocalDateTime.now();
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "UTC+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date collectionDate;
private LocalDateTime collectionDate;
private String alarmInfo;
private Integer sampleId;
private String sampleId;
private String nuclideInfo;
@TableField(exist = false)
private List<NuclideInfo> nuclideInfoList;
}

View File

@ -29,7 +29,7 @@ public class GardsNuclIded implements Serializable {
/**
* 核素名称
*/
@TableField(value = "NUCLIDE_NAME")
@TableField(value = "NUCLIDENAME")
private String nuclideName;
/**
* 核素类型

View File

@ -29,7 +29,7 @@ public class GardsNuclIded implements Serializable {
/**
* 核素名称
*/
@TableField(value = "NUCLIDE_NAME")
@TableField(value = "NUCLIDENAME")
private String nuclideName;
/**
* 核素类型

View File

@ -8,12 +8,12 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.Api;
@Api(value = "",tags="")
@Api(value = "核素浓度均值信息管理",tags="核素浓度均值信息管理")
@RestController
@RequestMapping("alarmAnalysisNuclideAvg")
@RequestMapping("nuclideAvg")
public class AlarmAnalysisNuclideAvgController extends JeecgController<AlarmAnalysisNuclideAvg, IAlarmAnalysisNuclideAvgService> {
@Autowired
private IAlarmAnalysisNuclideAvgService alarmAnalysisNuclideAvgService;
private IAlarmAnalysisNuclideAvgService nuclideAvgService;
}

View File

@ -1,5 +1,6 @@
package org.jeecg.modules.controller;
import io.swagger.annotations.ApiOperation;
import org.jeecg.modules.base.entity.postgre.AlarmAnalysisNuclideParam;
import org.jeecg.modules.service.IAlarmAnalysisNuclideParamService;
import lombok.extern.slf4j.Slf4j;
@ -10,13 +11,18 @@ import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.Api;
@Slf4j
@Api(value = "", tags= "")
@Api(value = "核素浓度均值计算参数管理", tags= "核素浓度均值计算参数管理")
@RestController
@RequestMapping("alarmAnalysisNuclideParam")
@RequestMapping("nuclideParam")
public class AlarmAnalysisNuclideParamController extends JeecgController<AlarmAnalysisNuclideParam, IAlarmAnalysisNuclideParamService> {
@Autowired
private IAlarmAnalysisNuclideParamService alarmAnalysisNuclideParamService;
private IAlarmAnalysisNuclideParamService nuclideParamService;
@GetMapping("refresh")
@ApiOperation(value = "定时刷新核素计算参数信息",notes = "定时刷新核素计算参数信息")
public void refreshParam(){
nuclideParamService.refresh();
}
}

View File

@ -3,6 +3,7 @@ package org.jeecg.modules.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.jeecg.modules.service.CalculateConcService;
import org.jeecg.modules.service.IAlarmAnalysisNuclideParamService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

View File

@ -1,5 +1,6 @@
package org.jeecg.modules.controller;
import cn.hutool.core.map.MapUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.jeecg.common.api.vo.Result;
@ -12,6 +13,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
@RestController
@RequestMapping("sysEmailLog")
@Api(value = "邮箱日志服务", tags = "邮箱日志服务")
@ -33,7 +36,11 @@ public class SysEmailLogController {
@GetMapping("space")
@ApiOperation("邮箱服务器空间")
public Result space(@RequestParam("emailId") String emailId){
return null;
HashMap<String, String> map = MapUtil.newHashMap();
map.put("total","500G");
map.put("residue","300G");
map.put("usage","74.3%");
return Result.OK(map);
}
@GetMapping("total")

View File

@ -19,6 +19,11 @@ public interface SystemClient {
@RequestMapping("/sys/user/findUserMap")
Map<String, SysUser> findUserMap();
@GetMapping("/sys/sendMessage/send")
void sendMessage(@RequestParam String message,
@RequestParam String groupId,
@RequestParam String notific);
/* SysDictController下相关接口 */
@GetMapping("/sys/dict/getItems")
List<DictModel> getItems(@RequestParam String dictCode);

View File

@ -7,9 +7,12 @@ import org.jeecg.modules.base.entity.rnauto.GardsNuclIded;
import java.util.List;
import java.util.Map;
import java.util.Set;
@Mapper
public interface GardsNuclIdedAutoMapper extends BaseMapper<GardsNuclIded> {
List<ConcDto> getConc(Map<String,Object> param);
List<String> nuclideNames(Set<String> nuclideNames);
}

View File

@ -7,9 +7,12 @@ import org.jeecg.modules.base.entity.rnman.GardsNuclIded;
import java.util.List;
import java.util.Map;
import java.util.Set;
@Mapper
public interface GardsNuclIdedManMapper extends BaseMapper<GardsNuclIded> {
List<ConcDto> getConc(Map<String,Object> param);
List<String> nuclideNames(Set<String> nuclideNames);
}

View File

@ -7,9 +7,12 @@ import org.jeecg.modules.base.entity.rnauto.GardsXeResults;
import java.util.List;
import java.util.Map;
import java.util.Set;
@Mapper
public interface GardsXeResultsAutoMapper extends BaseMapper<GardsXeResults> {
List<ConcDto> getConc(Map<String,Object> params);
List<String> nuclideNames(Set<String> nuclideNames);
}

View File

@ -7,9 +7,12 @@ import org.jeecg.modules.base.entity.rnman.GardsXeResults;
import java.util.List;
import java.util.Map;
import java.util.Set;
@Mapper
public interface GardsXeResultsManMapper extends BaseMapper<GardsXeResults> {
List<ConcDto> getConc(Map<String,Object> params);
List<String> nuclideNames(Set<String> nuclideNames);
}

View File

@ -1,25 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.mapper.GardsNuclIdedAutoMapper">
<select id="getConc" resultType="org.jeecg.modules.base.dto.ConcDto">
SELECT
xe.NUCLIDE_NAME,
xe.CONC,
nucl.NUCLIDENAME,
nucl.CONCENTRATION AS CONC,
ana.ANALYSISBEGIN
FROM
RNAUTO.GARDS_XE_RESULTS xe
INNER JOIN RNAUTO.GARDS_ANALYSES ana ON ana.IDANALYSIS = xe.IDANALYSIS
INNER JOIN ORIGINAL.GARDS_SAMPLE_DATA samp ON samp.SAMPLE_ID = xe.SAMPLE_ID
RNAUTO.GARDS_NUCL_IDED nucl
INNER JOIN RNAUTO.GARDS_ANALYSES ana ON ana.IDANALYSIS = nucl.IDANALYSIS
INNER JOIN ORIGINAL.GARDS_SAMPLE_DATA samp ON samp.SAMPLE_ID = nucl.SAMPLE_ID
<where>
ana.ANALYSISBEGIN BETWEEN to_date(#{startDate},'yyyy-mm-dd hh24:mi:ss')
AND to_date(#{endDate},'yyyy-mm-dd hh24:mi:ss')
<if test="nuclideName != null and nuclideName.size() > 0">
AND xe.NUCLIDE_NAME IN
AND nucl.NUCLIDENAME IN
<foreach collection="nuclideName" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
</where>
</select>
<select id="nuclideNames" resultType="java.lang.String">
SELECT
NUCLIDENAME
FROM
RNAUTO.GARDS_NUCL_IDED
WHERE
NUCLIDENAME IN
<foreach collection="nuclideNames" separator="," item="nuclideName" index="index" open="(" close=")">
#{nuclideName}
</foreach>
GROUP BY
NUCLIDENAME
</select>
</mapper>

View File

@ -1,25 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.mapper.GardsNuclIdedManMapper">
<select id="getConc" resultType="org.jeecg.modules.base.dto.ConcDto">
SELECT
xe.NUCLIDE_NAME,
xe.CONC,
nucl.NUCLIDENAME,
nucl.CONCENTRATION AS CONC,
ana.ANALYSISBEGIN
FROM
RNMAN.GARDS_XE_RESULTS xe
INNER JOIN RNMAN.GARDS_ANALYSES ana ON ana.IDANALYSIS = xe.IDANALYSIS
INNER JOIN ORIGINAL.GARDS_SAMPLE_DATA samp ON samp.SAMPLE_ID = xe.SAMPLE_ID
RNMAN.GARDS_NUCL_IDED nucl
INNER JOIN RNMAN.GARDS_ANALYSES ana ON ana.IDANALYSIS = nucl.IDANALYSIS
INNER JOIN ORIGINAL.GARDS_SAMPLE_DATA samp ON samp.SAMPLE_ID = nucl.SAMPLE_ID
<where>
ana.ANALYSISBEGIN BETWEEN to_date(#{startDate},'yyyy-mm-dd hh24:mi:ss')
AND to_date(#{endDate},'yyyy-mm-dd hh24:mi:ss')
<if test="nuclideName != null and nuclideName.size() > 0">
AND xe.NUCLIDE_NAME IN
AND nucl.NUCLIDENAME IN
<foreach collection="nuclideName" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
</where>
</select>
<select id="nuclideNames" resultType="java.lang.String">
SELECT
NUCLIDENAME
FROM
RNMAN.GARDS_NUCL_IDED
WHERE
NUCLIDENAME IN
<foreach collection="nuclideNames" separator="," item="nuclideName" index="index" open="(" close=")">
#{nuclideName}
</foreach>
GROUP BY
NUCLIDENAME
</select>
</mapper>

View File

@ -4,22 +4,36 @@
<select id="getConc" resultType="org.jeecg.modules.base.dto.ConcDto">
SELECT
nucl.NUCLIDENAME,
nucl.CONCENTRATION AS CONC,
xe.NUCLIDE_NAME,
xe.CONC,
ana.ANALYSISBEGIN
FROM
RNAUTO.GARDS_NUCL_IDED nucl
INNER JOIN RNAUTO.GARDS_ANALYSES ana ON ana.IDANALYSIS = nucl.IDANALYSIS
INNER JOIN ORIGINAL.GARDS_SAMPLE_DATA samp ON samp.SAMPLE_ID = nucl.SAMPLE_ID
RNAUTO.GARDS_XE_RESULTS xe
INNER JOIN RNAUTO.GARDS_ANALYSES ana ON ana.IDANALYSIS = xe.IDANALYSIS
INNER JOIN ORIGINAL.GARDS_SAMPLE_DATA samp ON samp.SAMPLE_ID = xe.SAMPLE_ID
<where>
ana.ANALYSISBEGIN BETWEEN to_date(#{startDate},'yyyy-mm-dd hh24:mi:ss')
AND to_date(#{endDate},'yyyy-mm-dd hh24:mi:ss')
<if test="nuclideName != null and nuclideName.size() > 0">
AND nucl.NUCLIDENAME IN
AND xe.NUCLIDE_NAME IN
<foreach collection="nuclideName" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
</where>
</select>
<select id="nuclideNames" resultType="java.lang.String">
SELECT
NUCLIDE_NAME
FROM
RNAUTO.GARDS_XE_RESULTS
WHERE
NUCLIDE_NAME IN
<foreach collection="nuclideNames" separator="," item="nuclideName" index="index" open="(" close=")">
#{nuclideName}
</foreach>
GROUP BY
NUCLIDE_NAME
</select>
</mapper>

View File

@ -1,25 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.mapper.GardsXeResultsManMapper">
<select id="getConc" resultType="org.jeecg.modules.base.dto.ConcDto">
SELECT
nucl.NUCLIDENAME,
nucl.CONCENTRATION AS CONC,
xe.NUCLIDE_NAME,
xe.CONC,
ana.ANALYSISBEGIN
FROM
RNMAN.GARDS_NUCL_IDED nucl
INNER JOIN RNMAN.GARDS_ANALYSES ana ON ana.IDANALYSIS = nucl.IDANALYSIS
INNER JOIN ORIGINAL.GARDS_SAMPLE_DATA samp ON samp.SAMPLE_ID = nucl.SAMPLE_ID
RNMAN.GARDS_XE_RESULTS xe
INNER JOIN RNMAN.GARDS_ANALYSES ana ON ana.IDANALYSIS = xe.IDANALYSIS
INNER JOIN ORIGINAL.GARDS_SAMPLE_DATA samp ON samp.SAMPLE_ID = xe.SAMPLE_ID
<where>
ana.ANALYSISBEGIN BETWEEN to_date(#{startDate},'yyyy-mm-dd hh24:mi:ss')
AND to_date(#{endDate},'yyyy-mm-dd hh24:mi:ss')
<if test="nuclideName != null and nuclideName.size() > 0">
AND nucl.NUCLIDENAME IN
AND xe.NUCLIDE_NAME IN
<foreach collection="nuclideName" open="(" close=")" index="index" item="item" separator=",">
#{item}
</foreach>
</if>
</where>
</select>
<select id="nuclideNames" resultType="java.lang.String">
SELECT
NUCLIDE_NAME
FROM
RNMAN.GARDS_XE_RESULTS
WHERE
NUCLIDE_NAME IN
<foreach collection="nuclideNames" separator="," item="nuclideName" index="index" open="(" close=")">
#{nuclideName}
</foreach>
GROUP BY
NUCLIDE_NAME
</select>
</mapper>

View File

@ -7,9 +7,12 @@ import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.config.mqtoken.UserTokenContext;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.constant.RedisConstant;
import org.jeecg.common.constant.SymbolConstant;
@ -18,9 +21,12 @@ import org.jeecg.common.util.RedisUtil;
import org.jeecg.common.util.SpringContextUtils;
import org.jeecg.modules.base.dto.NuclideInfo;
import org.jeecg.modules.base.dto.RuleDto;
import org.jeecg.modules.base.entity.postgre.AlarmAnalysisLog;
import org.jeecg.modules.base.entity.postgre.AlarmAnalysisNuclideAvg;
import org.jeecg.modules.base.entity.postgre.AlarmAnalysisRule;
import org.jeecg.modules.feignclient.SystemClient;
import org.jeecg.modules.service.AnalysisResultService;
import org.jeecg.modules.service.IAlarmAnalysisLogService;
import org.jeecg.modules.service.IAlarmAnalysisNuclideAvgService;
import org.jeecg.modules.service.IAlarmAnalysisRuleService;
import org.springframework.beans.factory.annotation.Autowired;
@ -28,8 +34,12 @@ import org.springframework.data.redis.connection.stream.ObjectRecord;
import org.springframework.data.redis.connection.stream.RecordId;
import org.springframework.data.redis.stream.StreamListener;
import org.springframework.stereotype.Component;
import static org.jeecg.common.constant.enums.MessageTypeEnum.*;
import static org.jeecg.common.util.TokenUtils.getTempToken;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
@ -43,12 +53,11 @@ public class AnalysisConsumer implements StreamListener<String, ObjectRecord<Str
private String consumerName;
private SystemClient systemClient;
private RedisStreamUtil redisStreamUtil;
private IAlarmAnalysisLogService logService;
private IAlarmAnalysisRuleService ruleService;
private AnalysisResultService analysisResultService;
private IAlarmAnalysisNuclideAvgService nuclideAvgService;
private final String comma = SymbolConstant.COMMA;
@ -83,24 +92,42 @@ public class AnalysisConsumer implements StreamListener<String, ObjectRecord<Str
}
}catch (RuntimeException e){
e.printStackTrace();
}finally {
destroy();
}
}
private void consume(RuleDto ruleDto){
String stationId = ruleDto.getStationId();
String sampleId = ruleDto.getSampleId();
String fullOrPrel = ruleDto.getFullOrPrel();
String betaOrGamma = ruleDto.getBetaOrGamma();
String dataSourceType = ruleDto.getDataSourceType();
Map<String, String> nuclides = ruleDto.getNuclides();
if (StrUtil.isBlank(stationId)) return;
if (StrUtil.isBlank(sampleId)) return;
if (MapUtil.isEmpty(nuclides)) return;
List<AlarmAnalysisRule> rules = ruleService.allAnalysisRule();
for (AlarmAnalysisRule rule : rules) {
// 当前规则是否有报警条件
String conditionStr = rule.getConditions();
if (StrUtil.isBlank(conditionStr)) continue;
// 是否在当前规则关注的台站列表内
String stations = rule.getStations();
boolean shot = StrUtil.contains(stations, stationId);
if (!shot) continue;
Set<String> names = nuclides.keySet();
if (!StrUtil.contains(stations, stationId))
continue;
// 是否在当前规则关注的数据源内
String source = rule.getSource();
if (!StrUtil.contains(source,dataSourceType))
continue;
// 是否在当前规则关注的谱类型内
String spectralQualifier = rule.getSpectralQualifier();
if (!StrUtil.contains(spectralQualifier,fullOrPrel))
continue;
// 是否有当前规则关注的核素
String nuclidesStr = rule.getNuclides();
if (StrUtil.isBlank(nuclidesStr)) continue;
Set<String> names = nuclides.keySet();
List<String> follow = ListUtil.toList(nuclidesStr.split(comma));
// 推送过来的核素集合与所关注核素集合取交集
Collection<String> cross = CollectionUtil.intersection(names, follow);
@ -110,39 +137,63 @@ public class AnalysisConsumer implements StreamListener<String, ObjectRecord<Str
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
// 开始对交集中的核素进行条件判断
List<String> conditions = ListUtil.toList(conditionStr.split(comma));
String ruleId = rule.getId();
String groupId = rule.getContactGroup();
judge(ruleId,groupId,sampleId,betaOrGamma,dataSourceType,conditions,nuclidesCross);
}
}
private void judge(String betaOrGamma,
private void judge(String ruleId,
String groupId,
String sampleId,
String betaOrGamma,
String dataSourceType,
List<String> conditions,
Map<String,String> nuclides){
Map<String,String> nuclidesCross){
String ONE = "1";String TWO = "2";String THREE = "3";
Set<String> nuclideNames = nuclides.keySet();
Set<String> nuclideNames = nuclidesCross.keySet();
String alarmInfo = "";
List<String> firstDetected;
List<NuclideInfo> moreThanAvg;
List<String> twoOrMore;
List<NuclideInfo> moreThanAvg = new ArrayList<>();
for (String con : conditions) {
if (ONE.equals(con)){ // 首次发现该元素
firstDetected = firstDetected(betaOrGamma,dataSourceType,nuclideNames);
if (CollUtil.isNotEmpty(firstDetected)){
String message = "核素:["+StrUtil.join(comma,firstDetected)+"]首次发现";
String message = "核素"+StrUtil.join(comma,firstDetected)+"首次发现";
alarmInfo += message;
}
} else if (TWO.equals(con)) { // 元素浓度高于均值
moreThanAvg = moreThanAvg(dataSourceType,nuclides);
moreThanAvg = moreThanAvg(dataSourceType,nuclidesCross);
if (CollUtil.isNotEmpty(moreThanAvg)){
for (NuclideInfo nuclideInfo : moreThanAvg) {
String nuclide = nuclideInfo.getNuclide();
String threshold = nuclideInfo.getThreshold();
String message = "核素"+nuclide+"超出平均值:"+threshold;
alarmInfo += comma + message;
}
} else if (THREE.equals(con)) { // 发现两种及以上核素
twoOrMore = twoOrMore(betaOrGamma,dataSourceType,nuclideNames);
if (twoOrMore.size() >= 2){
String message = "同时检测到核素:["+StrUtil.join(comma,twoOrMore)+"]";
}
} else if (THREE.equals(con)) { // 同时出现两种及以上核素
if (nuclideNames.size() >= 2){
String message = "同时检测到核素"+StrUtil.join(comma,nuclideNames);
alarmInfo += comma + message;
}
}
}
if (StrUtil.isNotBlank(alarmInfo)){
// 保存报警日志
AlarmAnalysisLog logInfo = new AlarmAnalysisLog();
logInfo.setRuleId(ruleId);
logInfo.setSampleId(sampleId);
if (alarmInfo.startsWith(comma))
alarmInfo = StrUtil.sub(alarmInfo, 1, alarmInfo.length());
logInfo.setAlarmInfo(alarmInfo);
if (CollUtil.isNotEmpty(moreThanAvg))
logInfo.setNuclideInfoList(moreThanAvg);
logService.saveLog(logInfo);
// 发送报警信息
if (StrUtil.isNotBlank(groupId))
systemClient.sendMessage(alarmInfo,groupId, ALL.getValue());
}
}
/**
@ -151,7 +202,7 @@ public class AnalysisConsumer implements StreamListener<String, ObjectRecord<Str
private List<String> firstDetected(String betaOrGamma,
String dataSourceType,
Set<String> nuclideNames){
Set<String> existNames = analysisResultService
List<String> existNames = analysisResultService
.nuclideNames(betaOrGamma, dataSourceType, nuclideNames);
// 两个集合元素相减
List<String> differ = CollUtil.subtractToList(nuclideNames, existNames);
@ -162,14 +213,14 @@ public class AnalysisConsumer implements StreamListener<String, ObjectRecord<Str
* 核素值大于历史浓度均值
*/
private List<NuclideInfo> moreThanAvg(String dataSourceType,
Map<String,String> nuclides){
Map<String,String> nuclidesCross){
List<NuclideInfo> nuclideInfos = new ArrayList<>();
Set<String> nuclideNames = nuclides.keySet();
Set<String> nuclideNames = nuclidesCross.keySet();
Map<String, String> nuclideAvgs = nuclideAvgService
.list(nuclideNames, dataSourceType).stream()
.collect(Collectors.toMap(AlarmAnalysisNuclideAvg::getNuclide,
AlarmAnalysisNuclideAvg::getVal));
for (Map.Entry<String, String> nuclide : nuclides.entrySet()) {
for (Map.Entry<String, String> nuclide : nuclidesCross.entrySet()) {
String nuclideName = nuclide.getKey();
String concValue = nuclide.getValue();// 浓度值
String avgValue = nuclideAvgs.get(nuclideName);// 浓度均值
@ -184,32 +235,42 @@ public class AnalysisConsumer implements StreamListener<String, ObjectRecord<Str
continue;
NuclideInfo nuclideInfo = new NuclideInfo();
nuclideInfo.setNuclide(nuclideName);
nuclideInfo.setThreshold(avgValue);
if (CommonConstant.ARMDARR.equals(dataSourceType)){
nuclideInfo.setArmdarr(concValue);
} else if (CommonConstant.ARMDRRR.equals(dataSourceType)) {
nuclideInfo.setArmdrrr(concValue);
}
nuclideInfo.setThreshold(avg.toString());
nuclideInfo.setDatasource(type(dataSourceType));
nuclideInfo.setValue(conc.toString());
nuclideInfos.add(nuclideInfo);
}
return nuclideInfos;
}
/**
* 同时检测到两种或以上核素
*/
private List<String> twoOrMore(String betaOrGamma,
String dataSourceType,
Set<String> nuclideNames){
Set<String> existNames = analysisResultService
.nuclideNames(betaOrGamma, dataSourceType, nuclideNames);
return ListUtil.toList(existNames);
private String type(String dataSourceType){
switch (dataSourceType){
case CommonConstant.ARMDARR:
return "ARMDARR";
case CommonConstant.ARMDRRR:
return "ARMDRRR";
case CommonConstant.IDCARR:
return "IDCARR";
case CommonConstant.IDCRRR:
return "IDCRRR";
default:
return null;
}
}
private void init() {
// start:生成临时Token到线程中
UserTokenContext.setToken(getTempToken());
systemClient = SpringContextUtils.getBean(SystemClient.class);
redisStreamUtil = SpringContextUtils.getBean(RedisStreamUtil.class);
ruleService = SpringContextUtils.getBean(IAlarmAnalysisRuleService.class);
logService = SpringContextUtils.getBean(IAlarmAnalysisLogService.class);
analysisResultService = SpringContextUtils.getBean(AnalysisResultService.class);
ruleService = SpringContextUtils.getBean(IAlarmAnalysisRuleService.class);
nuclideAvgService = SpringContextUtils.getBean(IAlarmAnalysisNuclideAvgService.class);
}
private void destroy(){
// end:删除临时Token
UserTokenContext.remove();
}
}

View File

@ -1,10 +1,11 @@
package org.jeecg.modules.service;
import java.util.List;
import java.util.Set;
public interface AnalysisResultService {
Set<String> nuclideNames(String betaOrGamma,
List<String> nuclideNames(String betaOrGamma,
String dataSourceType,
Set<String> nuclideNames);
}

View File

@ -8,4 +8,6 @@ import org.jeecg.modules.base.vo.AnalysisLogVo;
public interface IAlarmAnalysisLogService extends IService<AlarmAnalysisLog> {
Result findPage(AnalysisLogVo analysisLogVo);
boolean saveLog(AlarmAnalysisLog analysisLog);
}

View File

@ -12,5 +12,5 @@ public interface IGardsNuclIdedAutoService extends IService<GardsNuclIded> {
List<ConcDto> getConc(Map<String,Object> params);
Set<String> nuclideNames(Set<String> nuclideNames);
List<String> nuclideNames(Set<String> nuclideNames);
}

View File

@ -12,5 +12,5 @@ public interface IGardsNuclIdedManService extends IService<GardsNuclIded> {
List<ConcDto> getConc(Map<String,Object> params);
Set<String> nuclideNames(Set<String> nuclideNames);
List<String> nuclideNames(Set<String> nuclideNames);
}

View File

@ -12,5 +12,5 @@ public interface IGardsXeResultsAutoService extends IService<GardsXeResults> {
List<ConcDto> getConc(Map<String,Object> params);
Set<String> nuclideNames(Set<String> nuclideNames);
List<String> nuclideNames(Set<String> nuclideNames);
}

View File

@ -12,5 +12,5 @@ public interface IGardsXeResultsManService extends IService<GardsXeResults> {
List<ConcDto> getConc(Map<String,Object> params);
Set<String> nuclideNames(Set<String> nuclideNames);
List<String> nuclideNames(Set<String> nuclideNames);
}

View File

@ -2,7 +2,9 @@ package org.jeecg.modules.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
@ -24,6 +26,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@ -112,6 +116,22 @@ public class AlarmAnalysisLogServiceImpl extends ServiceImpl<AlarmAnalysisLogMap
return Result.OK(page);
}
@Override
public boolean saveLog(AlarmAnalysisLog analysisLog) {
List<NuclideInfo> nuclideInfoList = analysisLog.getNuclideInfoList();
try {
if (CollUtil.isNotEmpty(nuclideInfoList)){
ObjectMapper mapper = new ObjectMapper();
String nuclideInfo = mapper.writeValueAsString(nuclideInfoList);
analysisLog.setNuclideInfo(nuclideInfo);
}
return save(analysisLog);
} catch (JsonProcessingException e) {
e.printStackTrace();
return false;
}
}
private List<String> getShow(List<DictModel> dictModels,String dict){
List<String> show = new ArrayList<>();
if (StrUtil.isBlank(dict))

View File

@ -24,7 +24,7 @@ public class AlarmAnalysisNuclideParamServiceImpl extends ServiceImpl<AlarmAnaly
public boolean refresh() {
AlarmAnalysisNuclideParam nuclideParam = new AlarmAnalysisNuclideParam();
CopyOptions options = CopyOptions.create()
.setIgnoreProperties("id","create_time");
.setIgnoreProperties("id","createTime");
BeanUtil.copyProperties(getLatest(),nuclideParam,options);
return save(nuclideParam);
}

View File

@ -1,10 +1,12 @@
package org.jeecg.modules.service.impl;
import cn.hutool.core.collection.ListUtil;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.modules.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Set;
@Service
@ -24,14 +26,14 @@ public class AnalysisResultServiceImpl implements AnalysisResultService {
@Override
public Set<String> nuclideNames(String betaOrGamma, String dataSourceType, Set<String> nuclideNames) {
public List<String> nuclideNames(String betaOrGamma, String dataSourceType, Set<String> nuclideNames) {
if (CommonConstant.ARMDARR.equals(dataSourceType)){
if (CommonConstant.BETA.equals(betaOrGamma)){
return xeResultsAutoService.nuclideNames(nuclideNames);
}else if (CommonConstant.GAMMA.equals(betaOrGamma)){
return nuclIdedAutoService.nuclideNames(nuclideNames);
}else {
return nuclideNames;
return ListUtil.toList(nuclideNames);
}
} else if (CommonConstant.ARMDRRR.equals(dataSourceType)) {
if (CommonConstant.BETA.equals(betaOrGamma)){
@ -39,10 +41,10 @@ public class AnalysisResultServiceImpl implements AnalysisResultService {
}else if (CommonConstant.GAMMA.equals(betaOrGamma)){
return nuclIdedManService.nuclideNames(nuclideNames);
}else {
return nuclideNames;
return ListUtil.toList(nuclideNames);
}
}else {
return nuclideNames;
return ListUtil.toList(nuclideNames);
}
}
}

View File

@ -29,12 +29,7 @@ public class GardsNuclIdedAutoServiceImpl extends ServiceImpl<GardsNuclIdedAutoM
}
@Override
public Set<String> nuclideNames(Set<String> nuclideNames) {
LambdaQueryWrapper<GardsNuclIded> wrapper = new LambdaQueryWrapper<>();
wrapper.in(GardsNuclIded::getNuclideName,nuclideNames);
Set<String> result = list(wrapper).stream()
.map(GardsNuclIded::getNuclideName)
.collect(Collectors.toSet());
return result;
public List<String> nuclideNames(Set<String> nuclideNames) {
return baseMapper.nuclideNames(nuclideNames);
}
}

View File

@ -28,12 +28,7 @@ public class GardsNuclIdedManServiceImpl extends ServiceImpl<GardsNuclIdedManMap
}
@Override
public Set<String> nuclideNames(Set<String> nuclideNames) {
LambdaQueryWrapper<GardsNuclIded> wrapper = new LambdaQueryWrapper<>();
wrapper.in(GardsNuclIded::getNuclideName,nuclideNames);
Set<String> result = list(wrapper).stream()
.map(GardsNuclIded::getNuclideName)
.collect(Collectors.toSet());
return result;
public List<String> nuclideNames(Set<String> nuclideNames) {
return baseMapper.nuclideNames(nuclideNames);
}
}

View File

@ -28,12 +28,7 @@ public class GardsXeResultsAutoServiceImpl extends ServiceImpl<GardsXeResultsAut
}
@Override
public Set<String> nuclideNames(Set<String> nuclideNames) {
LambdaQueryWrapper<GardsXeResults> wrapper = new LambdaQueryWrapper<>();
wrapper.in(GardsXeResults::getNuclideName,nuclideNames);
Set<String> result = list(wrapper).stream()
.map(GardsXeResults::getNuclideName)
.collect(Collectors.toSet());
return result;
public List<String> nuclideNames(Set<String> nuclideNames) {
return baseMapper.nuclideNames(nuclideNames);
}
}

View File

@ -28,12 +28,7 @@ public class GardsXeResultsManServiceImpl extends ServiceImpl<GardsXeResultsManM
}
@Override
public Set<String> nuclideNames(Set<String> nuclideNames) {
LambdaQueryWrapper<GardsXeResults> wrapper = new LambdaQueryWrapper<>();
wrapper.in(GardsXeResults::getNuclideName,nuclideNames);
Set<String> result = list(wrapper).stream()
.map(GardsXeResults::getNuclideName)
.collect(Collectors.toSet());
return result;
public List<String> nuclideNames(Set<String> nuclideNames) {
return baseMapper.nuclideNames(nuclideNames);
}
}

View File

@ -29,5 +29,11 @@ public interface AbnormalAlarmClient {
@PostMapping("/alarmLog/create")
Result create(@RequestBody AlarmLog alarmLog);
/* AlarmAnalysisRuleController下相关接口 */
/* CalculateConcController下相关接口 */
@GetMapping("/calculateConc/caclAndSave")
void calculateConc();
/* AlarmAnalysisNuclideParamController下相关接口 */
@GetMapping("/nuclideParam/refresh")
void refreshParam();
}

View File

@ -48,9 +48,6 @@ public class SendMessage {
*
*/
public void send(String message,String groupId,String notific){
// start:生成临时Token到线程中
UserTokenContext.setToken(getTempToken());
// 封装MessageDTO消息体
String title = "系统预警消息";
MessageDTO messageDTO = new MessageDTO(title,message);
@ -85,8 +82,6 @@ public class SendMessage {
}
}
}
// end:删除临时Token
UserTokenContext.remove();
}
/**

View File

@ -0,0 +1,24 @@
package org.jeecg.modules.message.controller;
import org.jeecg.modules.message.SendMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("sys/sendMessage")
public class SendMessageController {
@Autowired
private SendMessage sendMessage;
@GetMapping("send")
public void sendMessage(@RequestParam String message,
@RequestParam String groupId,
@RequestParam String notific){
sendMessage.send(message, groupId, notific);
}
}

View File

@ -1,21 +0,0 @@
package org.jeecg.modules.quartz.job;
import org.quartz.*;
/**
* 此处的同步是指:当定时任务的执行时间大于任务的时间
* 间隔时会等待第一个任务执行完成才会走第二个任务
*/
@DisallowConcurrentExecution
@PersistJobDataAfterExecution
public class ConcJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
init();
}
private void init(){
}
}

View File

@ -0,0 +1,41 @@
package org.jeecg.modules.quartz.job;
import org.jeecg.common.config.mqtoken.UserTokenContext;
import org.jeecg.common.util.SpringContextUtils;
import org.jeecg.modules.feignclient.AbnormalAlarmClient;
import org.quartz.*;
import static org.jeecg.common.util.TokenUtils.getTempToken;
/**
* 此处的同步是指:当定时任务的执行时间大于任务的时间
* 间隔时会等待第一个任务执行完成才会走第二个任务
*/
/**
* 定时更新核素浓度计算参数
*/
@DisallowConcurrentExecution
@PersistJobDataAfterExecution
public class NuclideParamJob implements Job {
private AbnormalAlarmClient alarmClient;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
init();
alarmClient.refreshParam();
destroy();
}
private void init(){
// start:生成临时Token到线程中
UserTokenContext.setToken(getTempToken());
alarmClient = SpringContextUtils.getBean(AbnormalAlarmClient.class);
}
private void destroy(){
// end:删除临时Token
UserTokenContext.remove();
}
}

View File

@ -0,0 +1,41 @@
package org.jeecg.modules.quartz.job;
import org.jeecg.common.config.mqtoken.UserTokenContext;
import org.jeecg.common.util.SpringContextUtils;
import org.jeecg.modules.feignclient.AbnormalAlarmClient;
import org.quartz.*;
import static org.jeecg.common.util.TokenUtils.getTempToken;
/**
* 此处的同步是指:当定时任务的执行时间大于任务的时间
* 间隔时会等待第一个任务执行完成才会走第二个任务
*/
/**
* 定时计算核素浓度均值
*/
@DisallowConcurrentExecution
@PersistJobDataAfterExecution
public class NucliedAvgJob implements Job {
private AbnormalAlarmClient alarmClient;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
init();
alarmClient.calculateConc();
destroy();
}
private void init(){
// start:生成临时Token到线程中
UserTokenContext.setToken(getTempToken());
alarmClient = SpringContextUtils.getBean(AbnormalAlarmClient.class);
}
private void destroy(){
// end:删除临时Token
UserTokenContext.remove();
}
}

View File

@ -8,6 +8,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.config.mqtoken.UserTokenContext;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.constant.DateConstant;
import org.jeecg.common.constant.RedisConstant;
@ -21,7 +22,7 @@ import org.jeecg.modules.feignclient.AbnormalAlarmClient;
import org.jeecg.modules.feignclient.MonitorSystem;
import org.jeecg.modules.message.SendMessage;
import org.quartz.*;
import static org.jeecg.common.util.TokenUtils.getTempToken;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Set;
@ -36,6 +37,11 @@ public class SysInfoJob implements Job {
private String parameter;
private SendMessage sendMessage;
private MonitorSystem monitorSystem;
private RedisStreamUtil redisStreamUtil;
private AbnormalAlarmClient alarmClient;
/**
* 根据host定时查询服务器信息
* 并向消息队列中推送信息
@ -44,16 +50,12 @@ public class SysInfoJob implements Job {
*/
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
RedisStreamUtil redisStreamUtil = SpringContextUtils.getBean(RedisStreamUtil.class);
MonitorSystem monitorSystem = SpringContextUtils.getBean(MonitorSystem.class);
SendMessage sendMessage = SpringContextUtils.getBean(SendMessage.class);
AbnormalAlarmClient alarmClient = SpringContextUtils.getBean(AbnormalAlarmClient.class);
init();
// 查询所有报警规则,根据报警规则查询监控项数据
String pattern = RedisConstant.PREFIX_RULE;
Set<String> keys = redisStreamUtil.keys(pattern);
if (CollUtil.isEmpty(keys)) {
log.error("当前没有需要监控的预警规则!");
return;
}
@ -114,6 +116,7 @@ public class SysInfoJob implements Job {
e.printStackTrace();
}
}
destroy();
}
private boolean parse(Rule rule){
@ -141,4 +144,18 @@ public class SysInfoJob implements Job {
return false;
}
}
private void init(){
// start:生成临时Token到线程中
UserTokenContext.setToken(getTempToken());
sendMessage = SpringContextUtils.getBean(SendMessage.class);
monitorSystem = SpringContextUtils.getBean(MonitorSystem.class);
redisStreamUtil = SpringContextUtils.getBean(RedisStreamUtil.class);
alarmClient = SpringContextUtils.getBean(AbnormalAlarmClient.class);
}
private void destroy(){
// end:删除临时Token
UserTokenContext.remove();
}
}

View File

@ -0,0 +1,41 @@
package org.jeecg.modules.quartz.job;
import cn.hutool.core.map.MapUtil;
import org.jeecg.common.util.RedisStreamUtil;
import org.jeecg.common.util.SpringContextUtils;
import org.jeecg.modules.base.dto.RuleDto;
import org.quartz.*;
import java.util.Map;
/**
* 此处的同步是指:当定时任务的执行时间大于任务的时间
* 间隔时会等待第一个任务执行完成才会走第二个任务
*/
@DisallowConcurrentExecution
@PersistJobDataAfterExecution
public class Test implements Job {
private RedisStreamUtil redisStreamUtil;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
init();
RuleDto ruleDto = new RuleDto();
ruleDto.setStationId("101");
ruleDto.setSampleId("424249");
ruleDto.setBetaOrGamma("Gamma");
ruleDto.setFullOrPrel("FULL");
ruleDto.setDataSourceType("1");
Map<String, String> nuclides = MapUtil.newHashMap();
nuclides.put("Be7","1000000");
nuclides.put("sss","1000000");
nuclides.put("Tl208","10");
ruleDto.setNuclides(nuclides);
redisStreamUtil.pushAnalysis(ruleDto);
}
private void init(){
redisStreamUtil = SpringContextUtils.getBean(RedisStreamUtil.class);
}
}