|
@@ -0,0 +1,356 @@
|
|
|
+package com.persagy.cache;
|
|
|
+
|
|
|
+
|
|
|
+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 lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+import org.springframework.util.CollectionUtils;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+import java.util.concurrent.ConcurrentHashMap;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @description: 报警存放报警定义缓存的的数据
|
|
|
+ * @author: LuoGuangyi
|
|
|
+ * @company: Persagy Technology Co.,Ltd
|
|
|
+ * @since: 2020/10/19 10:57
|
|
|
+ * @version: V1.0
|
|
|
+ **/
|
|
|
+@Component
|
|
|
+@Slf4j
|
|
|
+public class AlarmInfoCache {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 报警定义 <报警定义标识,报警定义详情>
|
|
|
+ * 报警定义标识默认为:报警编码-报警对象id
|
|
|
+ */
|
|
|
+ private ConcurrentHashMap<String, AlarmDefine> alarmDefineMap = new ConcurrentHashMap<>();
|
|
|
+ /**
|
|
|
+ * 信息点-报警定义 <表号-功能号,[报警定义1,报警定义2]>
|
|
|
+ */
|
|
|
+ private ConcurrentHashMap<String, List<AlarmDefine>> infoAlarmMap = new ConcurrentHashMap<>();
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 报警定义 <报警定义标识,报警时间状态>
|
|
|
+ * 报警定义标识默认为:报警编码-报警对象id
|
|
|
+ */
|
|
|
+ private ConcurrentHashMap<String, AlarmState> alarmStateMap = new ConcurrentHashMap<>();
|
|
|
+ /**
|
|
|
+ * @description:获取报警状态 <报警定义标识,报警时间状态>
|
|
|
+ * @exception:
|
|
|
+ * @author: LuoGuangyi
|
|
|
+ * @company: Persagy Technology Co.,Ltd
|
|
|
+ * @param :
|
|
|
+ * @return: null
|
|
|
+ * @since: 2020/10/20 17:12
|
|
|
+ * @version: V1.0
|
|
|
+ */
|
|
|
+ public AlarmState getAlarmState(String definitionId) {
|
|
|
+ return alarmStateMap.get(definitionId);
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * @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);
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 获取报警定义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) {
|
|
|
+ this.infoAlarmMap = infoAlarmMap;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description:根据报警定义id获取报警定义详情
|
|
|
+ * @exception:
|
|
|
+ * @author: LuoGuangyi
|
|
|
+ * @company: Persagy Technology Co.,Ltd
|
|
|
+ * @param definitionId :
|
|
|
+ * @return: AlarmDefine 报警定义详情
|
|
|
+ * @since: 2020/10/19 14:32
|
|
|
+ * @version: V1.0
|
|
|
+ */
|
|
|
+ public AlarmDefine getAlarmDefinitionById(String definitionId) {
|
|
|
+ return alarmDefineMap.get(definitionId);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @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) {
|
|
|
+ Condition condition = alarmDefine.getCondition();
|
|
|
+ List<JSONObject> infoCodes = condition.getInfoCodes();
|
|
|
+ String trigger = condition.getTrigger();
|
|
|
+ String end = condition.getEnd();
|
|
|
+ try {
|
|
|
+ Expression triggerCompiledExp = AviatorEvaluator.compile(trigger,true);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.info("触发表达式:",trigger);
|
|
|
+ log.error("触发表表达式不合法,请校验",e);
|
|
|
+ throw new IllegalArgumentException("触发表表达式不合法",e);
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ Expression endCompiledExp = AviatorEvaluator.compile(end,true);
|
|
|
+ } catch (Exception 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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ public void putAlarmDefinitionById(AlarmDefine alarmDefine) {
|
|
|
+ putAlarmDefinitionById(getAlarmDefineId(alarmDefine),alarmDefine);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @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));
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @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
|
|
|
+ */
|
|
|
+ public void putAlarmDefinitionIdByMeterFuncId(String meterId, String funcId, AlarmDefine definition) {
|
|
|
+ List<AlarmDefine> definitionList = getAlarmDefinitionIdByMeterFuncId(meterId, funcId);
|
|
|
+ if (CollectionUtils.isEmpty(definitionList)) {
|
|
|
+ definitionList = new ArrayList<>();
|
|
|
+ }
|
|
|
+ //去重并添加
|
|
|
+ definitionList = definitionList.stream().filter(a->!getAlarmDefineId(definition).equals(getAlarmDefineId(a))).collect(Collectors.toList());
|
|
|
+ definitionList.add(definition);
|
|
|
+ infoAlarmMap.put(getKey(meterId,funcId), definitionList);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description:删除所有缓存的报警定义
|
|
|
+ * @exception:
|
|
|
+ * @author: LuoGuangyi
|
|
|
+ * @company: Persagy Technology Co.,Ltd
|
|
|
+ * @return: void
|
|
|
+ * @since: 2020/10/19 14:25
|
|
|
+ * @version: V1.0
|
|
|
+ */
|
|
|
+ public void clearAllAlarmDefine() {
|
|
|
+ alarmDefineMap.clear();
|
|
|
+ infoAlarmMap.clear();
|
|
|
+ //清除编译表达式缓存
|
|
|
+ AviatorEvaluator.getInstance().clearExpressionCache();
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * @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 String getAlarmDefineId(AlarmDefine alarmDefine) {
|
|
|
+ return alarmDefine.getItemCode()+"-"+alarmDefine.getObjId();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @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));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 拼接表号-功能号为一个key
|
|
|
+ * @param meterId
|
|
|
+ * @param funcId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private String getKey(String meterId,String funcId) {
|
|
|
+ return meterId + "-" + funcId;
|
|
|
+ }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * @description: 根据项目id, 对象id, 信息点编码获取表号功能号
|
|
|
+// * @param: projectId 项目id
|
|
|
+// * @param: objectId 对象id
|
|
|
+// * @param: infoCode 信息点编码
|
|
|
+// * @return: java.lang.String
|
|
|
+// * @exception:
|
|
|
+// * @author: fenghanchao
|
|
|
+// * @company: Persagy Technology Co.,Ltd
|
|
|
+// * @since: 10:34 2020/7/22
|
|
|
+// * @version: V1.0
|
|
|
+// */
|
|
|
+// public String getMeterFuncIdByObjectInfoCode(String projectId, String objectId, String infoCode) {
|
|
|
+// return (String) redisTemplate.opsForHash().get(RedisConstant.ALARM_DEFINITION_METER_FUNC_KEY + ":" + projectId, objectId + "-" + infoCode);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * @description: 设置项目id, 对象id, 信息点编码获取表号功能号对应关系
|
|
|
+// * @param: projectId 项目id
|
|
|
+// * @param: objectId 对象id
|
|
|
+// * @param: infoCode 信息点编码
|
|
|
+// * @param: meterFuncId 表号功能号
|
|
|
+// * @return: void
|
|
|
+// * @exception:
|
|
|
+// * @author: fenghanchao
|
|
|
+// * @company: Persagy Technology Co.,Ltd
|
|
|
+// * @since: 10:36 2020/7/22
|
|
|
+// * @version: V1.0
|
|
|
+// */
|
|
|
+// public void putMeterFuncIdByObjectInfoCode(String projectId, String objectId, String infoCode, String meterFuncId) {
|
|
|
+// redisTemplate.opsForHash().put(RedisConstant.ALARM_DEFINITION_METER_FUNC_KEY + ":" + projectId, objectId + "-" + infoCode, meterFuncId);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * @description: 根据报警定义id获取预报警时间信息
|
|
|
+// * @param: projectId 项目id
|
|
|
+// * @param: definitionId 报警定义id
|
|
|
+// * @return: java.lang.String (例 2020-07-21 00:00:00)
|
|
|
+// * @exception:
|
|
|
+// * @author: fenghanchao
|
|
|
+// * @company: Persagy Technology Co.,Ltd
|
|
|
+// * @since: 15:37 2020/7/20
|
|
|
+// * @version: V1.0
|
|
|
+// */
|
|
|
+// public String getPreAlarmTimeByDefinitionId(String projectId, String definitionId) {
|
|
|
+// return (String) redisTemplate.opsForHash().get(RedisConstant.ALARM_DEFINITION_PRE_ALARM_KEY + ":" + projectId, definitionId);
|
|
|
+// }
|
|
|
+//
|
|
|
+// public void deletePreAlarmTimeByDefinitionId(String projectId, String definitionId) {
|
|
|
+// redisTemplate.opsForHash().delete(RedisConstant.ALARM_DEFINITION_PRE_ALARM_KEY + ":" + projectId, definitionId);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * @description: 设置报警定义id与预报警时间信息的对应关系
|
|
|
+// * @param: projectId
|
|
|
+// * @param: definitionId
|
|
|
+// * @param: preAlarmDate
|
|
|
+// * @return: void
|
|
|
+// * @exception:
|
|
|
+// * @author: fenghanchao
|
|
|
+// * @company: Persagy Technology Co.,Ltd
|
|
|
+// * @since: 15:39 2020/7/20
|
|
|
+// * @version: V1.0
|
|
|
+// */
|
|
|
+// public void putPreAlarmTimeByDefinitionId(String projectId, String definitionId, Date preAlarmDate) throws Exception{
|
|
|
+// redisTemplate.opsForHash().put(RedisConstant.ALARM_DEFINITION_PRE_ALARM_KEY + ":" + projectId, definitionId, DateUtils.date2Str(preAlarmDate, DateUtils.SDF_SECOND));
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * @description: 根据报警定义id获取报警详情
|
|
|
+// * @param: projectId 项目id
|
|
|
+// * @param: definitionId 报警定义id
|
|
|
+// * @return: java.lang.String 报警详情json字符串 {...}
|
|
|
+// * @exception:
|
|
|
+// * @author: fenghanchao
|
|
|
+// * @company: Persagy Technology Co.,Ltd
|
|
|
+// * @since: 15:42 2020/7/20
|
|
|
+// * @version: V1.0
|
|
|
+// */
|
|
|
+// public String getAlarmInfoByDefinitionId(String projectId, String definitionId) {
|
|
|
+// return (String) redisTemplate.opsForHash().get(RedisConstant.ALARM_DEFINITION_ALARM_INFO_KEY + ":" + projectId, definitionId);
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * @description: 设备报警定义id报警详情对应关系
|
|
|
+// * @param: projectId 项目id
|
|
|
+// * @param: definitionId 报警定义id
|
|
|
+// * @param: alarmInfo 报警详情
|
|
|
+// * @return: void
|
|
|
+// * @exception:
|
|
|
+// * @author: fenghanchao
|
|
|
+// * @company: Persagy Technology Co.,Ltd
|
|
|
+// * @since: 15:42 2020/7/20
|
|
|
+// * @version: V1.0
|
|
|
+// */
|
|
|
+// public void putAlarmInfoByDefinitionId(String projectId, String definitionId, String alarmInfo) {
|
|
|
+// redisTemplate.opsForHash().put(RedisConstant.ALARM_DEFINITION_ALARM_INFO_KEY + ":" + projectId, definitionId, alarmInfo);
|
|
|
+// }
|
|
|
+
|
|
|
+}
|