Browse Source

添加主机类告警

高雄 1 year ago
parent
commit
3d7726042b

+ 1 - 0
project_data/sql/0.0.6-iot/soc/soc.sql

@@ -702,6 +702,7 @@ CREATE TABLE `iot_alarm_data` (
     `content` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '告警内容',
     `alarm_value` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '告警值',
     `is_do` int DEFAULT NULL COMMENT '0未处理1已处理',
+    `data_type` int DEFAULT NULL COMMENT '0动环告警 1主机类告警',
     `do_time` datetime DEFAULT NULL COMMENT '处理时间',
     `do_type` tinyint DEFAULT '0' COMMENT '处理方式:0:为处理,1:(暂无)2:误报,3:正常告警,4:报修',
     `create_time` datetime DEFAULT NULL COMMENT '创建时间',

+ 5 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/mediator/domain/IotAlarmData.java

@@ -51,6 +51,11 @@ public class IotAlarmData extends BaseEntity {
     @TableField("org_id")
     private Long orgId;
 
+
+    @ApiModelProperty(value = "告警数据类型:0 动环类告警,1主机类告警")
+    @TableField("data_type")
+    private Integer dataType;
+
     @ApiModelProperty(value = "报警源类型(设备类型):4:烟雾传感器;5: 温湿度采集器;6:水浸; 7:门磁、窗磁;8:卷帘门门磁;9:地磁;10燃气报警器;50:报警防区")
     @TableField("source_type")
     private Integer sourceType;

+ 19 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/enums/AlarmDataTypeEnum.java

@@ -0,0 +1,19 @@
+package com.xunmei.mediator.api.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+/**
+ * 告警数据类型枚举
+ */
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public enum AlarmDataTypeEnum {
+
+    IOT_ALARM(0),
+    HOST_ALARM(1);
+
+    private int value;
+}

+ 35 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/enums/AlarmVideoTypeEnum.java

@@ -0,0 +1,35 @@
+package com.xunmei.mediator.api.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public enum AlarmVideoTypeEnum {
+
+    SIGNALLOST(1001,"信号丢失"),
+    OCCLUDE(1002,"遮挡"),
+    BRIGHTNESS(1003,"亮度"),
+    COLORCAST(1004,"偏色"),
+    SNOWFLAKE(1005,"雪花"),
+    STRIPE(1006,"条纹"),
+    CONTRAST(1007,"对比度"),
+    BLURRY(1008,"模糊"),
+    DVRDISK(1009,"硬盘");
+
+    private int value;
+
+    private String text;
+
+    public static String getTextByValue(int property) {
+        for (AlarmVideoTypeEnum obj : values()) {
+            if (obj.getValue() == property) {
+                return obj.getText();
+            }
+        }
+
+        throw new IllegalArgumentException("Invalid property.");
+    }
+}

+ 2 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/mapper/IotDeviceMapper.java

@@ -3,6 +3,7 @@ package com.xunmei.mediator.api.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.xunmei.common.core.domain.iot.domain.IotDevice;
+import org.apache.ibatis.annotations.Mapper;
 
 /**
  * <p>
@@ -12,6 +13,7 @@ import com.xunmei.common.core.domain.iot.domain.IotDevice;
  * @author oygj
  * @since 2024-02-20
  */
+@Mapper
 public interface IotDeviceMapper extends BaseMapper<IotDevice> {
 
 }

+ 22 - 1
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/IotAlarmDataService.java

@@ -1,8 +1,10 @@
 package com.xunmei.mediator.api.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.xunmei.common.core.domain.iot.domain.IotDvrDisk;
 import com.xunmei.common.core.domain.iot.domain.IotSensor;
 import com.xunmei.common.core.domain.mediator.domain.IotAlarmData;
+import com.xunmei.common.core.domain.video.MediatorVideoDiagnosisRecord;
 
 import java.util.List;
 
@@ -25,7 +27,26 @@ public interface IotAlarmDataService extends IService<IotAlarmData> {
      */
     void dealSensorData(IotSensor iotSensor)throws Exception;
 
-
+    /**
+     * 处理动环类告警数据
+     * @param iotSensor
+     * @throws Exception
+     */
     void dealSensorListData(List<IotSensor> iotSensor)throws Exception;
 
+    /**
+     * 视频质量诊断告警数据
+     * @param videoDiagnosis
+     * @throws Exception
+     */
+    void dealVideoDiagnosisData(MediatorVideoDiagnosisRecord videoDiagnosis)throws Exception;
+
+
+    /**
+     * 硬盘告警处理
+     * @param iotDvrDisk
+     * @throws Exception
+     */
+    void dealDvrDiskData(IotDvrDisk iotDvrDisk)throws Exception;
+
 }

+ 162 - 0
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/impl/IotAlarmDataServiceImpl.java

@@ -8,14 +8,19 @@ 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.IotDevice;
+import com.xunmei.common.core.domain.iot.domain.IotDvrDisk;
 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.domain.video.MediatorVideoDiagnosisRecord;
 import com.xunmei.common.core.enums.CategoryDataEnum;
 import com.xunmei.common.core.utils.DateUtils;
+import com.xunmei.mediator.api.enums.AlarmDataTypeEnum;
 import com.xunmei.mediator.api.enums.AlarmRuleExpressOperateEnum;
+import com.xunmei.mediator.api.enums.AlarmVideoTypeEnum;
 import com.xunmei.mediator.api.mapper.*;
 import com.xunmei.mediator.api.service.IotAlarmDataService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -50,6 +55,9 @@ public class IotAlarmDataServiceImpl extends ServiceImpl<IotAlarmDataMapper, Iot
     @Autowired
     private IotSensorMapper iotSensorMapper;
 
+    @Autowired
+    private IotDeviceMapper iotDeviceMapper;
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void dealSensorData(IotSensor iotSensor) throws Exception {
@@ -138,6 +146,141 @@ public class IotAlarmDataServiceImpl extends ServiceImpl<IotAlarmDataMapper, Iot
         }
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void dealVideoDiagnosisData(MediatorVideoDiagnosisRecord videoDiagnosis) throws Exception {
+        //设备名称
+        String deviceName = videoDiagnosis.getDeviceName();
+        //通道名称
+        String channelName = videoDiagnosis.getChannelName();
+        //设备id
+        String deviceId = videoDiagnosis.getDeviceId();
+        //机构id
+        Long orgId = videoDiagnosis.getOrgId();
+
+        //信号丢失 0: 正常 | 1:异常 1001
+        Integer signalLost = videoDiagnosis.getSignalLost();
+        dealAlarmVideo(AlarmVideoTypeEnum.SIGNALLOST.getValue(),signalLost,deviceName,channelName,deviceId,orgId);
+
+        //遮挡  0: 正常 | 1:异常  1002
+        Integer occlude = videoDiagnosis.getOcclude();
+        dealAlarmVideo(AlarmVideoTypeEnum.OCCLUDE.getValue(),occlude,deviceName,channelName,deviceId,orgId);
+
+        //亮度  0: 正常 | 1:异常 1003
+        Integer brightness = videoDiagnosis.getBrightness();
+        dealAlarmVideo(AlarmVideoTypeEnum.BRIGHTNESS.getValue(),brightness,deviceName,channelName,deviceId,orgId);
+
+        //偏色  0: 正常 | 1:异常 1004
+        Integer colorCast = videoDiagnosis.getColorCast();
+        dealAlarmVideo(AlarmVideoTypeEnum.COLORCAST.getValue(),colorCast,deviceName,channelName,deviceId,orgId);
+
+        //雪花  0: 正常 | 1:异常 1005
+        Integer snowflake = videoDiagnosis.getSnowflake();
+        dealAlarmVideo(AlarmVideoTypeEnum.SNOWFLAKE.getValue(),snowflake,deviceName,channelName,deviceId,orgId);
+
+        //条纹  0: 正常 | 1:异常 1006
+        Integer stripe = videoDiagnosis.getStripe();
+        dealAlarmVideo(AlarmVideoTypeEnum.STRIPE.getValue(),stripe,deviceName,channelName,deviceId,orgId);
+
+        //对比度  0: 正常 | 1:异常 1007
+        Integer contrast = videoDiagnosis.getContrast();
+        dealAlarmVideo(AlarmVideoTypeEnum.CONTRAST.getValue(),contrast,deviceName,channelName,deviceId,orgId);
+
+        //模糊  0: 正常 | 1:异常 1008
+        Integer blurry = videoDiagnosis.getBlurry();
+        dealAlarmVideo(AlarmVideoTypeEnum.BLURRY.getValue(),blurry,deviceName,channelName,deviceId,orgId);
+
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void dealDvrDiskData(IotDvrDisk iotDvrDisk) throws Exception {
+        Long orgId = iotDvrDisk.getOrgId();
+
+        //硬盘状态。0:正常,1:异常
+        Integer state = iotDvrDisk.getState();
+
+        //监控主机唯一标识
+        String hostCode = iotDvrDisk.getHostCode();
+
+        QueryWrapper<IotDevice> idqw = new QueryWrapper<>();
+        idqw.lambda().eq(IotDevice::getEquipmentCode,hostCode).eq(IotDevice::getOrgId,orgId);
+        IotDevice iotDevice = iotDeviceMapper.selectOne(idqw);
+        if(iotDevice == null){
+            return;
+        }
+        String equipmentName = iotDevice.getEquipmentName();
+        String diskName = iotDvrDisk.getDiskName();
+
+        hostCode = hostCode + "__" +iotDvrDisk.getDiskIndex();
+
+        QueryWrapper<IotAlarmData> qw = new QueryWrapper<>();
+        qw.lambda().eq(IotAlarmData::getOrgId,orgId).eq(IotAlarmData::getDeviceId,hostCode).isNull(IotAlarmData::getEndTime);
+        List<IotAlarmData> datas = baseMapper.selectList(qw);
+
+
+        if(state ==1 && datas.size() == 0){
+            //报警,且没有告警数据
+            IotAlarmData alarmDisk = createAlarmDisk(equipmentName, diskName, orgId, hostCode);
+            this.save(alarmDisk);
+        }
+
+        if(state == 0 && datas.size() > 0){
+            IotAlarmData iotAlarmData = datas.get(0);
+            iotAlarmData.setEndTime(LocalDateTime.now());
+            this.updateById(iotAlarmData);
+        }
+
+
+    }
+
+    private IotAlarmData createAlarmDisk(String equipmentName,String diskName, long orgId, String hostCode){
+        IotAlarmData iotAlarmData = new IotAlarmData();
+        iotAlarmData.setAlarmValue("异常");
+        iotAlarmData.setTime(LocalDateTime.now());
+        iotAlarmData.setDeviceName(equipmentName + "-" + diskName);
+        iotAlarmData.setRuleId(1L);
+        iotAlarmData.setSourceType(AlarmVideoTypeEnum.DVRDISK.getValue());
+        iotAlarmData.setSourceTypeDes(AlarmVideoTypeEnum.getTextByValue(AlarmVideoTypeEnum.DVRDISK.getValue()));
+        iotAlarmData.setFieldCode(AlarmVideoTypeEnum.DVRDISK.getValue() + "");
+        iotAlarmData.setOperator("EQUALS");
+        iotAlarmData.setValue("1");
+        iotAlarmData.setValueText("告警");
+        iotAlarmData.setContent(iotAlarmData.getDeviceName() + "触发" + iotAlarmData.getSourceTypeDes() + "告警");
+        iotAlarmData.setOrgId(orgId);
+        iotAlarmData.setDataType(AlarmDataTypeEnum.HOST_ALARM.getValue());
+        iotAlarmData.setDeviceId(hostCode);
+        return iotAlarmData;
+    }
+
+    private void dealAlarmVideo(int diagnosisType ,Integer diagnosisValue,String deviceName,String channelName,String deviceId,Long orgId){
+
+        QueryWrapper<IotAlarmData> qw = new QueryWrapper<>();
+        qw.lambda().eq(IotAlarmData::getDeviceId,deviceId).eq(IotAlarmData::getOrgId,orgId)
+                .eq(IotAlarmData::getSourceType,diagnosisType).isNull(IotAlarmData::getEndTime);
+        List<IotAlarmData> iots = baseMapper.selectList(qw);
+
+        if(diagnosisValue == 1 && iots.size() == 0){
+            /**
+             * 报警处理逻辑
+             * 1、判断报警表中是否有该类报警的数据;
+             * 2、没有,则新增该类报警。
+             * 3、有,这不做处理
+             */
+            //不存在告警,创建告警数据
+            IotAlarmData iotAlarmData = builderAlarmVideo(deviceName,channelName,diagnosisType,orgId,deviceId);
+            this.save(iotAlarmData);
+
+
+        }
+        if(diagnosisValue == 0 && iots.size() > 0){
+            IotAlarmData iotAlarmData = iots.get(0);
+            iotAlarmData.setEndTime(LocalDateTime.now());
+            this.updateById(iotAlarmData);
+        }
+
+    }
+
     private IotAlarmData createAlarmData(IotSensor iotSensor,IotAlarmRuleExpress express,Map<String, IotAlarmSystemField> fieldMap){
         IotAlarmData iotAlarmData = null;
         String operator = express.getOperator();
@@ -184,6 +327,24 @@ public class IotAlarmDataServiceImpl extends ServiceImpl<IotAlarmDataMapper, Iot
         return iotAlarmData;
     }
 
+    private IotAlarmData builderAlarmVideo(String deviceName,String channelName,int diagnosisType, long orgId,String deviceId){
+        IotAlarmData iotAlarmData = new IotAlarmData();
+        iotAlarmData.setAlarmValue("异常");
+        iotAlarmData.setTime(LocalDateTime.now());
+        iotAlarmData.setDeviceName(deviceName + "-" + channelName);
+        iotAlarmData.setRuleId(1L);
+        iotAlarmData.setSourceType(diagnosisType);
+        iotAlarmData.setSourceTypeDes(AlarmVideoTypeEnum.getTextByValue(diagnosisType));
+        iotAlarmData.setFieldCode(diagnosisType + "");
+        iotAlarmData.setOperator("EQUALS");
+        iotAlarmData.setValue("1");
+        iotAlarmData.setValueText("告警");
+        iotAlarmData.setContent(iotAlarmData.getDeviceName() + "触发" + iotAlarmData.getSourceTypeDes() + "告警");
+        iotAlarmData.setOrgId(orgId);
+        iotAlarmData.setDataType(AlarmDataTypeEnum.HOST_ALARM.getValue());
+        iotAlarmData.setDeviceId(deviceId);
+        return iotAlarmData;
+    }
 
     private IotAlarmData builderAlarm(String sensorValue,IotAlarmSystemField field,IotAlarmRuleExpress express,IotSensor iotSensor){
         IotAlarmData iotAlarmData = new IotAlarmData();
@@ -199,6 +360,7 @@ public class IotAlarmDataServiceImpl extends ServiceImpl<IotAlarmDataMapper, Iot
         iotAlarmData.setValueText(express.getValueText());
         iotAlarmData.setContent(iotSensor.getDeviceName() + "触发" + field.getName());
         iotAlarmData.setOrgId(iotSensor.getOrgId());
+        iotAlarmData.setDataType(AlarmDataTypeEnum.IOT_ALARM.getValue());
         iotAlarmData.setDeviceId(iotSensor.getDeviceCode());
         return iotAlarmData;
     }

+ 19 - 4
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/impl/IotDvrDiskServiceImpl.java

@@ -13,10 +13,7 @@ import com.xunmei.common.core.enums.CategoryDataEnum;
 import com.xunmei.common.core.utils.IDHelper;
 import com.xunmei.common.redis.utils.RedisUtils;
 import com.xunmei.mediator.api.mapper.IotDvrDiskMapper;
-import com.xunmei.mediator.api.service.IIotDeviceService;
-import com.xunmei.mediator.api.service.IotDvrDiskService;
-import com.xunmei.mediator.api.service.NorthErrorService;
-import com.xunmei.mediator.api.service.NorthStatisticsSyncService;
+import com.xunmei.mediator.api.service.*;
 import com.xunmei.mediator.util.CheckDataUtil;
 import com.xunmei.mediator.util.RedisCheckRepeatDataUtil;
 import com.xunmei.system.api.domain.north.NorthError;
@@ -31,6 +28,8 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.support.TransactionSynchronizationAdapter;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
 
 import java.time.LocalDateTime;
 import java.util.*;
@@ -56,6 +55,9 @@ public class IotDvrDiskServiceImpl extends ServiceImpl<IotDvrDiskMapper, IotDvrD
     @Autowired
     private IIotDeviceService iotDeviceService;
 
+    @Autowired
+    private IotAlarmDataService iotAlarmDataService;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void updateStatusByDiskDetection(IotDvrHardDiskDetection videoRecorderHardDiskDetection) {
@@ -120,6 +122,19 @@ public class IotDvrDiskServiceImpl extends ServiceImpl<IotDvrDiskMapper, IotDvrD
                 throw new RuntimeException(e.getMessage());
             }
         }
+
+        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
+            @Override
+            public void afterCommit() {
+                try {
+                    for (IotDvrDisk dvrdisk : dvrdisks) {
+                        iotAlarmDataService.dealDvrDiskData(dvrdisk);
+                    }
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        });
     }
 
     private Map<String, Object> checkDvrDiskPageDto(List<DvrDiskPageDto> dvrdiskPageLists, String msgId) throws IllegalAccessException {

+ 13 - 14
soc-modules/soc-modules-mediator/src/main/java/com/xunmei/mediator/api/service/impl/VideoDiagnosisRecordServiceImpl.java

@@ -14,6 +14,7 @@ import com.xunmei.common.core.utils.IDHelper;
 import com.xunmei.mediator.api.mapper.IotAlarmCodeMapper;
 import com.xunmei.mediator.api.mapper.MediatorCategoryMapper;
 import com.xunmei.mediator.api.mapper.VideoDiagnosisRecordMapper;
+import com.xunmei.mediator.api.service.*;
 import com.xunmei.mediator.api.service.IIotDeviceService;
 import com.xunmei.mediator.api.service.IIotDvrChannelService;
 import com.xunmei.mediator.api.service.IVideoDiagnosisLogService;
@@ -26,8 +27,11 @@ import com.xunmei.mediator.util.CheckDataUtil;
 import com.xunmei.mediator.util.RedisUtil;
 import com.xunmei.system.api.RemoteOrgService;
 import com.xunmei.system.api.domain.SysOrg;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.support.TransactionSynchronizationAdapter;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
 
 import javax.annotation.Resource;
 import java.text.ParseException;
@@ -58,6 +62,9 @@ public class VideoDiagnosisRecordServiceImpl extends ServiceImpl<VideoDiagnosisR
     IIotDvrChannelService dvrChannelService;
     @Resource
     IotAlarmCodeMapper alarmCodeMapper;
+
+    @Autowired
+    private IotAlarmDataService iotAlarmDataService;
     @Override
     @Transactional(rollbackFor = Exception.class)
     public ReceiveErrorDto saveData(VideoDiagnosisDto videoDiagnosisDto, String msgId) throws IllegalAccessException, ParseException {
@@ -285,23 +292,15 @@ public class VideoDiagnosisRecordServiceImpl extends ServiceImpl<VideoDiagnosisR
             throw new RuntimeException(e.getMessage());
         }
 
-    /*    TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
+        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
             @Override
             public void afterCommit() {
-                //如果未开启自动生成运维单则 返回
-                if(alarmRecordsInsert!=null&&alarmRecordsInsert.size()>0){
-                    for (HostAlarmRecord record : alarmRecordsInsert) {
-                        List<AlarmCode> codes1 = codes.stream().filter(r -> r.getCode().equals(record.getAlarmCode())).collect(Collectors.toList());
-                        if (codes1 != null && codes1.size() > 0) {
-                            AlarmCode code = codes1.get(0);
-                            if (code != null && code.getAutoGenerate()!=null&& 0 != code.getAutoGenerate()) {
-                                deal(videoDiagnosisDto, videoDiagnosis, device.getId());
-                            }
-                        }
-
-                    }
+                try {
+                    iotAlarmDataService.dealVideoDiagnosisData(videoDiagnosis);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
                 }
             }
-        });*/
+        });
     }
 }