feat: 增加规则校验数据功能并发送告警

dev
huangfeng 1 year ago
parent b215354046
commit 3db9ddf257

@ -1,11 +1,12 @@
package com.xydl.cac.controller;
import com.xydl.cac.comparator.FloatCompare;
import com.xydl.cac.comparator.IntCompare;
import com.xydl.cac.entity.WarnRule;
import com.xydl.cac.exception.BusinessException;
import com.xydl.cac.model.ColumnModel;
import com.xydl.cac.model.Response;
import com.xydl.cac.service.WarnRuleService;
import com.xydl.cac.task.RuleCheckTask;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
@ -24,6 +25,8 @@ import static com.xydl.cac.entity.constants.Constants.IntCompare;
@RequestMapping("rule")
@Slf4j
public class WarnRuleController extends BasicController {
FloatCompare floatCompare = new FloatCompare();
IntCompare intCompare = new IntCompare();
@Resource
WarnRuleService service;
@ -48,9 +51,9 @@ public class WarnRuleController extends BasicController {
public Response<Map<String, String>> listOperator(String name) throws Exception {
Map<String, String> result = new HashMap<>();
if (FloatCompare.equalsIgnoreCase(name)) {
result = RuleCheckTask.floatCompare.supportedOperator();
result = floatCompare.supportedOperator();
} else if (IntCompare.equalsIgnoreCase(name)) {
result = RuleCheckTask.intCompare.supportedOperator();
result = intCompare.supportedOperator();
}
return Response.success(result);
}

@ -1,6 +1,7 @@
package com.xydl.cac.entity;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.xydl.cac.comparator.Comparator;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
@ -66,4 +67,6 @@ public class WarnRule {
private NSensor nSensor;
@Transient
private ModevTypePoint typePoint;
@Transient
private Comparator comparat;
}

@ -28,7 +28,7 @@ public class Warning {
@ApiModelProperty("装置ID")
@Column(name = "eqmid")
private String eqmid;
private Integer eqmid;
@ApiModelProperty("告警时间")
@Column(name = "warn_time")
@ -48,7 +48,7 @@ public class Warning {
@ApiModelProperty("告警级别 0:高 1:中 2:低")
@Column(name = "warn_level")
private String warnLevel;
private Integer warnLevel;
@ApiModelProperty("处理状态")
@Column(name = "state")

@ -224,7 +224,19 @@ public class DataServiceImpl implements DataService {
@Override
public List<Map<String, Object>> getLatestData(NSensor sensor, ModevTypePoint point, Date start) throws Exception {
return null;
List<ModevTypePoint> points = new ArrayList<>();
points.add(point);
ConditionModel model = new ConditionModel();
model.setPageSize(1000);
model.setPageNum(1);
model.setStartTime(start);
model.setExcludeStartTime(true);
model.setTimeAsc(true);
OnePage<Map<String, Object>> page = this.doSqlData(sensor, points, model);
return page.getContent();
}
@Override

@ -2,12 +2,99 @@ package com.xydl.cac.task;
import com.xydl.cac.comparator.FloatCompare;
import com.xydl.cac.comparator.IntCompare;
import com.xydl.cac.entity.ModevTypePoint;
import com.xydl.cac.entity.NSensor;
import com.xydl.cac.entity.WarnRule;
import com.xydl.cac.entity.Warning;
import com.xydl.cac.entity.constants.Constants;
import com.xydl.cac.repository.WarnRuleRepository;
import com.xydl.cac.repository.WarningRepository;
import com.xydl.cac.service.DataService;
import com.xydl.cac.service.WarnRuleService;
import com.xydl.cac.util.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Service
@Slf4j
public class RuleCheckTask {
public static FloatCompare floatCompare = new FloatCompare();
public static IntCompare intCompare = new IntCompare();
@Resource
WarnRuleService ruleService;
@Resource
WarnRuleRepository ruleRepository;
@Resource
DataService dataService;
@Resource
WarningRepository warningRepository;
@Scheduled(initialDelay = 60000, fixedDelay = 60000)
private void checkAll() {
try {
List<WarnRule> ruleList = ruleService.listAll();
for (WarnRule rule : ruleList) {
this.ruleCheck(rule);
}
} catch (Exception e) {
log.error("RuleCheckTask.checkAll error.", e);
}
}
private void ruleCheck(WarnRule rule) {
if (Constants.FloatCompare.equalsIgnoreCase(rule.getComparator())) {
FloatCompare comparat = new FloatCompare();
comparat.setOperator(rule.getOperator());
rule.setComparat(comparat);
} else if (Constants.IntCompare.equalsIgnoreCase(rule.getComparator())) {
IntCompare comparat = new IntCompare();
comparat.setOperator(rule.getOperator());
rule.setComparat(comparat);
} else {
log.error("该规则(" + rule.getId() + ")缺少比较器");
return;
}
try {
NSensor sensor = rule.getNSensor();
ModevTypePoint typePoint = rule.getTypePoint();
List<Map<String, Object>> list = dataService.getLatestData(sensor, typePoint, rule.getLastDTime());
if (!CollectionUtils.isEmpty(list)) {
Date date = null;
for (Map<String, Object> map : list) {
String str = (String) map.get("acquisitionTime");
date = DateUtil.parse(str);
Object value = map.get(typePoint.getField());
boolean r = rule.getComparat().compare(value, rule.getThreshold());
if (r) {
this.sendWarning(rule, date, value);
}
}
rule.setLastDTime(date);
ruleRepository.save(rule);
}
} catch (Exception e) {
log.error("RuleCheckTask.ruleCheck error.", e);
}
}
private void sendWarning(WarnRule rule, Date date, Object value) throws Exception {
NSensor sensor = rule.getNSensor();
ModevTypePoint typePoint = rule.getTypePoint();
Warning warning = Warning.builder()
.eqmid(sensor.getDevId())
.threadval(rule.getThreshold())
.warningValue((String) value)
.warnLevel(rule.getLevel())
.warnDesc(sensor.getName() + " " + typePoint.getFieldDesc() + " 告警")
.processTime(date)
.build();
warningRepository.save(warning);
}
}

Loading…
Cancel
Save