You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
167 lines
5.4 KiB
Java
167 lines
5.4 KiB
Java
package com.xydl.cac.entity;
|
|
|
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
|
import com.fasterxml.jackson.annotation.JsonInclude;
|
|
import com.xydl.cac.comparator.Comparator;
|
|
import com.xydl.cac.comparator.FloatCompare;
|
|
import com.xydl.cac.comparator.IntCompare;
|
|
import com.xydl.cac.comparator.MissCompare;
|
|
import com.xydl.cac.entity.constants.Constants;
|
|
import com.xydl.cac.model.TriggerModel;
|
|
import com.xydl.cac.util.DateUtil;
|
|
import io.swagger.annotations.ApiModel;
|
|
import io.swagger.annotations.ApiModelProperty;
|
|
import lombok.AllArgsConstructor;
|
|
import lombok.Builder;
|
|
import lombok.Data;
|
|
import lombok.NoArgsConstructor;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.springframework.util.CollectionUtils;
|
|
|
|
import javax.persistence.*;
|
|
import javax.validation.constraints.NotBlank;
|
|
import javax.validation.constraints.NotNull;
|
|
import java.util.ArrayList;
|
|
import java.util.Date;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
@JsonInclude(JsonInclude.Include.NON_NULL)
|
|
@Data
|
|
@Builder
|
|
@AllArgsConstructor
|
|
@NoArgsConstructor
|
|
@Entity
|
|
@Table(name = "warn_rule")
|
|
@ApiModel("告警规则表")
|
|
@Slf4j
|
|
public class WarnRule {
|
|
|
|
@Id
|
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
|
@Column(name = "id")
|
|
private Integer id;
|
|
|
|
@NotNull(message = "监测装置ID不能为空")
|
|
@ApiModelProperty("监测装置ID")
|
|
@Column(name = "sensor_id")
|
|
private Integer sensorId;
|
|
|
|
@NotNull(message = "监测装置属性点Id不能为空")
|
|
@ApiModelProperty("监测装置属性点Id")
|
|
@Column(name = "modevtype_point_id")
|
|
private Integer modevtypePointId;
|
|
|
|
@NotBlank(message = "阈值不能为空")
|
|
@ApiModelProperty("阈值")
|
|
@Column(name = "threshold")
|
|
private String threshold;
|
|
|
|
@NotBlank(message = "比较器不能为空")
|
|
@ApiModelProperty("比较器")
|
|
@Column(name = "comparator")
|
|
private String comparator;
|
|
|
|
@NotBlank(message = "比较符不能为空")
|
|
@ApiModelProperty("比较符")
|
|
@Column(name = "operator")
|
|
private String operator;
|
|
|
|
@NotNull(message = "告警级别不能为空")
|
|
@ApiModelProperty("告警级别 0:低 1:中 2:高")
|
|
@Column(name = "level")
|
|
private Integer level;
|
|
|
|
@NotNull(message = "状态不能为空")
|
|
@ApiModelProperty("状态 0:停用 1:启用")
|
|
@Column(name = "active")
|
|
private Integer active;
|
|
|
|
@ApiModelProperty("最后数据采集时间")
|
|
@Column(name = "last_d_time")
|
|
private Date lastDTime;
|
|
|
|
@Transient
|
|
private String comparatorDesc;
|
|
@Transient
|
|
private String operatorDesc;
|
|
|
|
@Transient
|
|
private NSensor nSensor;
|
|
@Transient
|
|
private ModevTypePoint typePoint;
|
|
@Transient
|
|
@JsonIgnore
|
|
private Comparator actualComp;
|
|
|
|
public void initComparator(String comparator, String operator) {
|
|
if (actualComp != null && this.comparator.equals(comparator)) {
|
|
this.operator = operator;
|
|
actualComp.setOperator(operator);
|
|
} else {
|
|
this.comparator = comparator;
|
|
this.operator = operator;
|
|
if (Constants.FloatCompare.equalsIgnoreCase(comparator)) {
|
|
actualComp = new FloatCompare();
|
|
actualComp.setOperator(operator);
|
|
} else if (Constants.IntCompare.equalsIgnoreCase(comparator)) {
|
|
actualComp = new IntCompare();
|
|
actualComp.setOperator(operator);
|
|
} else if (Constants.MissCompare.equalsIgnoreCase(comparator)) {
|
|
actualComp = new MissCompare();
|
|
actualComp.setOperator(operator);
|
|
} else {
|
|
actualComp = null;
|
|
log.error("该规则(" + id + ")比较器(" + comparator + ")异常");
|
|
}
|
|
}
|
|
if (actualComp != null) {
|
|
this.operatorDesc = actualComp.supportedOperator().get(this.operator);
|
|
}
|
|
}
|
|
|
|
public boolean canDo() {
|
|
if (active != null && active.intValue() == 1 &&
|
|
actualComp != null && nSensor != null && typePoint != null) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// 单个数据是否触发
|
|
public boolean triggerRule(Object value) {
|
|
return actualComp.compare(value, threshold, lastDTime);
|
|
}
|
|
|
|
// 多数据触发返回告警数据
|
|
public List<TriggerModel> checkData(List<Map<String, Object>> list) throws Exception {
|
|
List<TriggerModel> result = null;
|
|
if (CollectionUtils.isEmpty(list)) {
|
|
if (Constants.MissCompare.equalsIgnoreCase(comparator)) {
|
|
boolean r = this.triggerRule(null);
|
|
if (r) {
|
|
result = new ArrayList<>();
|
|
TriggerModel model = new TriggerModel();
|
|
model.setDate(new Date());
|
|
model.setValue(String.valueOf(actualComp.getHours()));
|
|
result.add(model);
|
|
}
|
|
}
|
|
} else {
|
|
result = new ArrayList<>();
|
|
for (Map<String, Object> map : list) {
|
|
String str = (String) map.get("acquisitionTime");
|
|
lastDTime = DateUtil.parse(str);
|
|
Object value = map.get(typePoint.getField());
|
|
boolean r = this.triggerRule(value);
|
|
if (r) {
|
|
TriggerModel model = new TriggerModel();
|
|
model.setDate(lastDTime);
|
|
model.setValue(String.valueOf(value));
|
|
result.add(model);
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
} |