|
@@ -1,10 +1,16 @@
|
|
package com.persagy.apm.alarmservice.group.monitorindicator.service.impl;
|
|
package com.persagy.apm.alarmservice.group.monitorindicator.service.impl;
|
|
|
|
|
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
import com.google.common.base.CaseFormat;
|
|
import com.google.common.base.CaseFormat;
|
|
|
|
+import com.googlecode.aviator.AviatorEvaluator;
|
|
|
|
+import com.googlecode.aviator.Expression;
|
|
|
|
+import com.persagy.apm.alarmservice.dependency.eqdiagnose.model.QueryMonitorIndicatorRecordDTO;
|
|
|
|
+import com.persagy.apm.alarmservice.dependency.eqdiagnose.service.EqDiagnoseServiceImpl;
|
|
import com.persagy.apm.alarmservice.group.alarmrecord.service.AlarmRecordWrapper;
|
|
import com.persagy.apm.alarmservice.group.alarmrecord.service.AlarmRecordWrapper;
|
|
import com.persagy.apm.alarmservice.group.calculatemethod.model.CalculateMethod;
|
|
import com.persagy.apm.alarmservice.group.calculatemethod.model.CalculateMethod;
|
|
import com.persagy.apm.alarmservice.group.calculatemethod.model.dto.QueryCalculateMethodDTO;
|
|
import com.persagy.apm.alarmservice.group.calculatemethod.model.dto.QueryCalculateMethodDTO;
|
|
@@ -13,20 +19,24 @@ import com.persagy.apm.alarmservice.group.monitorindicator.dao.MonitorIndicatorM
|
|
import com.persagy.apm.alarmservice.group.monitorindicator.model.ConvertMonitorIndicatorTool;
|
|
import com.persagy.apm.alarmservice.group.monitorindicator.model.ConvertMonitorIndicatorTool;
|
|
import com.persagy.apm.alarmservice.group.monitorindicator.model.MonitorIndicator;
|
|
import com.persagy.apm.alarmservice.group.monitorindicator.model.MonitorIndicator;
|
|
import com.persagy.apm.alarmservice.group.monitorindicator.model.dto.*;
|
|
import com.persagy.apm.alarmservice.group.monitorindicator.model.dto.*;
|
|
|
|
+import com.persagy.apm.alarmservice.group.monitorindicator.model.vo.MonitorIndicatorFormulaItem;
|
|
import com.persagy.apm.alarmservice.group.monitorindicator.model.vo.MonitorIndicatorListItemVO;
|
|
import com.persagy.apm.alarmservice.group.monitorindicator.model.vo.MonitorIndicatorListItemVO;
|
|
import com.persagy.apm.alarmservice.group.monitorindicator.model.vo.MonitorIndicatorRecordInfoItem;
|
|
import com.persagy.apm.alarmservice.group.monitorindicator.model.vo.MonitorIndicatorRecordInfoItem;
|
|
|
|
+import com.persagy.apm.alarmservice.group.monitorindicator.model.vo.MonitorIndicatorReferenceItem;
|
|
import com.persagy.apm.alarmservice.group.monitorindicator.service.IMonitorIndicatorService;
|
|
import com.persagy.apm.alarmservice.group.monitorindicator.service.IMonitorIndicatorService;
|
|
|
|
+import com.persagy.apm.common.constant.enums.AttrValueTypeEnum;
|
|
import com.persagy.apm.common.constant.enums.ValidEnum;
|
|
import com.persagy.apm.common.constant.enums.ValidEnum;
|
|
import com.persagy.apm.common.context.AppContext;
|
|
import com.persagy.apm.common.context.AppContext;
|
|
import com.persagy.apm.common.model.dto.Sort;
|
|
import com.persagy.apm.common.model.dto.Sort;
|
|
|
|
+import com.persagy.apm.common.model.vo.GraphItemVO;
|
|
import com.persagy.apm.energyalarmstarter.alarmdata.model.vo.AlarmRecordItem;
|
|
import com.persagy.apm.energyalarmstarter.alarmdata.model.vo.AlarmRecordItem;
|
|
import org.apache.commons.lang.StringUtils;
|
|
import org.apache.commons.lang.StringUtils;
|
|
|
|
+import org.assertj.core.util.Lists;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.util.CollectionUtils;
|
|
import org.springframework.util.CollectionUtils;
|
|
|
|
|
|
-import java.util.ArrayList;
|
|
|
|
-import java.util.List;
|
|
|
|
|
|
+import java.util.*;
|
|
|
|
|
|
/**
|
|
/**
|
|
* 监测指标(MonitorIndicator) service层
|
|
* 监测指标(MonitorIndicator) service层
|
|
@@ -41,6 +51,10 @@ public class MonitorIndicatorServiceImpl extends ServiceImpl<MonitorIndicatorMap
|
|
ICalculateMethodService calculateMethodService;
|
|
ICalculateMethodService calculateMethodService;
|
|
@Autowired
|
|
@Autowired
|
|
AlarmRecordWrapper alarmRecordWrapper;
|
|
AlarmRecordWrapper alarmRecordWrapper;
|
|
|
|
+ @Autowired
|
|
|
|
+ EqDiagnoseServiceImpl eqDiagnoseService;
|
|
|
|
+ @Autowired
|
|
|
|
+ MonitorIndicatorServiceImpl monitorIndicatorService;
|
|
|
|
|
|
/**
|
|
/**
|
|
* 创建监测指标
|
|
* 创建监测指标
|
|
@@ -67,8 +81,6 @@ public class MonitorIndicatorServiceImpl extends ServiceImpl<MonitorIndicatorMap
|
|
*/
|
|
*/
|
|
private void setDefaultValue(MonitorIndicator monitorIndicator) {
|
|
private void setDefaultValue(MonitorIndicator monitorIndicator) {
|
|
monitorIndicator.setCreator(AppContext.getContext().getAccountId());
|
|
monitorIndicator.setCreator(AppContext.getContext().getAccountId());
|
|
- // todo 其他默认的属性
|
|
|
|
-
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -231,9 +243,231 @@ public class MonitorIndicatorServiceImpl extends ServiceImpl<MonitorIndicatorMap
|
|
@Override
|
|
@Override
|
|
public List<MonitorIndicatorRecordInfoItem> monitorIndicatorRecordInfo(
|
|
public List<MonitorIndicatorRecordInfoItem> monitorIndicatorRecordInfo(
|
|
QueryMonitorIndicatorRecordInfoDTO queryMonitorIndicatorRecordInfoDTO) throws Exception {
|
|
QueryMonitorIndicatorRecordInfoDTO queryMonitorIndicatorRecordInfoDTO) throws Exception {
|
|
- // 获取报警记录关联的指标
|
|
|
|
|
|
+ // 获取报警记录关联的指标和指标关联的公式
|
|
String alarmRecordId = queryMonitorIndicatorRecordInfoDTO.getAlarmRecordId();
|
|
String alarmRecordId = queryMonitorIndicatorRecordInfoDTO.getAlarmRecordId();
|
|
AlarmRecordItem alarmRecord = alarmRecordWrapper.getAlarmRecord(alarmRecordId);
|
|
AlarmRecordItem alarmRecord = alarmRecordWrapper.getAlarmRecord(alarmRecordId);
|
|
- return null;
|
|
|
|
|
|
+ JSONObject condition = alarmRecord.getCondition();
|
|
|
|
+ JSONArray infoCodeArray = condition.getJSONArray("infoCode");
|
|
|
|
+ JSONArray conditionArray = condition.getJSONArray("configs");
|
|
|
|
+ if (CollectionUtils.isEmpty(infoCodeArray) || CollectionUtils.isEmpty(conditionArray)) {
|
|
|
|
+ return new ArrayList<>();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 获取监测指标的历史采集值 monitorId -> (time -> value)
|
|
|
|
+ List<String> infoCodeList = infoCodeArray.toJavaList(String.class);
|
|
|
|
+ Map<String, Map<Date, String>> monitorValuesMap = getIndicatorHistoryValues(
|
|
|
|
+ infoCodeList, queryMonitorIndicatorRecordInfoDTO.getStartTime(),
|
|
|
|
+ queryMonitorIndicatorRecordInfoDTO.getEndTime());
|
|
|
|
+
|
|
|
|
+ // indicatorId -> list<formula> 监测指标和与监测指标关联的公式的映射
|
|
|
|
+ Map<String, List<MonitorIndicatorFormulaItem>> indicatorFormulaMap = getIndicatorFormulaMap(conditionArray);
|
|
|
|
+
|
|
|
|
+ // 遍历监测指标和与监测指标关联的公式的映射,获取监测指标和公式的取值,转换为返回结果
|
|
|
|
+ List<MonitorIndicatorRecordInfoItem> result = new ArrayList<>();
|
|
|
|
+ for (String indicatorId : indicatorFormulaMap.keySet()) {
|
|
|
|
+ MonitorIndicatorRecordInfoItem monitorIndicatorRecordInfoItem = new MonitorIndicatorRecordInfoItem();
|
|
|
|
+ // 查询监测指标基本信息
|
|
|
|
+ MonitorIndicator monitorIndicator = monitorIndicatorService.queryMonitorIndicatorDetail(indicatorId);
|
|
|
|
+ monitorIndicatorRecordInfoItem.setMonitorIndicatorName(monitorIndicator.getName());
|
|
|
|
+ monitorIndicatorRecordInfoItem.setUnit(monitorIndicator.getUnit());
|
|
|
|
+ // 获取监测指标历史采集值
|
|
|
|
+ Map<Date, String> indicatorRecordMap = monitorValuesMap.get(indicatorId);
|
|
|
|
+ List<GraphItemVO> values = getIndicatorRecordGraphData(monitorIndicator, indicatorRecordMap);
|
|
|
|
+ monitorIndicatorRecordInfoItem.setValue(values);
|
|
|
|
+ // 如果监测指标的取值不是枚举数据,获取监测指标参照值
|
|
|
|
+ if (monitorIndicator.getDic() != null) {
|
|
|
|
+ monitorIndicatorRecordInfoItem.setDic(monitorIndicator.getDic());
|
|
|
|
+ } else {
|
|
|
|
+ List<MonitorIndicatorReferenceItem> reference = getMonitorIndicatorReferenceItems(
|
|
|
|
+ monitorValuesMap, indicatorFormulaMap, monitorIndicator);
|
|
|
|
+ monitorIndicatorRecordInfoItem.setReference(reference);
|
|
|
|
+ }
|
|
|
|
+ result.add(monitorIndicatorRecordInfoItem);
|
|
|
|
+ }
|
|
|
|
+ return result;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取监测指标的参照值列表
|
|
|
|
+ *
|
|
|
|
+ * @param monitorValuesMap 所有相关监测指标的历史采集值 indicatorId -> (date -> value)
|
|
|
|
+ * @param indicatorFormulaMap 所有监测指标关联的公式 indicatorId -> 公式列表
|
|
|
|
+ * @param monitorIndicator 监测指标对象
|
|
|
|
+ * @return 监测指标的参照值列表
|
|
|
|
+ * @author lixing
|
|
|
|
+ * @version V1.0 2021/9/27 4:23 下午
|
|
|
|
+ */
|
|
|
|
+ private List<MonitorIndicatorReferenceItem> getMonitorIndicatorReferenceItems(
|
|
|
|
+ Map<String, Map<Date, String>> monitorValuesMap,
|
|
|
|
+ Map<String, List<MonitorIndicatorFormulaItem>> indicatorFormulaMap, MonitorIndicator monitorIndicator) {
|
|
|
|
+ List<MonitorIndicatorReferenceItem> reference = new ArrayList<>();
|
|
|
|
+ List<MonitorIndicatorFormulaItem> monitorIndicatorFormulaItems = indicatorFormulaMap.get(monitorIndicator.getId());
|
|
|
|
+ for (MonitorIndicatorFormulaItem monitorIndicatorFormulaItem : monitorIndicatorFormulaItems) {
|
|
|
|
+ MonitorIndicatorReferenceItem monitorIndicatorReferenceItem = new MonitorIndicatorReferenceItem();
|
|
|
|
+ monitorIndicatorReferenceItem.setUnit(monitorIndicator.getUnit());
|
|
|
|
+ monitorIndicatorReferenceItem.setOperator(monitorIndicatorFormulaItem.getOperator());
|
|
|
|
+ // 解析公式,得到公式计算结果
|
|
|
|
+ String formula = monitorIndicatorFormulaItem.getFormula();
|
|
|
|
+ List<GraphItemVO> referenceValueList = new ArrayList<>();
|
|
|
|
+ Map<Date, String> indicatorRecordMap = monitorValuesMap.get(monitorIndicator.getId());
|
|
|
|
+ for (Date date : indicatorRecordMap.keySet()) {
|
|
|
|
+ HashMap<String, Object> paramMap = getParamMap(monitorValuesMap, date);
|
|
|
|
+ Double formulaResult = calculateFormula(formula, paramMap);
|
|
|
|
+ GraphItemVO graphItemVO = new GraphItemVO(
|
|
|
|
+ String.valueOf(date.getTime()), formulaResult,
|
|
|
|
+ AttrValueTypeEnum.number_2, monitorIndicator.getUnit());
|
|
|
|
+ referenceValueList.add(graphItemVO);
|
|
|
|
+ }
|
|
|
|
+ monitorIndicatorReferenceItem.setValue(referenceValueList);
|
|
|
|
+ reference.add(monitorIndicatorReferenceItem);
|
|
|
|
+ }
|
|
|
|
+ return reference;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取监测指标历史采集值图表数据
|
|
|
|
+ *
|
|
|
|
+ * @param monitorIndicator 监测指标对象
|
|
|
|
+ * @param indicatorRecordMap 监测指标历史采集值 date->value
|
|
|
|
+ * @return 监测指标历史采集值图表数据
|
|
|
|
+ * @author lixing
|
|
|
|
+ * @version V1.0 2021/9/27 4:20 下午
|
|
|
|
+ */
|
|
|
|
+ private List<GraphItemVO> getIndicatorRecordGraphData(
|
|
|
|
+ MonitorIndicator monitorIndicator, Map<Date, String> indicatorRecordMap) {
|
|
|
|
+ List<GraphItemVO> values = new ArrayList<>();
|
|
|
|
+ for (Date date : indicatorRecordMap.keySet()) {
|
|
|
|
+ if (date == null) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ String valueStr = indicatorRecordMap.get(date);
|
|
|
|
+ Double value = StringUtils.isBlank(valueStr) ? null : Double.valueOf(valueStr);
|
|
|
|
+ GraphItemVO graphItemVO = new GraphItemVO(
|
|
|
|
+ String.valueOf(date.getTime()), value, AttrValueTypeEnum.number, monitorIndicator.getUnit());
|
|
|
|
+ values.add(graphItemVO);
|
|
|
|
+ }
|
|
|
|
+ return values;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 将给定时间各个指标的取值转换为公式参数map
|
|
|
|
+ *
|
|
|
|
+ * @param monitorValuesMap 监测指标的历史采集值 monitorId -> (time -> value)
|
|
|
|
+ * @param date 给定时间
|
|
|
|
+ * @return 公式参数map
|
|
|
|
+ * @author lixing
|
|
|
|
+ * @version V1.0 2021/9/27 4:00 下午
|
|
|
|
+ */
|
|
|
|
+ private HashMap<String, Object> getParamMap(Map<String, Map<Date, String>> monitorValuesMap, Date date) {
|
|
|
|
+ if (CollectionUtils.isEmpty(monitorValuesMap)) {
|
|
|
|
+ return new HashMap<>();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ HashMap<String, Object> paramMap = new HashMap<>();
|
|
|
|
+ for (String indicatorId : monitorValuesMap.keySet()) {
|
|
|
|
+ Map<Date, String> recordMap = monitorValuesMap.get(indicatorId);
|
|
|
|
+ if (CollectionUtils.isEmpty(recordMap)) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ if (recordMap.get(date) != null) {
|
|
|
|
+ paramMap.put(indicatorId, Double.valueOf(recordMap.get(date)));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return paramMap;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 计算公式,获取计算结果
|
|
|
|
+ *
|
|
|
|
+ * @param formula 公式
|
|
|
|
+ * @param paramMap 参数
|
|
|
|
+ * @return 结果
|
|
|
|
+ * @author lixing
|
|
|
|
+ * @version V1.0 2021/9/27 3:59 下午
|
|
|
|
+ */
|
|
|
|
+ private Double calculateFormula(String formula, HashMap<String, Object> paramMap) {
|
|
|
|
+ Expression triggerExp = AviatorEvaluator.compile(formula, true);
|
|
|
|
+ Object resultObj = triggerExp.execute(paramMap);
|
|
|
|
+ if (resultObj == null) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ return Double.valueOf(resultObj.toString());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取监测指标和与监测指标关联的公式的映射
|
|
|
|
+ *
|
|
|
|
+ * @param conditionArray 报警条件数组
|
|
|
|
+ * @return 监测指标和与监测指标关联的公式的映射
|
|
|
|
+ * @author lixing
|
|
|
|
+ * @version V1.0 2021/9/27 2:42 下午
|
|
|
|
+ */
|
|
|
|
+ private Map<String, List<MonitorIndicatorFormulaItem>> getIndicatorFormulaMap(JSONArray conditionArray) {
|
|
|
|
+ Map<String, List<MonitorIndicatorFormulaItem>> indicatorFormulaMap = new HashMap<>();
|
|
|
|
+ // conditionArray: [condition], condition: [rule], rule: indicator, formula, operator
|
|
|
|
+ for (Object conditionObj : conditionArray) {
|
|
|
|
+ JSONArray ruleArray = (JSONArray) conditionObj;
|
|
|
|
+ if (CollectionUtils.isEmpty(ruleArray)) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ for (Object ruleObj : ruleArray) {
|
|
|
|
+ JSONObject rule = (JSONObject) ruleObj;
|
|
|
|
+ String monitorIndicatorId = rule.getString("monitorIndicatorId");
|
|
|
|
+ if (StringUtils.isBlank(monitorIndicatorId)) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ String tempFormula = rule.getString("tempFormula");
|
|
|
|
+ String operator = rule.getString("operator");
|
|
|
|
+ if (indicatorFormulaMap.containsKey(monitorIndicatorId)) {
|
|
|
|
+ List<MonitorIndicatorFormulaItem> monitorIndicatorFormulaItems = indicatorFormulaMap.get(monitorIndicatorId);
|
|
|
|
+ monitorIndicatorFormulaItems.add(new MonitorIndicatorFormulaItem(operator, tempFormula));
|
|
|
|
+ } else {
|
|
|
|
+ indicatorFormulaMap.put(monitorIndicatorId,
|
|
|
|
+ Lists.newArrayList(new MonitorIndicatorFormulaItem(operator, tempFormula)));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return indicatorFormulaMap;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取监测指标的历史采集值
|
|
|
|
+ *
|
|
|
|
+ * @param infoCodeList [equipId-monitorId]
|
|
|
|
+ * @param startTime 开始时间
|
|
|
|
+ * @param endTime 结束时间
|
|
|
|
+ * @return 监测指标的历史采集值 monitorId -> (time -> value)
|
|
|
|
+ * @author lixing
|
|
|
|
+ * @version V1.0 2021/9/27 2:35 下午
|
|
|
|
+ */
|
|
|
|
+ private Map<String, Map<Date, String>> getIndicatorHistoryValues(
|
|
|
|
+ List<String> infoCodeList, Date startTime, Date endTime) {
|
|
|
|
+ // monitorId -> (time -> value)
|
|
|
|
+ Map<String, Map<Date, String>> monitorValuesMap = new HashMap<>();
|
|
|
|
+ // infoCodeList:[equipId-monitorId]
|
|
|
|
+ for (String infoCode : infoCodeList) {
|
|
|
|
+ String objId;
|
|
|
|
+ String indicatorId;
|
|
|
|
+ try {
|
|
|
|
+ objId = infoCode.substring(0, infoCode.indexOf("_"));
|
|
|
|
+ indicatorId = infoCode.substring(infoCode.indexOf("_") + 1);
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ throw new IllegalArgumentException("报警记录数据有误,无法正确获取到报警条件中的信息点");
|
|
|
|
+ }
|
|
|
|
+ if (StringUtils.isBlank(objId) || StringUtils.isBlank(indicatorId)) {
|
|
|
|
+ throw new IllegalArgumentException("报警记录数据有误,无法正确获取到报警条件中的信息点");
|
|
|
|
+ }
|
|
|
|
+ // 查询设备监测指标取值
|
|
|
|
+ QueryMonitorIndicatorRecordDTO queryMonitorIndicatorRecordDTO = new QueryMonitorIndicatorRecordDTO();
|
|
|
|
+ queryMonitorIndicatorRecordDTO.setObjId(objId);
|
|
|
|
+ queryMonitorIndicatorRecordDTO.setMonitorIndicatorId(indicatorId);
|
|
|
|
+ queryMonitorIndicatorRecordDTO.setTimeFrom(startTime == null ? null : startTime.getTime());
|
|
|
|
+ queryMonitorIndicatorRecordDTO.setTimeTo(endTime == null ? null : endTime.getTime());
|
|
|
|
+ Map<Date, String> indicatorRecordMap = eqDiagnoseService.
|
|
|
|
+ queryMonitorIndicatorRecord(queryMonitorIndicatorRecordDTO);
|
|
|
|
+ monitorValuesMap.put(indicatorId, indicatorRecordMap);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return monitorValuesMap;
|
|
}
|
|
}
|
|
}
|
|
}
|