|
@@ -7,18 +7,24 @@ import com.persagy.cache.AlarmInfoCache;
|
|
|
import com.persagy.cache.CurrentDataCache;
|
|
|
import com.persagy.client.GroupNettyClient;
|
|
|
import com.persagy.entity.*;
|
|
|
+import com.persagy.job.ExpireAlarmQueue;
|
|
|
+import com.persagy.repository.AlarmRecordRepository;
|
|
|
import com.persagy.service.AlarmHandleService;
|
|
|
+import com.persagy.service.AlarmQuartzService;
|
|
|
import com.persagy.utils.DateUtils;
|
|
|
import com.persagy.utils.StringUtil;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.quartz.JobDataMap;
|
|
|
+import org.quartz.SchedulerException;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
-import java.util.Arrays;
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Objects;
|
|
|
+import java.time.LocalDate;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.time.LocalTime;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
+import java.util.*;
|
|
|
|
|
|
/**
|
|
|
* @description:报警处理实现类:包含报警产生和报警恢复
|
|
@@ -36,6 +42,10 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
|
|
|
CurrentDataCache currentDataCache;
|
|
|
@Autowired
|
|
|
GroupNettyClient groupNettyClient;
|
|
|
+ @Autowired
|
|
|
+ AlarmQuartzService alarmQuartzService;
|
|
|
+ @Autowired
|
|
|
+ AlarmRecordRepository alarmRecordRepository;
|
|
|
/**
|
|
|
* 集团编码
|
|
|
*/
|
|
@@ -47,15 +57,21 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
|
|
|
@Value("${system.id}")
|
|
|
public String systemId;
|
|
|
|
|
|
+ /**
|
|
|
+ * 项目名称
|
|
|
+ */
|
|
|
+ @Value("${project.id}")
|
|
|
+ String projectId;
|
|
|
+
|
|
|
@Override
|
|
|
- public void handleIOTData(String msg) {
|
|
|
+ public void handleIOTData(String msg) throws SchedulerException, InterruptedException {
|
|
|
String[] split = msg.split(";");
|
|
|
if (split.length < 4) {
|
|
|
return;
|
|
|
}
|
|
|
//返回的信息点个数
|
|
|
int nums = (split.length) / 4;
|
|
|
- System.out.println("length:"+split.length);
|
|
|
+ log.info("接收信息length:[{}]数据为:{}", nums,msg);
|
|
|
for (int i = 0; i < nums; i++) {
|
|
|
String dateTime = split[i * 4];
|
|
|
String meterId = split[i * 4 + 1];
|
|
@@ -70,7 +86,7 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
|
|
|
List<JSONObject> codeDetail = condition.getInfoCodes();
|
|
|
boolean match = codeDetail.stream().allMatch(p -> currentDataCache.hasKey(p.getString("meterId"), p.getString("funcId")));
|
|
|
if (match) {
|
|
|
- String defineId = alarmInfoCache.getAlarmDefineId(alarmDefine);
|
|
|
+ String defineId = AlarmInfoCache.getAlarmDefineId(alarmDefine);
|
|
|
String trigger = condition.getTrigger();
|
|
|
String end = condition.getEnd();
|
|
|
HashMap paramMap = new HashMap<>();
|
|
@@ -84,15 +100,24 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
|
|
|
Boolean endResult = (Boolean) endExp.execute(paramMap);
|
|
|
System.out.println("triggerResult:" + triggerResult);
|
|
|
System.out.println("endResult:" + endResult);
|
|
|
+ if (triggerResult && endResult) {
|
|
|
+ log.warn("报警触发条件和报警恢复条件同时满足,请检查,报警定义详情【{}】", alarmDefine.toString());
|
|
|
+ }
|
|
|
AlarmState alarmState = alarmInfoCache.getAlarmState(defineId);
|
|
|
if (Objects.isNull(alarmState)) {
|
|
|
alarmState = new AlarmState(defineId);
|
|
|
}
|
|
|
//报警产生值满足(这里的满足不考虑报警持续时间)
|
|
|
if (triggerResult) {
|
|
|
+ log.info("有一条满足报警条件");
|
|
|
+ log.info("--"+alarmDefine.toString());
|
|
|
+ log.info("--"+JSONObject.toJSONString(paramMap));
|
|
|
//报警的时候不考虑报警恢复,因为同时报警和报警恢复是不应该出现的
|
|
|
- handlerNowDataAlarm(alarmDefine,alarmState, dateTime, condition, defineId);
|
|
|
+ handlerNowDataAlarm(alarmDefine, alarmState, dateTime, condition, defineId,paramMap);
|
|
|
} else {
|
|
|
+ log.info("不满足报警条件");
|
|
|
+ log.info("--"+alarmDefine.toString());
|
|
|
+ log.info("--"+JSONObject.toJSONString(paramMap));
|
|
|
//当前数据正常
|
|
|
handlerNowDataNormal(alarmDefine, dateTime, condition, defineId, endResult, alarmState);
|
|
|
}
|
|
@@ -104,33 +129,34 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
|
|
|
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
/**
|
|
|
- * @description:当前数据正常判断逻辑
|
|
|
- * @exception:
|
|
|
- * @author: LuoGuangyi
|
|
|
- * @company: Persagy Technology Co.,Ltd
|
|
|
- * @param alarmDefine: 报警定义
|
|
|
+ * @param alarmDefine: 报警定义
|
|
|
* @param dateTime:IOT采集时间
|
|
|
* @param condition:报警条件
|
|
|
* @param defineId:报警定义ID
|
|
|
* @param endResult:报警恢复监测结果
|
|
|
- * @param alarmState: 报警状态时间实体
|
|
|
+ * @param alarmState: 报警状态时间实体
|
|
|
+ * @description:当前数据正常判断逻辑
|
|
|
+ * @exception:
|
|
|
+ * @author: LuoGuangyi
|
|
|
+ * @company: Persagy Technology Co.,Ltd
|
|
|
* @return: void
|
|
|
* @since: 2020/10/21 16:46
|
|
|
* @version: V1.0
|
|
|
*/
|
|
|
- private void handlerNowDataNormal(AlarmDefine alarmDefine, String dateTime, Condition condition, String defineId, Boolean endResult, AlarmState alarmState) {
|
|
|
+ private void handlerNowDataNormal(AlarmDefine alarmDefine, String dateTime, Condition condition, String defineId, Boolean endResult, AlarmState alarmState) throws InterruptedException {
|
|
|
//当前数据正常,报警状态为正常:清空之前的报警计时,重置回默认状态
|
|
|
- if (AlarmState.State.NORMAL.getType().equals(alarmState.getState())){
|
|
|
+ if (AlarmState.State.NORMAL.getType().equals(alarmState.getState())) {
|
|
|
alarmState = new AlarmState(defineId);
|
|
|
alarmInfoCache.setAlarmState(defineId, alarmState);
|
|
|
- }else if(AlarmState.State.NOT_DEAL.getType().equals(alarmState.getState())){
|
|
|
+ } else if (AlarmState.State.NOT_DEAL.getType().equals(alarmState.getState())) {
|
|
|
//报警状态异常时候
|
|
|
alarmState.setLatestDataNormalstate(true);
|
|
|
//报警恢复条件满足,判断是否满足报警恢复持续时间
|
|
|
- if(endResult){
|
|
|
+ if (endResult) {
|
|
|
String endTime = alarmState.getAlarmEndTime();
|
|
|
- if(StringUtil.isEmpty(endTime)){
|
|
|
+ if (StringUtil.isEmpty(endTime)) {
|
|
|
endTime = dateTime;
|
|
|
}
|
|
|
alarmState.setAlarmEndTime(endTime);
|
|
@@ -138,9 +164,29 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
|
|
|
//设置开始恢复时间
|
|
|
int uphold = condition.getEndUphold();
|
|
|
//超过报警恢复设置的持续时间
|
|
|
- if(DateUtils.betweenTwoTimeSecond(endTime, dateTime)>=0){
|
|
|
+ if (DateUtils.betweenTwoTimeSecond(endTime, dateTime) >= 0) {
|
|
|
log.error("产生一条报警恢复消息");
|
|
|
+ NettyMessage<JSONObject> nettyMessage = new NettyMessage<>();
|
|
|
+ nettyMessage.setOpCode(6);
|
|
|
+ JSONObject result = new JSONObject();
|
|
|
+ ZktAlarmRecordDO alarmRecordDO = alarmRecordRepository.findById(AlarmInfoCache.getAlarmDefineId(alarmDefine)).orElse(new ZktAlarmRecordDO());
|
|
|
+ //TODO : 为空处理
|
|
|
+ result.put("id", alarmRecordDO.getAlarmId());
|
|
|
+ result.put("state", "2");
|
|
|
+ result.put("groupCode", groupCode);
|
|
|
+ result.put("projectId", projectId);
|
|
|
+ nettyMessage.setContent(Arrays.asList(result));
|
|
|
+ //{"id","123", "state":1, "groupCode":"wd", "projectId":"Pj123"}
|
|
|
+ groupNettyClient.sendMessage(nettyMessage.toString());
|
|
|
+
|
|
|
log.error("产生一条取消报警过期定时任务的消息");
|
|
|
+ String jobName = AlarmInfoCache.getAlarmDefineId(alarmDefine);
|
|
|
+ ExpireAlarmMessage em = new ExpireAlarmMessage();
|
|
|
+ //取消过期消息
|
|
|
+ em.setType("2");
|
|
|
+ em.setJobName(jobName);
|
|
|
+ em.setJobGroupName("expire");
|
|
|
+ ExpireAlarmQueue.getExpireAlarmMessageQueue().produce(em);
|
|
|
//报警恢复,报警状态重置回默认
|
|
|
alarmState.reset();
|
|
|
}
|
|
@@ -150,11 +196,11 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- *
|
|
|
* @param alarmDefine 报警定义
|
|
|
- * @param dateTime :IOT数据采集时间
|
|
|
- * @param condition :报警定义条件
|
|
|
- * @param defineId :报警定义ID
|
|
|
+ * @param dateTime :IOT数据采集时间
|
|
|
+ * @param condition :报警定义条件
|
|
|
+ * @param defineId :报警定义ID
|
|
|
+ * @param paramMap 报警触发值
|
|
|
* @description:处理当前值报警的情况
|
|
|
* @exception:
|
|
|
* @author: LuoGuangyi
|
|
@@ -163,24 +209,25 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
|
|
|
* @since: 2020/10/20 22:31
|
|
|
* @version: V1.0
|
|
|
*/
|
|
|
- private void handlerNowDataAlarm(AlarmDefine alarmDefine, AlarmState alarmState, String dateTime, Condition condition, String defineId) {
|
|
|
+ private void handlerNowDataAlarm(AlarmDefine alarmDefine, AlarmState alarmState, String dateTime, Condition condition, String defineId, HashMap paramMap) throws SchedulerException, InterruptedException {
|
|
|
alarmState.setLatestDataNormalstate(false);
|
|
|
- JSONObject time = condition.getTime();
|
|
|
+ JSONObject effectTime = condition.getEffectTime();
|
|
|
boolean inEffectTime = false;
|
|
|
boolean hasExpire = true;
|
|
|
//生效时间段,有误过期时间判断
|
|
|
- if (StringUtil.isEmpty(time) || StringUtil.isEmpty(time.getString("type"))) {
|
|
|
+ if (StringUtil.isEmpty(effectTime) || StringUtil.isEmpty(effectTime.getString("type"))) {
|
|
|
//无生效时间设置,则任何时间生效
|
|
|
inEffectTime = true;
|
|
|
//没有设置生效时间,所以也没有设置过期时间
|
|
|
hasExpire = false;
|
|
|
|
|
|
- }else {
|
|
|
- if("period".equals(time.getString("type")) && "0000".equals(time.getString("$gt").substring(0,4)) && "2359".equals(time.getString("$lt").substring(0,4))){
|
|
|
+ } else {
|
|
|
+ if ("period".equals(effectTime.getJSONObject("period").getString("type")) && "000000".equals(effectTime.getJSONObject("period").getString("startTime").substring(0, 6)) && "235959".equals(effectTime.getJSONObject("period").getString("endTime").substring(0, 6))) {
|
|
|
//架构师w确认 00:00-23:59的生效时间为一值生效,23:59分不过期
|
|
|
hasExpire = false;
|
|
|
}
|
|
|
- if ("period".equals(time.getString("type")) && time.getString("$gt").compareTo(DateUtils.getSdfTimeNotDate(dateTime)) >= 0 && time.getString("$lt").compareTo(DateUtils.getSdfTimeNotDate(dateTime)) <= 0) {
|
|
|
+
|
|
|
+ if ("period".equals(effectTime.getString("type")) && effectTime.getJSONObject("period").getString("startTime").compareTo(DateUtils.getSdfTimeNotDate(dateTime)) <= 0 && effectTime.getJSONObject("period").getString("endTime").compareTo(DateUtils.getSdfTimeNotDate(dateTime)) >= 0) {
|
|
|
//在生效时间
|
|
|
inEffectTime = true;
|
|
|
} else {
|
|
@@ -191,39 +238,85 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
|
|
|
//之前是报警状态,现在还是报警,报警值没变化
|
|
|
//之前是是正常时候
|
|
|
if (AlarmState.State.NORMAL.getType().equals(alarmState.getState())) {
|
|
|
- //设置开始报警时间
|
|
|
- alarmState.setAlarmStartTime(dateTime);
|
|
|
long timeSecond = 0;
|
|
|
if (StringUtil.isNotEmpty(alarmState.getAlarmStartTime())) {
|
|
|
timeSecond = DateUtils.betweenTwoTimeSecond(alarmState.getAlarmStartTime(), dateTime);
|
|
|
}
|
|
|
+ LocalDateTime expireDateTime = null;
|
|
|
+ Date expireDate = null;
|
|
|
+ if (hasExpire && "period".equals(effectTime.getString("type"))) {
|
|
|
+ //过期时间
|
|
|
+ String expireTime = effectTime.getJSONObject("period").getString("endTime");
|
|
|
+ LocalTime localTime = LocalTime.parse(expireTime, DateTimeFormatter.ofPattern(DateUtils.sdfTimeNotDate));
|
|
|
+ expireDateTime = LocalDateTime.of(LocalDate.now(), localTime);
|
|
|
+ expireDate = DateUtils.localDateTime2Date(expireDateTime);
|
|
|
+ }
|
|
|
+ //设置开始报警时间
|
|
|
+ alarmState.setAlarmStartTime(dateTime);
|
|
|
if (timeSecond >= condition.getTriggerUphold()) {
|
|
|
log.error("大于持续时间了,产生一条报警");
|
|
|
AlarmRecord alarmRecord = AlarmRecord.builder()
|
|
|
+ .category(alarmDefine.getCategory())
|
|
|
+ .concern(alarmDefine.getConcern())
|
|
|
+ .level(alarmDefine.getLevel())
|
|
|
+ .projectId(projectId)
|
|
|
+ .state(1)
|
|
|
+ .triggerTime(DateUtils.parseDate(dateTime))
|
|
|
+ .remark(alarmDefine.getRemark())
|
|
|
+ .triggerInfo(JSONObject.toJSONString(paramMap))
|
|
|
+ .condition(condition.toString())
|
|
|
+ .effectEndTime(expireDate)
|
|
|
.groupCode(groupCode)
|
|
|
.itemCode(alarmDefine.getItemCode())
|
|
|
- .createUser(systemId)
|
|
|
- .createTime(DateUtils.getMilliByLocalDateTime(dateTime))
|
|
|
.objId(alarmDefine.getObjId())
|
|
|
+ .createUser(systemId)
|
|
|
.build();
|
|
|
NettyMessage<AlarmRecord> nettyMessage = new NettyMessage<>();
|
|
|
- nettyMessage.setOpCode(1);
|
|
|
+ nettyMessage.setOpCode(5);
|
|
|
nettyMessage.setContent(Arrays.asList(alarmRecord));
|
|
|
//推送一条报警记录给远端
|
|
|
groupNettyClient.sendMessage(nettyMessage.toString());
|
|
|
+ ZktAlarmRecordDO zktAlarmRecordDO = alarmRecordRepository.findById(defineId).orElse(new ZktAlarmRecordDO());
|
|
|
+ zktAlarmRecordDO.setDefinitionId(defineId);
|
|
|
+ zktAlarmRecordDO.setObjId(alarmDefine.getObjId());
|
|
|
+ zktAlarmRecordDO.setItemCode(alarmDefine.getItemCode());
|
|
|
+ zktAlarmRecordDO.setState("1");
|
|
|
+ alarmRecordRepository.save(zktAlarmRecordDO);
|
|
|
alarmState.setState(AlarmState.State.NOT_DEAL.getType());
|
|
|
//有过期时间,生成报警过期消息
|
|
|
- if(hasExpire && "period".equals(time.getString("type"))){
|
|
|
+ if (hasExpire && "period".equals(effectTime.getString("type"))) {
|
|
|
//过期时间
|
|
|
- String expireTime = time.getString("$lt");
|
|
|
log.error("产生一条定时过期报警消息");
|
|
|
-
|
|
|
+ String alarmId = alarmRecordRepository.findById(defineId).orElse(new ZktAlarmRecordDO()).getAlarmId();
|
|
|
+ ZktAlarmRecordDO alarmRecordDO = ZktAlarmRecordDO.builder().alarmTime(alarmState.getAlarmStartTime())
|
|
|
+ .effectEndTime(DateUtils.format(expireDateTime))
|
|
|
+ .definitionId(defineId)
|
|
|
+ .itemCode(alarmDefine.getItemCode())
|
|
|
+ .name(alarmDefine.getName())
|
|
|
+ .objId(alarmDefine.getObjId())
|
|
|
+ .state("3") //要变成已过期
|
|
|
+ .alarmId(alarmId)
|
|
|
+ .build();
|
|
|
+ JobDataMap jobDataMap = new JobDataMap();
|
|
|
+ jobDataMap.put("alarmRecord", alarmRecordDO.toString());
|
|
|
+ jobDataMap.put("refire", "0");
|
|
|
+ jobDataMap.put("expireTime", DateUtils.format(expireDateTime));
|
|
|
+ String jobName = AlarmInfoCache.getAlarmDefineId(alarmDefine);
|
|
|
+ ExpireAlarmMessage em = new ExpireAlarmMessage();
|
|
|
+ //过期消息
|
|
|
+ em.setType("1");
|
|
|
+ em.setStartTime(DateUtils.localDateTime2Date(expireDateTime));
|
|
|
+ em.setJobDataMap(jobDataMap);
|
|
|
+ em.setJobName(jobName);
|
|
|
+ em.setJobGroupName("expire");
|
|
|
+ ExpireAlarmQueue.getExpireAlarmMessageQueue().produce(em);
|
|
|
+ //alarmQuartzService.addExpireJob(DateUtils.localDateTime2Date(expireDateTime), jobName, "expire", jobDataMap);
|
|
|
}
|
|
|
} else {
|
|
|
alarmState.setState(AlarmState.State.NORMAL.getType());
|
|
|
}
|
|
|
}
|
|
|
- }else {
|
|
|
+ } else {
|
|
|
//不在生效时间的段的产生报警,要保存最近一次的数值是否是是报警
|
|
|
//其他条件全部改成默认值(不报警,不过期,报警开始时间和结束时间为空)
|
|
|
alarmState.reset();
|