소스 검색

报警隔离和屏蔽功能

lgy 4 년 전
부모
커밋
560eeb24d7

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

@@ -28,12 +28,14 @@ import java.util.stream.Collectors;
 @Component
 @Slf4j
 public class AlarmInfoCache {
-
     /**
      * 报警定义  <报警定义标识,报警定义详情>
      * 报警定义标识默认为:报警编码-报警对象id
      */
     private ConcurrentHashMap<String, AlarmDefine> alarmDefineMap = new ConcurrentHashMap<>();
+
+
+    public static List<String> isolationSystemList = new ArrayList<>();
     /**
      * 信息点-报警定义 <表号-功能号,[报警定义1,报警定义2]>
      */
@@ -150,9 +152,14 @@ public class AlarmInfoCache {
      * @version: V1.0
      */
     public void putAlarmDefinitionById(String definitionId, AlarmDefine alarmDefine) {
-        if (alarmDefine.getOpen() == 0) {
-            return;
-        }
+//        if (alarmDefine.getOpen() == 0) {
+//            log.info("报警定义ID为[{}]已经屏蔽", definitionId);
+//            return;
+//        }
+//        if(AlarmInfoCache.isolationSystemList.contains(alarmDefine.getSystemCode())){
+//            log.info("报警定义ID为[{}]的系统[{}]已经隔离,不产生报警", definitionId, alarmDefine.getSystemCode());
+//            return;
+//        }
         Condition condition = alarmDefine.getCondition();
         List<JSONObject> infoCodes = condition.getInfoCodes();
         if (CollectionUtil.isEmpty(infoCodes)) {

+ 12 - 3
src/main/java/com/persagy/client/GroupNettyClientHandler.java

@@ -5,6 +5,7 @@ import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.date.TimeInterval;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.TypeReference;
+import com.persagy.cache.AlarmInfoCache;
 import com.persagy.entity.AlarmDefine;
 import com.persagy.entity.NettyMessage;
 import com.persagy.entity.ZktAlarmRecordDO;
@@ -71,10 +72,10 @@ public class GroupNettyClientHandler extends ChannelInboundHandlerAdapter {
     @Override
     public void channelActive(ChannelHandlerContext ctx) throws Exception {
         log.info("Connected to: " + ctx.channel().remoteAddress());
-        ctx.channel().writeAndFlush(new NettyMessage<>(200, groupNettyClient.getProjectId()).toString());
+        ctx.channel().writeAndFlush(new NettyMessage<>(200, groupNettyClient.getProjectId(),groupNettyClient.getGroupCode()).toString());
         //启动的时候发送消息,获取全部报警定义
         //{"groupCode":"wd", "projectId":"Pj123"}
-        NettyMessage nettyMessage = new NettyMessage(4, groupNettyClient.getProjectId());
+        NettyMessage nettyMessage = new NettyMessage(4, groupNettyClient.getProjectId(),groupNettyClient.getGroupCode());
         nettyMessage.setRemark("连接已经建立;");
         JSONObject content = new JSONObject();
         content.put("groupCode", groupNettyClient.getGroupCode());
@@ -154,6 +155,14 @@ public class GroupNettyClientHandler extends ChannelInboundHandlerAdapter {
                 if (CollectionUtil.isNotEmpty(definesList)) {
                     alarmDefineService.deleteAlarmDefine(definesList);
                 }
+            } else if (message.getOpCode() == 11) {
+                //更新隔离的系统对象
+                NettyMessage<String> AlarmDefineMessage = JSONObject.parseObject(String.valueOf(msg), new TypeReference<NettyMessage<String>>() {
+                });
+                List<String> isolationSystemList = AlarmDefineMessage.getContent();
+                if (CollectionUtil.isNotEmpty(isolationSystemList)) {
+                    AlarmInfoCache.isolationSystemList = isolationSystemList;
+                }
             } else if (message.getOpCode() == 8) {
                 log.info("-----报警记录id推送----[{}]", message);
                 //{"id":"","objId":"","itemCode":""}  id为报警记录ID
@@ -170,7 +179,7 @@ public class GroupNettyClientHandler extends ChannelInboundHandlerAdapter {
                     alarmRecordRepository.save(zktAlarmRecordDO);
                 }
             }
-            NettyMessage response = new NettyMessage(3, groupNettyClient.getProjectId());
+            NettyMessage response = new NettyMessage(3, groupNettyClient.getProjectId(),groupNettyClient.getGroupCode());
             response.setRemark("已经收到消息");
             channelHandlerContext.write(response.toString());
         }

+ 1 - 1
src/main/java/com/persagy/client/WebSocketClientFactory.java

@@ -111,7 +111,7 @@ public class WebSocketClientFactory {
                         log.error("解密失败!", e);
                     }
                 }
-                log.info("接收信息为:{}", message);
+//                log.info("接收信息为:{}", message);
                 try {
                     while (!LockUtil.getInstance().isExecute()) {
                         try {

+ 1 - 1
src/main/java/com/persagy/controller/HelloWorld.java

@@ -48,7 +48,7 @@ public class HelloWorld {
 
     @PostMapping("/testMesage")
     public String testMesage(@RequestBody JSONObject jsonObject) throws Exception {
-        NettyMessage nettyMessage = new NettyMessage(4, groupNettyClient.getProjectId());
+        NettyMessage nettyMessage = new NettyMessage(4, groupNettyClient.getProjectId(),groupNettyClient.getGroupCode());
         nettyMessage.setRemark("连接已经建立;");
         JSONObject content = new JSONObject();
         content.put("groupCode", groupNettyClient.getGroupCode());

+ 8 - 0
src/main/java/com/persagy/entity/AlarmDefine.java

@@ -45,6 +45,14 @@ public class AlarmDefine {
      */
     private String objId;
     /**
+     * 系统编码
+     */
+    private String systemCode;
+    /**
+     * 系统名称
+     */
+    private String systemName;
+    /**
      * 报警匹配规则ID
      */
     private String targetId;

+ 9 - 4
src/main/java/com/persagy/entity/NettyMessage.java

@@ -26,7 +26,8 @@ public class NettyMessage<T> {
      * 8-云端把报警记录的id推送到边缘端
      * 9-边缘端取报警定义,云端推送给边缘端的标记(全量报警定义)
      * 10-云端推送删除的报警定义给边缘端(增量删除报警定义)、
-     * 200 - 建立连接,此时的source == 项目id
+     * 11-云端下发隔离系统给边缘端
+     * 200 - 建立连接,此时的projectId == 项目id
      */
     @JSONField()
     private int opCode;
@@ -34,7 +35,10 @@ public class NettyMessage<T> {
      * 请求来源
      */
     @JSONField()
-    private String source = "project";
+    private String projectId = "project";
+
+
+    private String groupCode;
 
     /**
      * 传输内容
@@ -53,9 +57,10 @@ public class NettyMessage<T> {
     @JSONField()
     private Boolean success;
 
-    public NettyMessage(int opCode, String source) {
+    public NettyMessage(int opCode, String projectId, String groupCode) {
         this.opCode = opCode;
-        this.source = source;
+        this.projectId = projectId;
+        this.groupCode = groupCode;
     }
 
     public List<T> getContent() {

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

@@ -118,7 +118,7 @@ public class AlarmExpireJob extends QuartzJobBean {
                     return;
                 }
                 log.info("报警参数为:[{}]", zktAlarmRecordDO.toString());
-                NettyMessage<AlarmRecord> nettyMessage = new NettyMessage<>(6, projectId);
+                NettyMessage<AlarmRecord> nettyMessage = new NettyMessage<>(6, projectId,groupCode);
                 nettyMessage.setStreamId(nums.getAndIncrement());
                 AlarmRecord message = AlarmRecord.builder()
                         .id(alarmId)

+ 1 - 1
src/main/java/com/persagy/job/SpringSchedule.java

@@ -27,7 +27,7 @@ public class SpringSchedule {
 
     @Scheduled(cron = "${alarm.get.all.alarmdefine.cron}")
     public void allResetCron() throws InterruptedException {
-        NettyMessage message = new NettyMessage(4, groupNettyClient.getProjectId());
+        NettyMessage message = new NettyMessage(4, groupNettyClient.getProjectId(),groupNettyClient.getGroupCode());
         groupNettyClient.sendMessage(message.toString());
     }
 

+ 2 - 0
src/main/java/com/persagy/service/AlarmDefineService.java

@@ -17,4 +17,6 @@ public interface AlarmDefineService {
     void listSomeAlarmDefine(List<AlarmDefine> alarmDefineList);
 
     void deleteAlarmDefine(List<AlarmDefine> alarmDefineList);
+
+    void updateAlarmDefine();
 }

+ 26 - 0
src/main/java/com/persagy/service/impl/AlarmDefineServiceImpl.java

@@ -1,5 +1,6 @@
 package com.persagy.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.persagy.cache.AlarmInfoCache;
 import com.persagy.entity.AlarmDefine;
 import com.persagy.service.AlarmDefineService;
@@ -7,6 +8,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * @description:报警定义逻辑实现类(项目报警定义全量获取,报警定义添加修改删除同步更新)
@@ -112,4 +114,28 @@ public class AlarmDefineServiceImpl implements AlarmDefineService {
             alarmInfoCache.clearAlarmDefine(alarmDefine);
         }
     }
+
+    /**
+     * @description: 更新报警定义,把系统隔离的报警全部移除
+     * 因为隔离和屏蔽的报警定义不产生报警,但是要恢复,所以只能实时判断,所有作废
+     * @author: LuoGuangyi
+     * @createTime: 2021/03/25 18:08
+     * @param
+     * @return: void
+     * @expression
+     */
+    @Override
+    @Deprecated
+    public void updateAlarmDefine() {
+        ConcurrentHashMap<String, AlarmDefine> alarmDefineMap = alarmInfoCache.getAlarmDefineMap();
+        if (ObjectUtil.isNotEmpty(alarmDefineMap)) {
+            return;
+        }
+        for (AlarmDefine alarmDefine : alarmDefineMap.values()) {
+            if(AlarmInfoCache.isolationSystemList.contains(alarmDefine.getSystemCode())){
+                alarmInfoCache.clearAlarmDefine(alarmDefine);
+            }
+        }
+    }
+
 }

+ 12 - 8
src/main/java/com/persagy/service/impl/AlarmHandleServiceImpl.java

@@ -138,15 +138,19 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
                     }
                     //报警产生值满足(这里的满足不考虑报警持续时间)
                     if (triggerResult) {
-                        log.info("有一条满足报警条件");
-                        log.info("--" + alarmDefine.toString());
-                        log.info("--" + JSONObject.toJSONString(paramMap));
+                        log.info("有一条满足报警条件{},----{}",paramMap,alarmDefine.getCondition());
+                        if (alarmDefine.getOpen() == 0) {
+                            log.info("报警定义ID为[{}]已经屏蔽", defineId);
+                            return;
+                        }
+                        if(AlarmInfoCache.isolationSystemList.contains(alarmDefine.getSystemCode())){
+                            log.info("报警定义ID为[{}]的系统[{}]已经隔离,不产生报警", defineId, alarmDefine.getSystemCode());
+                            return;
+                        }
                         //报警的时候不考虑报警恢复,因为同时报警和报警恢复是不应该出现的
                         handlerNowDataAlarm(alarmDefine, alarmState, dateTime, condition, defineId, paramMap, meterId, funcId, value);
                     } else {
-                        log.info("不满足报警条件");
-                        log.info("--" + alarmDefine.toString());
-                        log.info("--" + JSONObject.toJSONString(paramMap));
+                        log.info("不满足报警条件{},----{}",paramMap,alarmDefine.getCondition());
                         //当前数据正常
                         handlerNowDataNormal(alarmDefine, dateTime, condition, defineId, endResult, alarmState, paramMap, meterId, funcId, value);
                     }
@@ -201,7 +205,7 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
             //超过报警恢复设置的持续时间
             if (DateUtils.betweenTwoTimeSecond(endTime, dateTime) >= uphold) {
                 log.error("产生一条报警恢复消息[{}]>[{}]", DateUtils.betweenTwoTimeSecond(endTime, dateTime), uphold);
-                NettyMessage<AlarmRecord> nettyMessage = new NettyMessage<>(6, projectId);
+                NettyMessage<AlarmRecord> nettyMessage = new NettyMessage<>(6, projectId,groupCode);
                 ZktAlarmRecordDO alarmRecordDO = alarmRecordRepository.findById(AlarmInfoCache.getAlarmDefineId(alarmDefine)).orElse(new ZktAlarmRecordDO());
                 alarmRecordDO.setDefinitionId(defineId);
                 alarmRecordDO.setObjId(alarmDefine.getObjId());
@@ -373,7 +377,7 @@ public class AlarmHandleServiceImpl implements AlarmHandleService {
                     .classCode(alarmDefine.getClassCode())
                     .createUser(systemId)
                     .build();
-            NettyMessage<AlarmRecord> nettyMessage = new NettyMessage<>(5, projectId);
+            NettyMessage<AlarmRecord> nettyMessage = new NettyMessage<>(5, projectId,groupCode);
             nettyMessage.setContent(Arrays.asList(alarmRecord));
             //推送一条报警记录给远端
             groupNettyClient.sendMessage(nettyMessage.toString());

+ 24 - 0
src/main/resources/application-16Pj3201110003.yml

@@ -0,0 +1,24 @@
+group:
+  #需要更改
+  code: HY   #标识哪个接团 南京弘扬
+  alarm:
+    #需要更改
+    host: 39.102.43.179 #netty IP39.102.43.179
+    #需要更改
+    port: 9986          #netty 端口8826
+    #需要更改
+terminal: #边缘端IOT采集程序地址
+  alarm: # 拼接后的地址为ws://host:port/suffix
+    #需要更改
+    compress: false    #采用的是压缩方式还是不压缩方式  true-压缩 false-不压缩
+    #需要更改
+    host: 39.96.55.242  #172.17.233.176
+    #需要更改
+    port: 9984 #9984
+    #需要更改
+    suffix: websocket   #websocker后缀
+project:
+  #需要更改
+  iotid: 3201110003 #iot使用项目ID,不包含PJ
+  #需要更改
+  id: Pj3201110003 #南京弘扬项目ID