Browse Source

修改重复产生报警的bug、修改报警过期时间的处理规则、代码优化

lixing 4 years ago
parent
commit
4a714cc5bb

+ 4 - 4
src/main/java/com/persagy/cache/AlarmInfoCache.java

@@ -6,7 +6,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.googlecode.aviator.AviatorEvaluator;
 import com.googlecode.aviator.Expression;
 import com.persagy.entity.AlarmDefine;
-import com.persagy.entity.AlarmState;
+import com.persagy.entity.AlarmDefineState;
 import com.persagy.entity.Condition;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
@@ -44,7 +44,7 @@ public class AlarmInfoCache {
      * 报警定义  <报警定义标识,报警时间状态>
      * 报警定义标识默认为:报警编码-报警对象id
      */
-    private ConcurrentHashMap<String, AlarmState> alarmStateMap = new ConcurrentHashMap<>();
+    private ConcurrentHashMap<String, AlarmDefineState> alarmStateMap = new ConcurrentHashMap<>();
 
     /**
      * @param :
@@ -56,7 +56,7 @@ public class AlarmInfoCache {
      * @since: 2020/10/20 17:12
      * @version: V1.0
      */
-    public AlarmState getAlarmState(String definitionId) {
+    public AlarmDefineState getAlarmState(String definitionId) {
         return alarmStateMap.get(definitionId);
     }
 
@@ -71,7 +71,7 @@ public class AlarmInfoCache {
      * @since: 2020/10/20 17:15
      * @version: V1.0
      */
-    public AlarmState setAlarmState(String definitionId, AlarmState alarmState) {
+    public AlarmDefineState setAlarmState(String definitionId, AlarmDefineState alarmState) {
         return alarmStateMap.put(definitionId, alarmState);
     }
 

+ 6 - 6
src/main/java/com/persagy/entity/AlarmState.java

@@ -11,7 +11,7 @@ import lombok.Data;
  * @version:V1.0
  **/
 @Data
-public class AlarmState {
+public class AlarmDefineState {
     /**
      * 报警定义ID
      */
@@ -20,10 +20,10 @@ public class AlarmState {
      * 报警状态( 0-正常 1-报警)
      */
     private String state = "0";
-    /**
-     * 最近下一次数据正常状态
-     */
-    private boolean latestDataNormalstate = true;
+//    /**
+//     * 最近下一次数据正常状态
+//     */
+//    private boolean latestDataNormalstate = true;
     /**
      * 是否过期(0-未过期,1-已过期)
      */
@@ -37,7 +37,7 @@ public class AlarmState {
      */
     private String alarmEndTime = "";
 
-    public AlarmState(String definitionId) {
+    public AlarmDefineState(String definitionId) {
         this.definitionId = definitionId;
     }
 

+ 2 - 2
src/main/java/com/persagy/job/AlarmExpireJob.java

@@ -6,7 +6,7 @@ import cn.hutool.core.date.DateUtil;
 import com.persagy.cache.AlarmInfoCache;
 import com.persagy.client.GroupNettyClient;
 import com.persagy.entity.AlarmRecord;
-import com.persagy.entity.AlarmState;
+import com.persagy.entity.AlarmDefineState;
 import com.persagy.entity.NettyMessage;
 import com.persagy.entity.ZktAlarmRecordDO;
 import com.persagy.repository.AlarmRecordRepository;
@@ -132,7 +132,7 @@ public class AlarmExpireJob extends QuartzJobBean {
                 //{"id","123", "state":1, "groupCode":"wd", "projectId":"Pj123"}
                 groupNettyClient.sendMessage(nettyMessage.toString());
                 //已经过期的时候删除掉这条报警定义了,保证不会再次产生报警
-                AlarmState alarmState = new AlarmState(defineId);
+                AlarmDefineState alarmState = new AlarmDefineState(defineId);
                 alarmInfoCache.setAlarmState(defineId, alarmState);
                 if (alarmRecordRepository.existsById(zktAlarmRecordDO.getDefinitionId())) {
                     alarmRecordRepository.deleteById(zktAlarmRecordDO.getDefinitionId());

+ 184 - 112
src/main/java/com/persagy/service/impl/AlarmHandleServiceImpl.java

@@ -91,16 +91,19 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
                 for (AlarmDefine alarmDefine : alarmDefines) {
                     Condition condition = alarmDefine.getCondition();
                     List<JSONObject> codeDetail = condition.getInfoCodes();
-                    boolean match = codeDetail.stream().allMatch(p -> currentDataCache.hasKey(p.getString("meterId"), p.getString("funcId")));
+                    boolean match = codeDetail.stream().allMatch(
+                            p -> currentDataCache.hasKey(p.getString("meterId"), p.getString("funcId"))
+                    );
                     //报警定义的所有信息点都有采集数值,具备判断条件
                     if (match) {
                         String defineId = AlarmInfoCache.getAlarmDefineId(alarmDefine);
                         String trigger = condition.getTrigger();
                         String end = condition.getEnd();
-                        HashMap paramMap = new HashMap<>();
-                        for (int j = 0; j < codeDetail.size(); j++) {
-                            JSONObject code = codeDetail.get(j);
-                            paramMap.put(code.getString("infoCode"), currentDataCache.getCurrentData(code.getString("meterId"), code.getString("funcId")));
+                        HashMap<String, Object> paramMap = new HashMap<>();
+                        for (JSONObject code : codeDetail) {
+                            paramMap.put(
+                                    code.getString("infoCode"),
+                                    currentDataCache.getCurrentData(code.getString("meterId"), code.getString("funcId")));
                         }
                         Expression triggerExp = AviatorEvaluator.compile(trigger, true);
                         Expression endExp = AviatorEvaluator.compile(end, true);
@@ -112,20 +115,20 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
                         }
                         // 使用intern()方法,确保上锁的是同一个String对象
                         synchronized (defineId.intern()) {
-                            AlarmState alarmState = getAlarmStateFromCacheOrDb(defineId);
+
                             //报警产生值满足(这里的满足不考虑报警持续时间)
                             if (triggerResult) {
                                 log.info("有一条满足报警条件");
                                 log.info("--" + alarmDefine.toString());
                                 log.info("--" + JSONObject.toJSONString(paramMap));
                                 //报警的时候不考虑报警恢复,因为同时报警和报警恢复是不应该出现的
-                                handlerNowDataAlarm(alarmDefine, alarmState, dateTime, condition, defineId, paramMap);
+                                handlerNowDataAlarm(alarmDefine, dateTime, paramMap);
                             } else {
                                 log.info("不满足报警条件");
                                 log.info("--" + alarmDefine.toString());
                                 log.info("--" + JSONObject.toJSONString(paramMap));
                                 //当前数据正常
-                                handlerNowDataNormal(alarmDefine, dateTime, condition, defineId, endResult, alarmState, paramMap);
+                                handlerNowDataNormal(alarmDefine, dateTime, endResult, paramMap);
                             }
                         }
                     } else {
@@ -147,17 +150,17 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
      * @since: 2021/1/8 上午11:05
      * @version: V1.0
      */
-    private AlarmState getAlarmStateFromCacheOrDb(String defineId) {
-        AlarmState alarmState = alarmInfoCache.getAlarmState(defineId);
+    private AlarmDefineState getAlarmStateFromCacheOrDb(String defineId) {
+        AlarmDefineState alarmState = alarmInfoCache.getAlarmState(defineId);
         if (Objects.isNull(alarmState)) {
             //默认正常报警状态
-            alarmState = new AlarmState(defineId);
+            alarmState = new AlarmDefineState(defineId);
             Optional<ZktAlarmRecordDO> recordOptional = alarmRecordRepository.findById(defineId);
             if (recordOptional.isPresent()) {
                 ZktAlarmRecordDO alarmRecordDO = recordOptional.get();
                 //数据库报警状态:1-未处理
                 if ("1".equals(alarmRecordDO.getState())) {
-                    alarmState.setState(AlarmState.State.NOT_DEAL.getType());
+                    alarmState.setState(AlarmDefineState.State.NOT_DEAL.getType());
                     alarmState.setAlarmStartTime(alarmRecordDO.getAlarmTime());
                 }
             }
@@ -168,10 +171,7 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
     /**
      * @param alarmDefine :       报警定义
      * @param dateTime    :IOT采集时间
-     * @param condition   :报警条件
-     * @param defineId    :报警定义ID
      * @param endResult   :报警恢复监测结果
-     * @param alarmState  :        报警状态时间实体
      * @param paramMap    报警恢复触发值
      * @description:当前数据正常判断逻辑
      * @exception:
@@ -181,14 +181,19 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
      * @since: 2020/10/21 16:46
      * @version: V1.0
      */
-    private void handlerNowDataNormal(AlarmDefine alarmDefine, String dateTime, Condition condition, String defineId, Boolean endResult, AlarmState alarmState, HashMap paramMap) throws InterruptedException {
+    private void handlerNowDataNormal(
+            AlarmDefine alarmDefine, String dateTime,
+            Boolean endResult, HashMap<String, Object> paramMap) throws InterruptedException {
+        String defineId = AlarmInfoCache.getAlarmDefineId(alarmDefine);
+        AlarmDefineState alarmState = getAlarmStateFromCacheOrDb(defineId);
+        Condition condition = alarmDefine.getCondition();
         //当前数据正常,报警状态为正常:清空之前的报警计时,重置回默认状态
-        if (AlarmState.State.NORMAL.getType().equals(alarmState.getState())) {
-            alarmState = new AlarmState(defineId);
+        if (AlarmDefineState.State.NORMAL.getType().equals(alarmState.getState())) {
+            alarmState = new AlarmDefineState(defineId);
             alarmInfoCache.setAlarmState(defineId, alarmState);
-        } else if (AlarmState.State.NOT_DEAL.getType().equals(alarmState.getState())) {
-            //报警状态异常时候
-            alarmState.setLatestDataNormalstate(true);
+        } else if (AlarmDefineState.State.NOT_DEAL.getType().equals(alarmState.getState())) {
+            //            //报警状态异常时候
+            //            alarmState.setLatestDataNormalstate(true);
             //报警恢复条件满足,判断是否满足报警恢复持续时间
             if (endResult) {
                 String endTime = alarmState.getAlarmEndTime();
@@ -277,7 +282,8 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
      * @since: 2020/12/17 4:40 下午
      * @version: V1.0
      */
-    private void sendAlarmContinueMessage(String alarmId, long lastTime, HashMap paramMap, String projectId) throws InterruptedException {
+    private void sendAlarmContinueMessage(String alarmId, long lastTime, HashMap<String, Object> paramMap, String projectId)
+            throws InterruptedException {
         NettyMessage<JSONObject> nettyMessage = new NettyMessage<>(11, projectId);
         JSONObject jsonObject = new JSONObject();
         jsonObject.put("id", alarmId);
@@ -291,8 +297,6 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
     /**
      * @param alarmDefine 报警定义
      * @param dateTime    :IOT数据采集时间
-     * @param condition   :报警定义条件
-     * @param defineId    :报警定义ID
      * @param paramMap    报警触发值
      * @description:处理当前值报警的情况
      * @exception:
@@ -302,20 +306,22 @@ 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, HashMap paramMap) throws SchedulerException, InterruptedException {
-        alarmState.setLatestDataNormalstate(false);
+    private void handlerNowDataAlarm(
+            AlarmDefine alarmDefine, String dateTime,
+            HashMap<String, Object> paramMap) throws InterruptedException {
+        // 根据defineId获取报警定义状态
+        String defineId = AlarmInfoCache.getAlarmDefineId(alarmDefine);
+        AlarmDefineState alarmDefineState = getAlarmStateFromCacheOrDb(defineId);
 
-        JSONObject effectTime = condition.getEffectTime();
+        Condition condition = alarmDefine.getCondition();
         // 判断报警是否在有效期内
         boolean inEffectTime = ConditionUtil.inEffectiveTime(condition, dateTime);
-        // 判断过期设置是否生效
-        boolean expireSetEffective = ConditionUtil.expireSetEffective(condition);
 
         if (inEffectTime) {
             // 之前是报警状态,现在还是报警(可能并未产生报警记录,只是连续触发了报警条件)
-            if (AlarmState.State.NOT_DEAL.getType().equals(alarmState.getState())) {
+            if (AlarmDefineState.State.NOT_DEAL.getType().equals(alarmDefineState.getState())) {
                 // 获取报警持续时间
-                String alarmStartTime = alarmState.getAlarmStartTime();
+                String alarmStartTime = alarmDefineState.getAlarmStartTime();
                 long lastTime = DateUtils.betweenTwoTimeSecond(alarmStartTime, dateTime);
                 String alarmId = alarmRecordRepository.findById(defineId).orElse(new ZktAlarmRecordDO()).getAlarmId();
                 // 如果已经产生了报警记录
@@ -324,99 +330,165 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
                     sendAlarmContinueMessage(alarmId, lastTime, paramMap, alarmDefine.getProjectId());
                 }
             }
-            //之前是是正常时候
-            if (AlarmState.State.NORMAL.getType().equals(alarmState.getState())) {
-                long timeSecond = 0;
-                if (StringUtil.isNotEmpty(alarmState.getAlarmStartTime())) {
-                    timeSecond = DateUtils.betweenTwoTimeSecond(alarmState.getAlarmStartTime(), dateTime);
+            //之前是是正常状态
+            if (AlarmDefineState.State.NORMAL.getType().equals(alarmDefineState.getState())) {
+                // 报警持续时间
+                long alarmLastTime = 0;
+                if (StringUtil.isNotEmpty(alarmDefineState.getAlarmStartTime())) {
+                    alarmLastTime = DateUtils.betweenTwoTimeSecond(alarmDefineState.getAlarmStartTime(), dateTime);
                 } else {
                     //设置开始报警时间
-                    alarmState.setAlarmStartTime(dateTime);
-                }
-                LocalDateTime expireDateTime = null;
-                Date expireDate = null;
-                if (expireSetEffective && "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);
+                    alarmDefineState.setAlarmStartTime(dateTime);
                 }
 
-                if (timeSecond >= condition.getTriggerUphold()) {
-                    log.warn("大于持续时间了,产生一条报警[{}]>[{}]", timeSecond, condition.getTriggerUphold());
-                    AlarmRecord alarmRecord = AlarmRecord.builder()
-                            .category(alarmDefine.getCategory())
-                            .concern(alarmDefine.getConcern())
-                            .level(alarmDefine.getLevel())
-                            .projectId(alarmDefine.getProjectId())
-                            .state(1)
-                            .triggerTime(DateUtils.parseDate(dateTime))
-                            .remark(alarmDefine.getRemark())
-                            .triggerInfo(JSONObject.toJSONString(paramMap))
-                            .condition(condition.toString())
-                            .effectEndTime(expireDate)
-                            .groupCode(groupCode)
-                            .itemCode(alarmDefine.getItemCode())
-                            .objId(alarmDefine.getObjId())
-                            .classCode(alarmDefine.getClassCode())
-                            .createUser(systemId)
-                            .build();
-                    NettyMessage<AlarmRecord> nettyMessage = new NettyMessage<>(5, alarmDefine.getProjectId());
-                    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");
-                    zktAlarmRecordDO.setProjectId(alarmDefine.getProjectId());
-                    alarmRecordRepository.save(zktAlarmRecordDO);
-                    alarmState.setState(AlarmState.State.NOT_DEAL.getType());
+                // 获取报警过期时间
+                LocalDateTime expireDateTime = getExpireLocalDateTime(dateTime, condition);
+
+                if (alarmLastTime >= condition.getTriggerUphold()) {
+                    log.info("defineId: [{}]", defineId);
+                    log.info("大于持续时间了,产生一条报警[{}]>[{}]", alarmLastTime, condition.getTriggerUphold());
+                    // 发送创建报警记录的消息
+                    sendCreateAlarmRecordMessage(alarmDefine, dateTime, paramMap,
+                            DateUtils.localDateTime2Date(expireDateTime));
+                    // 边缘端保存报警信息
+                    saveZktAlarmRecord(alarmDefine);
+                    // 报警定义状态更新为未处理
+                    alarmDefineState.setState(AlarmDefineState.State.NOT_DEAL.getType());
                     //有过期时间,生成报警过期消息
-                    if (expireSetEffective && "period".equals(effectTime.getString("type"))) {
+                    if (expireDateTime != null) {
                         //过期时间
-                        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));
-                        jobDataMap.put("defineId", defineId);
-                        //过期
-                        jobDataMap.put("state", "3");
-                        String jobName = defineId;
-                        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);
+                        log.info("产生一条定时过期报警消息");
+                        // 创建一条过期任务
+                        createExpireJob(alarmDefine, alarmDefineState, expireDateTime);
                     }
                 }
             }
         } else {
-            //不在生效时间的段的产生报警,要保存最近一次的数值是否是是报警
-            //其他条件全部改成默认值(不报警,不过期,报警开始时间和结束时间为空)
+            // 其他条件全部改成默认值(不报警,不过期,报警开始时间和结束时间为空)
             log.info("defineId: [{}]", defineId);
             log.info("[{}]不在生效时间,重置报警状态", dateTime);
-            log.info("生效时间为:[{}]", effectTime.toJSONString());
-            alarmState.reset();
+            log.info("生效时间为:[{}]", condition.getEffectTime());
+            alarmDefineState.reset();
+        }
+        alarmInfoCache.setAlarmState(defineId, alarmDefineState);
+    }
+
+    /**
+     * @description: 获取报警过期时间
+     * @param: triggerTime 报警触发时间
+     * @param: condition 报警条件
+     * @return: java.time.LocalDateTime
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2021/1/8 下午6:16
+     * @version: V1.0
+     */
+    private LocalDateTime getExpireLocalDateTime(String triggerTime, Condition condition) {
+        // 判断过期设置是否生效
+        boolean expireSetEffective = ConditionUtil.expireSetEffective(condition);
+
+        if (!expireSetEffective) {
+            return null;
         }
-        alarmInfoCache.setAlarmState(defineId, alarmState);
+        
+        //过期时间
+        String expireTime = ConditionUtil.getEffectEndTime(condition);
+        LocalTime localTime = LocalTime.parse(expireTime, DateTimeFormatter.ofPattern(DateUtils.sdfTimeNotDate));
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DateUtils.sdfDay);
+        LocalDate triggerDate = LocalDate.parse(DateUtils.getDate(triggerTime), formatter);
+        return LocalDateTime.of(triggerDate, localTime);
+    }
+
+    private void createExpireJob(AlarmDefine alarmDefine, AlarmDefineState alarmDefineState, LocalDateTime expireDateTime) throws InterruptedException {
+        String defineId = AlarmInfoCache.getAlarmDefineId(alarmDefine);
+        String alarmId = alarmRecordRepository.findById(defineId).orElse(new ZktAlarmRecordDO()).getAlarmId();
+        ZktAlarmRecordDO alarmRecordDO = ZktAlarmRecordDO.builder()
+                .alarmTime(alarmDefineState.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));
+        jobDataMap.put("defineId", defineId);
+        //过期
+        jobDataMap.put("state", "3");
+        ExpireAlarmMessage em = new ExpireAlarmMessage();
+        //过期消息
+        em.setType("1");
+        em.setStartTime(DateUtils.localDateTime2Date(expireDateTime));
+        em.setJobDataMap(jobDataMap);
+        em.setJobName(defineId);
+        em.setJobGroupName("expire");
+        ExpireAlarmQueue.getExpireAlarmMessageQueue().produce(em);
+    }
+
+    /**
+     * @description: 边缘端保存报警信息
+     * @param: alarmDefine 报警定义
+     * @return: void
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2021/1/8 下午5:55
+     * @version: V1.0
+     */
+    private void saveZktAlarmRecord(AlarmDefine alarmDefine) {
+        String defineId = AlarmInfoCache.getAlarmDefineId(alarmDefine);
+        ZktAlarmRecordDO zktAlarmRecordDO = alarmRecordRepository.findById(defineId).orElse(new ZktAlarmRecordDO());
+        zktAlarmRecordDO.setDefinitionId(defineId);
+        zktAlarmRecordDO.setObjId(alarmDefine.getObjId());
+        zktAlarmRecordDO.setItemCode(alarmDefine.getItemCode());
+        zktAlarmRecordDO.setState("1");
+        zktAlarmRecordDO.setProjectId(alarmDefine.getProjectId());
+        alarmRecordRepository.save(zktAlarmRecordDO);
+    }
+
+    /**
+     * @description: 发送创建报警记录消息
+     * @param: alarmDefine 报警定义
+     * @param: triggerTime 触发时间
+     * @param: triggerInfo 触发值
+     * @param: expireDate 过期时间
+     * @return: void
+     * @exception:
+     * @author: lixing
+     * @company: Persagy Technology Co.,Ltd
+     * @since: 2021/1/8 下午5:38
+     * @version: V1.0
+     */
+    private void sendCreateAlarmRecordMessage(
+            AlarmDefine alarmDefine, String triggerTime,
+            HashMap<String, Object> triggerInfo, Date expireDate) throws InterruptedException {
+        Condition condition = alarmDefine.getCondition();
+        AlarmRecord alarmRecord = AlarmRecord.builder()
+                .category(alarmDefine.getCategory())
+                .concern(alarmDefine.getConcern())
+                .level(alarmDefine.getLevel())
+                .projectId(alarmDefine.getProjectId())
+                .state(1)
+                .triggerTime(DateUtils.parseDate(triggerTime))
+                .remark(alarmDefine.getRemark())
+                .triggerInfo(JSONObject.toJSONString(triggerInfo))
+                .condition(condition.toString())
+                .effectEndTime(expireDate)
+                .groupCode(groupCode)
+                .itemCode(alarmDefine.getItemCode())
+                .objId(alarmDefine.getObjId())
+                .classCode(alarmDefine.getClassCode())
+                .createUser(systemId)
+                .build();
+        NettyMessage<AlarmRecord> nettyMessage = new NettyMessage<>(5, alarmDefine.getProjectId());
+        nettyMessage.setContent(Collections.singletonList(alarmRecord));
+        //推送一条报警记录给远端
+        groupNettyClient.sendMessage(nettyMessage.toString());
     }
 }

File diff suppressed because it is too large
+ 319 - 318
src/main/java/com/persagy/utils/DateUtils.java