|
@@ -2,14 +2,12 @@ package com.persagy.cache;
|
|
|
|
|
|
|
|
|
import cn.hutool.core.collection.CollectionUtil;
|
|
|
-import com.alibaba.fastjson.JSONArray;
|
|
|
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.Condition;
|
|
|
-import com.persagy.utils.StringUtil;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
import org.springframework.util.CollectionUtils;
|
|
@@ -42,18 +40,18 @@ public class AlarmInfoCache {
|
|
|
private ConcurrentHashMap<String, List<AlarmDefine>> infoAlarmMap = new ConcurrentHashMap<>();
|
|
|
|
|
|
|
|
|
-
|
|
|
/**
|
|
|
* 报警定义 <报警定义标识,报警时间状态>
|
|
|
* 报警定义标识默认为:报警编码-报警对象id
|
|
|
*/
|
|
|
private ConcurrentHashMap<String, AlarmState> alarmStateMap = new ConcurrentHashMap<>();
|
|
|
+
|
|
|
/**
|
|
|
- * @description:获取报警状态 <报警定义标识,报警时间状态>
|
|
|
+ * @param :
|
|
|
+ * @description:获取报警状态 <报警定义标识,报警时间状态>
|
|
|
* @exception:
|
|
|
* @author: LuoGuangyi
|
|
|
* @company: Persagy Technology Co.,Ltd
|
|
|
- * @param :
|
|
|
* @return: null
|
|
|
* @since: 2020/10/20 17:12
|
|
|
* @version: V1.0
|
|
@@ -61,43 +59,52 @@ public class AlarmInfoCache {
|
|
|
public AlarmState getAlarmState(String definitionId) {
|
|
|
return alarmStateMap.get(definitionId);
|
|
|
}
|
|
|
+
|
|
|
/**
|
|
|
+ * @param definitionId: 报警定义id
|
|
|
+ * @param alarmState: 报警状态时间类
|
|
|
* @description:设置报警定义
|
|
|
* @exception:
|
|
|
* @author: LuoGuangyi
|
|
|
* @company: Persagy Technology Co.,Ltd
|
|
|
- * @param definitionId: 报警定义id
|
|
|
- * @param alarmState: 报警状态时间类
|
|
|
* @return: com.persagy.entity.AlarmState
|
|
|
* @since: 2020/10/20 17:15
|
|
|
* @version: V1.0
|
|
|
*/
|
|
|
- public AlarmState setAlarmState(String definitionId,AlarmState alarmState) {
|
|
|
- return alarmStateMap.put(definitionId,alarmState);
|
|
|
+ public AlarmState setAlarmState(String definitionId, AlarmState alarmState) {
|
|
|
+ return alarmStateMap.put(definitionId, alarmState);
|
|
|
}
|
|
|
+
|
|
|
/**
|
|
|
* 获取报警定义Map <报警定义标识,报警定义详情>
|
|
|
+ *
|
|
|
* @return
|
|
|
*/
|
|
|
public ConcurrentHashMap<String, AlarmDefine> getAlarmDefineMap() {
|
|
|
return alarmDefineMap;
|
|
|
}
|
|
|
+
|
|
|
/**
|
|
|
* 设置报警定义Map <报警定义标识,报警定义详情>
|
|
|
+ *
|
|
|
* @return
|
|
|
*/
|
|
|
public void setAlarmDefineMap(ConcurrentHashMap<String, AlarmDefine> alarmDefineMap) {
|
|
|
this.alarmDefineMap = alarmDefineMap;
|
|
|
}
|
|
|
+
|
|
|
/**
|
|
|
* 获取信息点-报警定义map <表号-功能号,[报警定义1,报警定义2]>
|
|
|
+ *
|
|
|
* @return
|
|
|
*/
|
|
|
public ConcurrentHashMap<String, List<AlarmDefine>> getInfoAlarmMap() {
|
|
|
return infoAlarmMap;
|
|
|
}
|
|
|
+
|
|
|
/**
|
|
|
* 设置信息点-报警定义map <表号-功能号,[报警定义1,报警定义2]>
|
|
|
+ *
|
|
|
* @return
|
|
|
*/
|
|
|
public void setInfoAlarmMap(ConcurrentHashMap<String, List<AlarmDefine>> infoAlarmMap) {
|
|
@@ -105,11 +112,11 @@ public class AlarmInfoCache {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * @param definitionId :
|
|
|
* @description:根据报警定义id获取报警定义详情
|
|
|
* @exception:
|
|
|
* @author: LuoGuangyi
|
|
|
* @company: Persagy Technology Co.,Ltd
|
|
|
- * @param definitionId :
|
|
|
* @return: AlarmDefine 报警定义详情
|
|
|
* @since: 2020/10/19 14:32
|
|
|
* @version: V1.0
|
|
@@ -120,80 +127,80 @@ public class AlarmInfoCache {
|
|
|
|
|
|
|
|
|
/**
|
|
|
+ * @param definitionId:报警定义ID
|
|
|
+ * @param alarmDefine:报警定义详情
|
|
|
* @description:保存报警定义详情
|
|
|
* @exception:
|
|
|
* @author: LuoGuangyi
|
|
|
* @company: Persagy Technology Co.,Ltd
|
|
|
- * @param definitionId:报警定义ID
|
|
|
- * @param alarmDefine:报警定义详情
|
|
|
* @return: void
|
|
|
* @since: 2020/10/19 14:32
|
|
|
* @version: V1.0
|
|
|
*/
|
|
|
public void putAlarmDefinitionById(String definitionId, AlarmDefine alarmDefine) {
|
|
|
- if("0".equals(alarmDefine.getOpen())){
|
|
|
+ if (alarmDefine.getOpen() == 0) {
|
|
|
return;
|
|
|
}
|
|
|
Condition condition = alarmDefine.getCondition();
|
|
|
List<JSONObject> infoCodes = condition.getInfoCodes();
|
|
|
- if(CollectionUtil.isEmpty(infoCodes)) {
|
|
|
- log.error("报警定义ID为[{}],报警定义详情为[{}] 的报警定义信息点为空,请检查!!!!! ",definitionId,alarmDefine.toString());
|
|
|
+ if (CollectionUtil.isEmpty(infoCodes)) {
|
|
|
+ log.error("报警定义ID为[{}],报警定义详情为[{}] 的报警定义信息点为空,请检查!!!!! ", definitionId, alarmDefine.toString());
|
|
|
return;
|
|
|
}
|
|
|
String trigger = condition.getTrigger();
|
|
|
String end = condition.getEnd();
|
|
|
try {
|
|
|
- Expression triggerCompiledExp = AviatorEvaluator.compile(trigger,true);
|
|
|
+ Expression triggerCompiledExp = AviatorEvaluator.compile(trigger, true);
|
|
|
} catch (Exception e) {
|
|
|
- log.info("触发表达式:",trigger);
|
|
|
- log.error("触发表表达式不合法,请校验",e);
|
|
|
- throw new IllegalArgumentException("触发表表达式不合法",e);
|
|
|
+ log.info("触发表达式:", trigger);
|
|
|
+ log.error("触发表表达式不合法,请校验", e);
|
|
|
+ throw new IllegalArgumentException("触发表表达式不合法", e);
|
|
|
}
|
|
|
try {
|
|
|
- Expression endCompiledExp = AviatorEvaluator.compile(end,true);
|
|
|
+ Expression endCompiledExp = AviatorEvaluator.compile(end, true);
|
|
|
} catch (Exception e) {
|
|
|
- log.error("恢复表达式:",end);
|
|
|
- log.error("恢复表达式不合法,请校验",e);
|
|
|
- throw new IllegalArgumentException("恢复表达式不合法",e);
|
|
|
+ log.error("恢复表达式:", end);
|
|
|
+ log.error("恢复表达式不合法,请校验", e);
|
|
|
+ throw new IllegalArgumentException("恢复表达式不合法", e);
|
|
|
}
|
|
|
alarmDefineMap.put(definitionId, alarmDefine);
|
|
|
for (int i = 0; i < infoCodes.size(); i++) {
|
|
|
JSONObject infoCode = infoCodes.get(i);
|
|
|
String meterId = infoCode.getString("meterId");
|
|
|
String funcId = infoCode.getString("funcId");
|
|
|
- putAlarmDefinitionIdByMeterFuncId(meterId,funcId,alarmDefine);
|
|
|
+ putAlarmDefinitionIdByMeterFuncId(meterId, funcId, alarmDefine);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
public void putAlarmDefinitionById(AlarmDefine alarmDefine) {
|
|
|
- putAlarmDefinitionById(getAlarmDefineId(alarmDefine),alarmDefine);
|
|
|
+ putAlarmDefinitionById(getAlarmDefineId(alarmDefine), alarmDefine);
|
|
|
}
|
|
|
|
|
|
|
|
|
-
|
|
|
/**
|
|
|
+ * @param meterId: 表号
|
|
|
+ * @param funcId: 功能号
|
|
|
* @description:根据表号功能号获取多条报警定义id
|
|
|
* @exception:
|
|
|
* @author: LuoGuangyi
|
|
|
* @company: Persagy Technology Co.,Ltd
|
|
|
- * @param meterId: 表号
|
|
|
- * @param funcId: 功能号
|
|
|
* @return: java.util.List<com.alibaba.fastjson.JSONObject>
|
|
|
* @since: 2020/10/19 14:31
|
|
|
* @version: V1.0
|
|
|
*/
|
|
|
public List<AlarmDefine> getAlarmDefinitionIdByMeterFuncId(String meterId, String funcId) {
|
|
|
- return infoAlarmMap.get(getKey(meterId,funcId));
|
|
|
+ return infoAlarmMap.get(getKey(meterId, funcId));
|
|
|
}
|
|
|
|
|
|
|
|
|
/**
|
|
|
+ * @param meterId: 表号
|
|
|
+ * @param funcId: 功能号
|
|
|
+ * @param definition: 报警定义
|
|
|
* @description:根据表号功能号缓存报警定义
|
|
|
* @exception:
|
|
|
* @author: LuoGuangyi
|
|
|
* @company: Persagy Technology Co.,Ltd
|
|
|
- * @param meterId: 表号
|
|
|
- * @param funcId: 功能号
|
|
|
- * @param definition: 报警定义
|
|
|
* @return: void
|
|
|
* @since: 2020/10/19 14:26
|
|
|
* @version: V1.0
|
|
@@ -204,9 +211,9 @@ public class AlarmInfoCache {
|
|
|
definitionList = new ArrayList<>();
|
|
|
}
|
|
|
//去重并添加
|
|
|
- definitionList = definitionList.stream().filter(a->!getAlarmDefineId(definition).equals(getAlarmDefineId(a))).collect(Collectors.toList());
|
|
|
+ definitionList = definitionList.stream().filter(a -> !getAlarmDefineId(definition).equals(getAlarmDefineId(a))).collect(Collectors.toList());
|
|
|
definitionList.add(definition);
|
|
|
- infoAlarmMap.put(getKey(meterId,funcId), definitionList);
|
|
|
+ infoAlarmMap.put(getKey(meterId, funcId), definitionList);
|
|
|
}
|
|
|
|
|
|
|
|
@@ -225,12 +232,13 @@ public class AlarmInfoCache {
|
|
|
//清除编译表达式缓存
|
|
|
AviatorEvaluator.getInstance().clearExpressionCache();
|
|
|
}
|
|
|
+
|
|
|
/**
|
|
|
+ * @param ad: 要删除掉的报警定义
|
|
|
* @description:根据报警定义删除缓存
|
|
|
* @exception:
|
|
|
* @author: LuoGuangyi
|
|
|
* @company: Persagy Technology Co.,Ltd
|
|
|
- * @param ad: 要删除掉的报警定义
|
|
|
* @return: void
|
|
|
* @since: 2020/10/26 20:34
|
|
|
* @version: V1.0
|
|
@@ -238,53 +246,59 @@ public class AlarmInfoCache {
|
|
|
public void clearAlarmDefine(AlarmDefine ad) {
|
|
|
String defineId = getAlarmDefineId(ad);
|
|
|
AlarmDefine alarmDefine = alarmDefineMap.get(defineId);
|
|
|
- if(!Objects.isNull(alarmDefine)) {
|
|
|
+ if (!Objects.isNull(alarmDefine)) {
|
|
|
List<JSONObject> infoCodes = alarmDefine.getCondition().getInfoCodes();
|
|
|
- infoCodes.stream().forEach(info->{
|
|
|
+ // 删除map中报警定义相关信息点与要删除的报警定义的映射
|
|
|
+ infoCodes.stream().forEach(info -> {
|
|
|
String meterId = info.getString("meterId");
|
|
|
String funcId = info.getString("funcId");
|
|
|
- List<AlarmDefine> AlarmDefineList = infoAlarmMap.getOrDefault(getKey(meterId, funcId),new ArrayList<>());
|
|
|
- infoAlarmMap.put(getKey(meterId, funcId), AlarmDefineList.stream().filter(adTmp -> !getAlarmDefineId(adTmp).equals(defineId)).collect(Collectors.toList()));
|
|
|
+ List<AlarmDefine> AlarmDefineList = infoAlarmMap.getOrDefault(getKey(meterId, funcId), new ArrayList<>());
|
|
|
+ // 过滤掉要删除的报警定义
|
|
|
+ infoAlarmMap.put(getKey(meterId, funcId),
|
|
|
+ AlarmDefineList.stream().filter(
|
|
|
+ adTmp -> !getAlarmDefineId(adTmp).equals(defineId)
|
|
|
+ ).collect(Collectors.toList()));
|
|
|
});
|
|
|
}
|
|
|
alarmDefineMap.remove(defineId);
|
|
|
}
|
|
|
+
|
|
|
/**
|
|
|
- * @description:获取报警定义id,
|
|
|
- * 中台报警定义ID没有实际意义,根据itemCode-objId拼接作为唯一标识
|
|
|
+ * @param alarmDefine:
|
|
|
+ * @description:获取报警定义id, 中台报警定义ID没有实际意义,根据itemCode-objId拼接作为唯一标识
|
|
|
* @exception:
|
|
|
* @author: LuoGuangyi
|
|
|
* @company: Persagy Technology Co.,Ltd
|
|
|
- * @param alarmDefine:
|
|
|
* @since: 2020/10/19 17:28
|
|
|
* @version: V1.0
|
|
|
*/
|
|
|
public static String getAlarmDefineId(AlarmDefine alarmDefine) {
|
|
|
- return alarmDefine.getItemCode()+"-"+alarmDefine.getObjId();
|
|
|
+ return alarmDefine.getItemCode() + "-" + alarmDefine.getObjId();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * @param meterId:表号
|
|
|
+ * @param funcId:功能号
|
|
|
* @description:判断是否包含有改表号功能号的改报警定义
|
|
|
* @exception:
|
|
|
* @author: LuoGuangyi
|
|
|
* @company: Persagy Technology Co.,Ltd
|
|
|
- * @param meterId:表号
|
|
|
- * @param funcId:功能号
|
|
|
* @return: boolean
|
|
|
* @since: 2020/10/19 19:54
|
|
|
* @version: V1.0
|
|
|
*/
|
|
|
- public boolean hasKey(String meterId,String funcId) {
|
|
|
- return infoAlarmMap.containsKey(getKey(meterId,funcId));
|
|
|
+ public boolean hasKey(String meterId, String funcId) {
|
|
|
+ return infoAlarmMap.containsKey(getKey(meterId, funcId));
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 拼接表号-功能号为一个key
|
|
|
+ *
|
|
|
* @param meterId
|
|
|
* @param funcId
|
|
|
* @return
|
|
|
*/
|
|
|
- private String getKey(String meterId,String funcId) {
|
|
|
+ private String getKey(String meterId, String funcId) {
|
|
|
return meterId + "-" + funcId;
|
|
|
}
|
|
|
|