diff --git a/src/main/java/com/xydl/cac/controller/WarnRuleController.java b/src/main/java/com/xydl/cac/controller/WarnRuleController.java index d948b03..75af6d2 100644 --- a/src/main/java/com/xydl/cac/controller/WarnRuleController.java +++ b/src/main/java/com/xydl/cac/controller/WarnRuleController.java @@ -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> listOperator(String name) throws Exception { Map 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); } diff --git a/src/main/java/com/xydl/cac/entity/WarnRule.java b/src/main/java/com/xydl/cac/entity/WarnRule.java index 298dd7b..2278b2d 100644 --- a/src/main/java/com/xydl/cac/entity/WarnRule.java +++ b/src/main/java/com/xydl/cac/entity/WarnRule.java @@ -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; } \ No newline at end of file diff --git a/src/main/java/com/xydl/cac/entity/Warning.java b/src/main/java/com/xydl/cac/entity/Warning.java index 25eeff5..527f49b 100644 --- a/src/main/java/com/xydl/cac/entity/Warning.java +++ b/src/main/java/com/xydl/cac/entity/Warning.java @@ -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") diff --git a/src/main/java/com/xydl/cac/service/impl/DataServiceImpl.java b/src/main/java/com/xydl/cac/service/impl/DataServiceImpl.java index 444d09a..b747968 100644 --- a/src/main/java/com/xydl/cac/service/impl/DataServiceImpl.java +++ b/src/main/java/com/xydl/cac/service/impl/DataServiceImpl.java @@ -224,7 +224,19 @@ public class DataServiceImpl implements DataService { @Override public List> getLatestData(NSensor sensor, ModevTypePoint point, Date start) throws Exception { - return null; + List 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> page = this.doSqlData(sensor, points, model); + + return page.getContent(); } @Override diff --git a/src/main/java/com/xydl/cac/task/RuleCheckTask.java b/src/main/java/com/xydl/cac/task/RuleCheckTask.java index bb79da9..87ff6c2 100644 --- a/src/main/java/com/xydl/cac/task/RuleCheckTask.java +++ b/src/main/java/com/xydl/cac/task/RuleCheckTask.java @@ -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 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> list = dataService.getLatestData(sensor, typePoint, rule.getLastDTime()); + if (!CollectionUtils.isEmpty(list)) { + Date date = null; + for (Map 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); + } + }