浏览代码

修复报警过期消息bug

lixing 2 年之前
父节点
当前提交
6940eb50a0
共有 1 个文件被更改,包括 230 次插入0 次删除
  1. 230 0
      src/main/java/com/persagy/cache/AlarmInfoCache.java

+ 230 - 0
src/main/java/com/persagy/cache/AlarmInfoCache.java

@@ -25,6 +25,79 @@ import java.util.concurrent.ConcurrentHashMap;
 @Component
 @Slf4j
 public class AlarmInfoCache {
+
+    /**
+     * 报警对象id -> (条件Id,报警类型编码)列表,项目id
+     * objId -> {[{conditionId, itemCode}], projectId}
+     * 为线程安全,使用concurrentHashMap
+     */
+    private final ConcurrentHashMap<String, ObjConditionInfo> objConditionMap = new ConcurrentHashMap<>();
+
+    /**
+     * 报警条件id -> 报警条件
+     */
+    private final ConcurrentHashMap<String, AlarmCondition> alarmConditionMap = new ConcurrentHashMap<>();
+
+    /**
+     * (报警类型编码-报警对象id) -> 状态
+     * 报警类型和设备id可以确认唯一的报警条件
+     */
+    private final ConcurrentHashMap<String, AlarmConditionState> alarmConditionStateMap = new ConcurrentHashMap<>();
+
+    /**
+     * @param :
+     * @description:获取报警定义状态 <报警定义标识,报警时间状态>
+     * @exception:
+     * @author: LuoGuangyi
+     * @company: Persagy Technology Co.,Ltd
+     * @return: null
+     * @since: 2020/10/20 17:12
+     * @version: V1.0
+     */
+    public AlarmConditionState getAlarmDefineState(String definitionId) {
+        return alarmConditionStateMap.get(definitionId);
+    }
+
+    /**
+     * @param definitionId:        报警定义id
+     * @param alarmConditionState: 报警状态时间类
+     * @description:设置报警定义
+     * @exception:
+     * @author: LuoGuangyi
+     * @company: Persagy Technology Co.,Ltd
+     * @return: com.persagy.entity.AlarmState
+     * @since: 2020/10/20 17:15
+     * @version: V1.0
+     */
+    public AlarmConditionState setAlarmState(String definitionId, AlarmConditionState alarmConditionState) {
+        return alarmConditionStateMap.put(definitionId, alarmConditionState);
+    }
+
+    /**
+     * 根据报警对象id获取关联的报警条件
+     *
+     * @param objId 报警对象id
+     * @return 关联的报警条件信息
+     * @author lixing
+     * @version V1.0 2021/10/22 4:46 下午
+     */
+    public ObjConditionInfo getAlarmConditionsByObjId(String objId) {
+        return objConditionMap.get(objId);
+    }
+
+    /**
+     * 清空缓存
+     *
+     * @author lixing
+     * @version V1.0 2021/10/25 9:50 上午
+     */
+    public void clear() {
+        objConditionMap.clear();
+        alarmConditionMap.clear();
+        //清除编译表达式缓存
+        AviatorEvaluator.getInstance().clearExpressionCache();
+    }
+
     /**
      * @param alarmDefine:
      * @description:获取报警定义id, 中台报警定义ID没有实际意义,根据itemCode-objId拼接作为唯一标识
@@ -37,4 +110,161 @@ public class AlarmInfoCache {
     public static String getAlarmDefineId(AlarmDefine alarmDefine) {
         return alarmDefine.getItemCode() + "-" + alarmDefine.getObjId();
     }
+
+    /**
+     * 获取报警条件
+     *
+     * @param conditionId 报警条件id
+     * @return 报警条件
+     * @author lixing
+     * @version V1.0 2021/10/22 5:04 下午
+     */
+    public AlarmCondition getAlarmCondition(String conditionId) {
+        return alarmConditionMap.get(conditionId);
+    }
+
+    /**
+     * 缓存报警条件
+     *
+     * @param alarmCondition 报警条件
+     * @author lixing
+     * @version V1.0 2021/10/22 5:04 下午
+     */
+    public void cacheAlarmCondition(AlarmCondition alarmCondition) {
+        if (alarmCondition == null) {
+            return;
+        }
+        alarmConditionMap.put(alarmCondition.getId(), alarmCondition);
+    }
+
+    /**
+     * 移除缓存的报警条件
+     *
+     * @param alarmCondition 报警条件
+     * @author lixing
+     * @version V1.0 2021/10/22 5:04 下午
+     */
+    public void removeCachedAlarmCondition(AlarmCondition alarmCondition) {
+        if (alarmCondition == null) {
+            return;
+        }
+        alarmConditionMap.remove(alarmCondition.getId());
+    }
+
+    /**
+     * 缓存报警条件列表
+     *
+     * @param alarmConditions 报警条件列表
+     * @author lixing
+     * @version V1.0 2021/10/22 5:04 下午
+     */
+    public void cacheAlarmConditions(List<AlarmCondition> alarmConditions) {
+        if (CollectionUtils.isEmpty(alarmConditions)) {
+            return;
+        }
+        for (AlarmCondition alarmCondition : alarmConditions) {
+            cacheAlarmCondition(alarmCondition);
+        }
+    }
+
+
+    /**
+     * 缓存对象与条件的关联关系列表
+     *
+     * @param objConditionRelList 对象与条件的关联关系列表
+     * @author lixing
+     * @version V1.0 2021/10/25 10:36 上午
+     */
+    public void cacheObjConditionRelList(List<ObjConditionRel> objConditionRelList) {
+        if (CollectionUtils.isEmpty(objConditionRelList)) {
+            return;
+        }
+        for (ObjConditionRel objConditionRel : objConditionRelList) {
+            cacheObjConditionRel(objConditionRel);
+        }
+    }
+
+    /**
+     * 缓存对象与条件的关联关系
+     *
+     * @param objConditionRel 对象与条件的关联关系
+     * @author lixing
+     * @version V1.0 2021/10/25 10:36 上午
+     */
+    public void cacheObjConditionRel(ObjConditionRel objConditionRel) {
+        // 报警对象id
+        String objId = objConditionRel.getObjId();
+        // 报警对象和报警条件的关联信息
+        ObjConditionInfo objConditionInfo;
+        if (objConditionMap.containsKey(objId)) {
+            objConditionInfo = objConditionMap.get(objId);
+        } else {
+            objConditionInfo = new ObjConditionInfo(objConditionRel.getProjectId());
+            objConditionMap.put(objId, objConditionInfo);
+        }
+        ItemCodeCondition condition = new ItemCodeCondition();
+        condition.setConditionId(objConditionRel.getConditionId());
+        condition.setItemCode(objConditionRel.getItemCode());
+        // 对象内部自己做去重操作
+        objConditionInfo.addCondition(condition);
+    }
+
+    /**
+     * 移除缓存的对象与条件的关联关系
+     *
+     * @param objConditionRel 对象与条件的关联关系
+     * @author lixing
+     * @version V1.0 2021/10/25 10:36 上午
+     */
+    public void removeCachedObjConditionRel(ObjConditionRel objConditionRel) {
+        // 报警对象id
+        String objId = objConditionRel.getObjId();
+        if (!objConditionMap.containsKey(objId)) {
+            return;
+        }
+        // 报警对象和报警条件的关联信息
+        ObjConditionInfo objConditionInfo = objConditionMap.get(objId);
+        ItemCodeCondition condition = new ItemCodeCondition();
+        condition.setConditionId(objConditionRel.getConditionId());
+        condition.setItemCode(objConditionRel.getItemCode());
+        objConditionInfo.removeCondition(condition);
+        if (CollectionUtils.isEmpty(objConditionInfo.getConditions())) {
+            objConditionMap.remove(objId);
+        }
+    }
+
+    /**
+     * 获取缓存的报警条件数量
+     *
+     * @author lixing
+     * @version V1.0 2021/10/28 9:53 上午
+     */
+    public Integer getCachedConditionCount() {
+        return alarmConditionMap.size();
+    }
+
+    /**
+     * 获取缓存的设备数量
+     *
+     * @author lixing
+     * @version V1.0 2021/10/28 9:53 上午
+     */
+    public Integer getCachedObjCount() {
+        return objConditionMap.size();
+    }
+
+    /**
+     * 获取缓存的设备与报警条件关联关系数量
+     *
+     * @author lixing
+     * @version V1.0 2021/10/28 9:53 上午
+     */
+    public Integer getCachedObjConditionRelCount() {
+        int result = 0;
+        for (String objId : objConditionMap.keySet()) {
+            ObjConditionInfo objConditionInfo = objConditionMap.get(objId);
+            result += objConditionInfo.getConditions().size();
+        }
+        return result;
+    }
 }