|
|
@@ -1,11 +1,34 @@
|
|
|
package com.xunmei.mediator.api.service.impl;
|
|
|
|
|
|
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.xunmei.common.core.domain.iot.domain.IotSensor;
|
|
|
import com.xunmei.common.core.domain.mediator.domain.IotAlarmData;
|
|
|
+import com.xunmei.common.core.domain.mediator.domain.IotAlarmRuleExpress;
|
|
|
+import com.xunmei.common.core.domain.mediator.domain.IotAlarmRuleSource;
|
|
|
+import com.xunmei.common.core.domain.mediator.domain.IotAlarmSystemField;
|
|
|
+import com.xunmei.common.core.enums.CategoryDataEnum;
|
|
|
+import com.xunmei.common.core.utils.DateUtils;
|
|
|
+import com.xunmei.mediator.api.enums.AlarmRuleExpressOperateEnum;
|
|
|
import com.xunmei.mediator.api.mapper.IotAlarmDataMapper;
|
|
|
+import com.xunmei.mediator.api.mapper.IotAlarmRuleExpressMapper;
|
|
|
+import com.xunmei.mediator.api.mapper.IotAlarmRuleSourceMapper;
|
|
|
+import com.xunmei.mediator.api.mapper.IotAlarmSystemFieldMapper;
|
|
|
import com.xunmei.mediator.api.service.IotAlarmDataService;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.util.*;
|
|
|
+import java.util.function.Function;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* <p>
|
|
|
@@ -18,4 +41,191 @@ import org.springframework.stereotype.Service;
|
|
|
@Service
|
|
|
public class IotAlarmDataServiceImpl extends ServiceImpl<IotAlarmDataMapper, IotAlarmData> implements IotAlarmDataService {
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private IotAlarmRuleSourceMapper iotAlarmRuleSourceMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IotAlarmRuleExpressMapper iotAlarmRuleExpressMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IotAlarmSystemFieldMapper iotAlarmSystemFieldMapper;
|
|
|
+
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @Override
|
|
|
+ public void dealSensorData(IotSensor iotSensor) throws Exception {
|
|
|
+ /**
|
|
|
+ * 生成告警数据逻辑梳理
|
|
|
+ * 1.根据传入的设备数据,判断设备类型。
|
|
|
+ * 2.根据设备类型获取设备绑定规则。
|
|
|
+ * 3.根据绑定规则判断适用于星期几,时间段。
|
|
|
+ * 4.根据绑定的规则判断是否需要生成告警数据。
|
|
|
+ * 5.如果结果是告警,判断是否已有告警数据,如果有则不生成告警数据。如果是告警结束,则修改告警数据的结束时间。
|
|
|
+ */
|
|
|
+ Date now = new Date();
|
|
|
+ //判断是否有绑定规则
|
|
|
+ QueryWrapper<IotAlarmRuleSource> qw = new QueryWrapper<>();
|
|
|
+ qw.lambda().eq(IotAlarmRuleSource::getValue,iotSensor.getDeviceCode())
|
|
|
+ .eq(IotAlarmRuleSource::getOrgId,iotSensor.getOrgId());
|
|
|
+ IotAlarmRuleSource iotAlarmRuleSource = iotAlarmRuleSourceMapper.selectOne(qw);
|
|
|
+ if(iotAlarmRuleSource == null){
|
|
|
+ //设备未绑定规则,不做处理
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //获取该设备对应的规则
|
|
|
+ int weekDay = DateUtil.thisDayOfWeek() - 1;
|
|
|
+ System.out.println(weekDay);
|
|
|
+ QueryWrapper<IotAlarmRuleExpress> ruleExpress = new QueryWrapper<>();
|
|
|
+ ruleExpress.lambda().eq(IotAlarmRuleExpress::getRuleId,iotAlarmRuleSource.getRuleId())
|
|
|
+ .eq(IotAlarmRuleExpress::getSourceType,iotAlarmRuleSource.getSourceType())
|
|
|
+ .eq(IotAlarmRuleExpress::getWeekDay,weekDay);
|
|
|
+ List<IotAlarmRuleExpress> iotAlarmRuleExpresses = iotAlarmRuleExpressMapper.selectList(ruleExpress);
|
|
|
+
|
|
|
+ List<IotAlarmSystemField> fields = iotAlarmSystemFieldMapper.selectList(null);
|
|
|
+ Map<String, IotAlarmSystemField> fieldMap = fields.stream().collect(Collectors.toMap(IotAlarmSystemField::getSysFieldCode, Function.identity()));
|
|
|
+ String dateStr = DateUtil.format(new Date(), "yyyy-MM-dd");
|
|
|
+ boolean isAlarm = false;
|
|
|
+ boolean isExpress = false;
|
|
|
+ List<IotAlarmData> list = new ArrayList<>();
|
|
|
+ for (IotAlarmRuleExpress express : iotAlarmRuleExpresses) {
|
|
|
+ boolean isOk = comparetoTime(express, dateStr, now);
|
|
|
+ if(!isOk){
|
|
|
+ //不在时间段内
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ isExpress = true;
|
|
|
+ IotAlarmData alarmData = createAlarmData(iotSensor, express, fieldMap);
|
|
|
+ if(alarmData != null){
|
|
|
+ isAlarm = true;
|
|
|
+ list.add(alarmData);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ String deviceCode = iotSensor.getDeviceCode();
|
|
|
+ QueryWrapper<IotAlarmData> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.lambda().eq(IotAlarmData::getDeviceId,deviceCode)
|
|
|
+ .eq(IotAlarmData::getOrgId,iotSensor.getOrgId())
|
|
|
+ .isNull(IotAlarmData::getEndTime);
|
|
|
+ List<IotAlarmData> alarms = baseMapper.selectList(queryWrapper);
|
|
|
+ if(isAlarm && alarms.size() == 0){
|
|
|
+ //报警中,且表中没有告警数据,则插入数据
|
|
|
+ this.saveBatch(list);
|
|
|
+ }
|
|
|
+ if(isExpress && !isAlarm && alarms.size() != 0){
|
|
|
+ //报警恢复
|
|
|
+ IotAlarmData iotAlarmData = alarms.get(0);
|
|
|
+ iotAlarmData.setEndTime(LocalDateTime.now());
|
|
|
+ this.updateById(iotAlarmData);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void dealSensorListData(List<IotSensor> iotSensor) throws Exception {
|
|
|
+ if(ObjectUtil.isEmpty(iotSensor)){
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ for (IotSensor sensor : iotSensor) {
|
|
|
+ dealSensorData(sensor);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private IotAlarmData createAlarmData(IotSensor iotSensor,IotAlarmRuleExpress express,Map<String, IotAlarmSystemField> fieldMap){
|
|
|
+ IotAlarmData iotAlarmData = null;
|
|
|
+ String operator = express.getOperator();
|
|
|
+ String value = express.getValue();
|
|
|
+ String infos = iotSensor.getInfos();
|
|
|
+ Map<String, String> dataMap = dealInfos(infos);
|
|
|
+ IotAlarmSystemField field = fieldMap.get(express.getFieldcode());
|
|
|
+ String sensorValue = dataMap.get(field.getName());
|
|
|
+ if(AlarmRuleExpressOperateEnum.EQUALS.getText().equals(operator)){
|
|
|
+ if(sensorValue.equals(value)){
|
|
|
+ //对上了
|
|
|
+ iotAlarmData = builderAlarm(sensorValue,field,express,iotSensor);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(AlarmRuleExpressOperateEnum.GT.getText().equals(operator)){
|
|
|
+ if(Integer.parseInt(value) > Integer.parseInt(sensorValue)){
|
|
|
+ //对上了
|
|
|
+ iotAlarmData = builderAlarm(sensorValue,field,express,iotSensor);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(AlarmRuleExpressOperateEnum.GTE.getText().equals(operator)){
|
|
|
+ if(Integer.parseInt(value) >= Integer.parseInt(sensorValue)){
|
|
|
+ //对上了
|
|
|
+ iotAlarmData = builderAlarm(sensorValue,field,express,iotSensor);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(AlarmRuleExpressOperateEnum.LT.getText().equals(operator)){
|
|
|
+ if(Integer.parseInt(value) < Integer.parseInt(sensorValue)){
|
|
|
+ //对上了
|
|
|
+ iotAlarmData = builderAlarm(sensorValue,field,express,iotSensor);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(AlarmRuleExpressOperateEnum.LTE.getText().equals(operator)){
|
|
|
+ if(Integer.parseInt(value) <= Integer.parseInt(sensorValue)){
|
|
|
+ //对上了
|
|
|
+ iotAlarmData = builderAlarm(sensorValue,field,express,iotSensor);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(AlarmRuleExpressOperateEnum.LTE.getText().equals(operator)){
|
|
|
+ if(Integer.parseInt(value) <= Integer.parseInt(sensorValue)){
|
|
|
+ //对上了
|
|
|
+ iotAlarmData = builderAlarm(sensorValue,field,express,iotSensor);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return iotAlarmData;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private IotAlarmData builderAlarm(String sensorValue,IotAlarmSystemField field,IotAlarmRuleExpress express,IotSensor iotSensor){
|
|
|
+ IotAlarmData iotAlarmData = new IotAlarmData();
|
|
|
+ iotAlarmData.setAlarmValue(sensorValue + field.getUnit());
|
|
|
+ iotAlarmData.setTime(LocalDateTime.now());
|
|
|
+ iotAlarmData.setRuleId(express.getRuleId());
|
|
|
+ iotAlarmData.setDeviceId(iotSensor.getDeviceId());
|
|
|
+ iotAlarmData.setSourceType(field.getSourceType());
|
|
|
+ iotAlarmData.setSourceTypeDes(field.getSourceTypeDes());
|
|
|
+ iotAlarmData.setFieldCode(field.getSysFieldCode());
|
|
|
+ iotAlarmData.setOperator(express.getOperator());
|
|
|
+ iotAlarmData.setValue(express.getValue());
|
|
|
+ iotAlarmData.setValueText(express.getValueText());
|
|
|
+ iotAlarmData.setContent(iotSensor.getDeviceName() + "触发" + field.getName());
|
|
|
+ return iotAlarmData;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map<String,String> dealInfos(String infos){
|
|
|
+ JSONArray objects = JSONArray.parseArray(infos);
|
|
|
+ Map<String,String> map = new HashMap<>();
|
|
|
+ for (Object object : objects) {
|
|
|
+ JSONObject data = (JSONObject) object;
|
|
|
+ map.put(data.getString("name"),data.getString("val"));
|
|
|
+ }
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean comparetoTime(IotAlarmRuleExpress express,String dateStr,Date now){
|
|
|
+ //判断是否在规则时间段内
|
|
|
+ String format = "yyyy-MM-dd HH:mm:ss";
|
|
|
+ String start = dateStr + " " + express.getStartTime();
|
|
|
+ String end = dateStr + " " + express.getEndTime();
|
|
|
+
|
|
|
+ Date startTime = DateUtils.dateTime(format, start);
|
|
|
+ Date endTime = DateUtils.dateTime(format, end);
|
|
|
+
|
|
|
+ boolean isOk = false;
|
|
|
+ if(now.after(startTime) && now.before(endTime)){
|
|
|
+ isOk = true;
|
|
|
+ }
|
|
|
+ return isOk;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
}
|