Переглянути джерело

bug:处理异常硬盘未产生告警bug

jingyuanchao 10 місяців тому
батько
коміт
51af129ff7

+ 1 - 1
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/alarm/service/IotAlarmDataService.java

@@ -49,6 +49,6 @@ public interface IotAlarmDataService extends IService<IotAlarmData> {
      * @param iotDvrDisk
      * @throws Exception
      */
-    void dealDvrDiskData(IotDvrHardDiskDetection iotDvrDisk)throws Exception;
+    void dealDvrDiskData(IotDvrHardDiskDetection iotDvrDisk,String iotCode,String produceName,String deviceName)throws Exception;
 
 }

+ 29 - 36
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/alarm/service/impl/IotAlarmDataServiceImpl.java

@@ -2,8 +2,10 @@ package com.xunmei.host.alarm.service.impl;
 
 
 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.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.xunmei.common.core.constant.SecurityConstants;
@@ -17,18 +19,16 @@ import com.xunmei.common.core.domain.video.MediatorVideoDiagnosisRecord;
 import com.xunmei.common.core.utils.DateUtils;
 import com.xunmei.common.core.utils.StringUtils;
 import com.xunmei.host.alarm.mapper.IotAlarmDataMapper;
-import com.xunmei.host.alarm.mapper.IotAlarmRuleExpressMapper;
-import com.xunmei.host.alarm.mapper.IotAlarmRuleSourceMapper;
-import com.xunmei.host.alarm.mapper.IotAlarmSystemFieldMapper;
 import com.xunmei.host.alarm.service.IotAlarmDataService;
 import com.xunmei.host.enums.AlarmDataTypeEnum;
 import com.xunmei.host.enums.AlarmRuleExpressOperateEnum;
 import com.xunmei.host.enums.AlarmVideoTypeEnum;
-import com.xunmei.host.iot.mapper.IotDeviceStatusMapper;
+import com.xunmei.host.iot.service.IIotDeviceInfoService;
 import com.xunmei.system.api.RemoteConfigService;
-import com.xunmei.system.api.RemoteSmsService;
 import com.xunmei.system.api.domain.SysConfig;
+import com.xunmei.system.api.domain.iot.IotDeviceInfo;
 import com.xunmei.system.api.domain.iot.IotDeviceStatus;
+import com.xunmei.system.api.util.LogUtils;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -53,24 +53,14 @@ import java.util.*;
 @Service
 public class IotAlarmDataServiceImpl extends ServiceImpl<IotAlarmDataMapper, IotAlarmData> implements IotAlarmDataService {
 
-    @Autowired
-    private IotAlarmRuleSourceMapper iotAlarmRuleSourceMapper;
-
-    @Autowired
-    private IotAlarmRuleExpressMapper iotAlarmRuleExpressMapper;
-
-    @Autowired
-    private IotAlarmSystemFieldMapper iotAlarmSystemFieldMapper;
 
     @Autowired
-    private IotDeviceStatusMapper deviceStatusMapper;
+    private IIotDeviceInfoService deviceInfoService;
     ;
 
     @Autowired
     private RemoteConfigService remoteConfigService;
 
-    @Autowired
-    private RemoteSmsService remoteSmsService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -194,7 +184,8 @@ public class IotAlarmDataServiceImpl extends ServiceImpl<IotAlarmDataMapper, Iot
                 }
             }
         }
-    */}
+    */
+    }
 
    /* @Transactional(rollbackFor = Exception.class)
     @Override
@@ -420,34 +411,39 @@ public class IotAlarmDataServiceImpl extends ServiceImpl<IotAlarmDataMapper, Iot
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void dealDvrDiskData(IotDvrHardDiskDetection iotDvrDisk) throws Exception {
+    public void dealDvrDiskData(IotDvrHardDiskDetection iotDvrDisk, String iotCode, String produceName, String deviceName) throws Exception {
 
         /**
          * [{"index":8,"name":"DISK8","state":0},{"index":3,"name":"DISK3","state":0},{"index":1,"name":"DISK1","state":0}]
          */
         String detailInfo = iotDvrDisk.getDetailInfo();
         if (StringUtils.isEmpty(detailInfo)) {
+            LogUtils.STATUS_INFO_DISKS.error("硬盘状态上报,detailInfo为空,此次不做处理,iotCode: {},produceName: {},deviceName: {},iotDvrDisk:{}", iotCode, produceName, deviceName, JSON.toJSONString(iotDvrDisk));
             return;
         }
-        Long orgId = iotDvrDisk.getOrgId();
         //监控主机唯一标识
-        String hostCode = iotDvrDisk.getEquipmentCode();
         String equipmentName = iotDvrDisk.getEquipmentName();
         List<DiskVo> diskVos = JSONArray.parseArray(detailInfo, DiskVo.class);
+
+        final IotDeviceInfo deviceInfo = deviceInfoService.selectByTokenProductAndDeviceCode(iotCode, produceName, deviceName);
+        if (deviceInfo == null) {
+            LogUtils.STATUS_INFO_DISKS.error("硬盘状态上报,未能找到监控主机,iotCode: {},produceName: {},deviceName: {}", iotCode, produceName, deviceName);
+            return;
+        }
+        LambdaQueryWrapper<IotAlarmData> qw = new LambdaQueryWrapper<>();
+        qw.eq(IotAlarmData::getOrgId, iotDvrDisk.getOrgId())
+                .eq(IotAlarmData::getDeviceId, deviceInfo.getId())
+                .isNull(IotAlarmData::getEndTime);
+        List<IotAlarmData> datas = baseMapper.selectList(qw);
+
         for (DiskVo diskVo : diskVos) {
             //硬盘状态。0:正常,1:异常
             Integer state = diskVo.getState();
-            hostCode = hostCode + "__" + diskVo.getIndex();
-
-            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, diskVo.getName(), orgId, hostCode);
+                IotAlarmData alarmDisk = createAlarmDisk(equipmentName, diskVo.getName(), iotDvrDisk.getOrgId(), deviceInfo.getId());
                 this.save(alarmDisk);
+                LogUtils.STATUS_INFO_DISKS.info("磁盘状态: {}产生告警信息", alarmDisk.getDeviceName());
             }
 
             if (state == 0 && datas.size() > 0) {
@@ -455,19 +451,16 @@ public class IotAlarmDataServiceImpl extends ServiceImpl<IotAlarmDataMapper, Iot
                 iotAlarmData.setEndTime(LocalDateTime.now());
                 this.updateById(iotAlarmData);
             }
-
         }
-
-
     }
 
-    private IotAlarmData createAlarmDisk(String equipmentName, String diskName, long orgId, String hostCode) {
+    private IotAlarmData createAlarmDisk(String equipmentName, String diskName, long orgId, Long deviceId) {
         IotAlarmData iotAlarmData = new IotAlarmData();
         iotAlarmData.setAlarmValue("异常");
         iotAlarmData.setTime(LocalDateTime.now());
         iotAlarmData.setDeviceName(equipmentName + "-" + diskName);
         iotAlarmData.setRuleId(1L);
-       // iotAlarmData.setSourceType(AlarmVideoTypeEnum.DVRDISK.getValue());
+        iotAlarmData.setSourceType(String.valueOf(AlarmVideoTypeEnum.DVRDISK.getValue()));
         iotAlarmData.setSourceTypeDes(AlarmVideoTypeEnum.getTextByValue(AlarmVideoTypeEnum.DVRDISK.getValue()) + "告警");
         iotAlarmData.setFieldCode(AlarmVideoTypeEnum.DVRDISK.getValue() + "");
         iotAlarmData.setOperator("EQUALS");
@@ -476,7 +469,7 @@ public class IotAlarmDataServiceImpl extends ServiceImpl<IotAlarmDataMapper, Iot
         iotAlarmData.setContent(iotAlarmData.getDeviceName() + "触发" + iotAlarmData.getSourceTypeDes());
         iotAlarmData.setOrgId(orgId);
         iotAlarmData.setDataType(AlarmDataTypeEnum.HOST_ALARM.getValue());
-        iotAlarmData.setDeviceId(hostCode);
+        iotAlarmData.setDeviceId(deviceId.toString());
         return iotAlarmData;
     }
 
@@ -500,7 +493,7 @@ public class IotAlarmDataServiceImpl extends ServiceImpl<IotAlarmDataMapper, Iot
 
 
         }
-        if (ObjectUtil.equal(diagnosisValue, 0)  && !iots.isEmpty()) {
+        if (ObjectUtil.equal(diagnosisValue, 0) && !iots.isEmpty()) {
             IotAlarmData iotAlarmData = iots.get(0);
             iotAlarmData.setEndTime(LocalDateTime.now());
             this.updateById(iotAlarmData);
@@ -578,7 +571,7 @@ public class IotAlarmDataServiceImpl extends ServiceImpl<IotAlarmDataMapper, Iot
             iotAlarmData.setDeviceName(deviceName + "-" + channelName);
         }
         iotAlarmData.setRuleId(1L);
-        iotAlarmData.setSourceType(diagnosisType+"");
+        iotAlarmData.setSourceType(diagnosisType + "");
         iotAlarmData.setSourceTypeDes(AlarmVideoTypeEnum.getTextByValue(diagnosisType) + "告警");
         iotAlarmData.setFieldCode(diagnosisType + "");
         iotAlarmData.setOperator("EQUALS");

+ 2 - 2
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/iot/service/impl/IotDeviceInfoServiceImpl.java

@@ -373,8 +373,8 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
                     return WebsocketResult.replyError(req, ErrorMsgConstants.ERROR_ROUTE);
             }
         } catch (Exception e) {
-            LogUtils.SYNC_DEVICE.error("设备基础数据,处理失败", e);
-            throw new RuntimeException("设备基础数据,处理失败", e);
+            LogUtils.SYNC_DEVICE.error("设备数据,处理失败,事件名称:{},异常信息:{}",req.getEvent(), e);
+            throw new RuntimeException("设备数据,处理失败", e);
         }
         return WebsocketResult.replySuccess(req);
     }

+ 12 - 6
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/video/service/impl/IotDvrHardDiskDetectionServiceImpl.java

@@ -37,6 +37,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.support.TransactionSynchronizationAdapter;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
 
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
@@ -83,7 +85,7 @@ public class IotDvrHardDiskDetectionServiceImpl extends ServiceImpl<IotDvrHardDi
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
+    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
     public WebsocketResult execute(WebsocketExecuteReq req) {
         try {
             JSONObject data = (JSONObject) req.getData();
@@ -103,7 +105,7 @@ public class IotDvrHardDiskDetectionServiceImpl extends ServiceImpl<IotDvrHardDi
             final JSONObject errorDto = WebsocketResult.dealReceiveErrorDto(res);
             return WebsocketResult.reply(req, errorDto);
         } catch (Exception e) {
-            throw new RuntimeException("处理硬盘检测数据上报发生异常",e);
+            throw new RuntimeException("处理硬盘检测数据上报发生异常", e);
         }
     }
 
@@ -246,19 +248,23 @@ public class IotDvrHardDiskDetectionServiceImpl extends ServiceImpl<IotDvrHardDi
             LogUtils.STATUS_INFO_DISKS.info("硬盘检测上报状态消息,开始处理对应盘符状态.....");
             iotDvrDiskService.updateStatusByDiskDetection(videoRecorderHardDiskDetection, videoRecorderHardDiskDetectionEditDto.getToken());
         } catch (Exception e) {
-            LogUtils.STATUS_INFO_DISKS.info("硬盘检测处理处理对应盘符状态时发生异常!内容:{}", e.getMessage());
+            LogUtils.STATUS_INFO_DISKS.info("硬盘检测处理处理对应盘符状态时发生异常!内容:{}", e);
             throw new RuntimeException(e);
         }
 
-       /* TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
+        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
             @Override
             public void afterCommit() {
                 try {
-                    iotAlarmDataService.dealDvrDiskData(videoRecorderHardDiskDetection);
+                    iotAlarmDataService.dealDvrDiskData(videoRecorderHardDiskDetection,
+                            videoRecorderHardDiskDetectionEditDto.getToken(),
+                            videoRecorderHardDiskDetectionEditDto.getProductName(),
+                            videoRecorderHardDiskDetectionEditDto.getDeviceName());
                 } catch (Exception e) {
+                    LogUtils.STATUS_INFO_DISKS.error("硬盘检测上报状态消息,解析磁盘是否需要产生告警时发生异常:{}", e);
                     throw new RuntimeException(e);
                 }
             }
-        });*/
+        });
     }
 }

+ 22 - 0
soc-modules/soc-modules-host/src/main/resources/logback.xml

@@ -50,6 +50,24 @@
             <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
         </encoder>
     </appender>
+
+    <!-- 硬盘状态 日志  -->
+    <appender name="statusDisksLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <maxFileSize>${max.file.size}</maxFileSize>
+            <!--日志文件输出的文件名-->
+            <FileNamePattern>${LOG_HOME}/statusDisksLog/%d{yyyy-MM-dd}-%i.log</FileNamePattern>
+            <!--日志文件保留天数-->
+            <maxHistory>${max.history}</maxHistory>
+            <totalSizeCap>${total.size.cap}</totalSizeCap>
+            <cleanHistoryOnStart>true</cleanHistoryOnStart>
+        </rollingPolicy>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
+            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+        </encoder>
+    </appender>
+
     <!-- websocket消息重试日志  -->
     <appender name="wsMsgRetryLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
@@ -290,6 +308,10 @@
         <!--上面appender元素的name值。为了和logger的name属性做区分,我故意写的不一样-->
         <appender-ref ref="websocketMsgLog"/>
     </logger>
+    <logger name="statusDisksLog" additivity="false" level="info">
+        <!--上面appender元素的name值。为了和logger的name属性做区分,我故意写的不一样-->
+        <appender-ref ref="statusDisksLog"/>
+    </logger>
     <logger name="socketBaseDeviceInfo" additivity="false" level="info">
         <!--上面appender元素的name值。为了和logger的name属性做区分,我故意写的不一样-->
         <appender-ref ref="socketBaseDeviceInfo"/>

+ 3 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/mapper/IotDeviceInfoMapper.java

@@ -34,4 +34,7 @@ public interface IotDeviceInfoMapper extends BaseMapper<IotDeviceInfo> {
     void updateDeletedDvrAndChannel(@Param("iotCode") String iotCode, @Param("deviceProduct") String deviceProduct, @Param("deviceCode") String deviceCode);
 
     void updateDeletedById(@Param("deviceInfoId") Long deviceInfoId);
+
+    Integer checkIpRepeat(@Param("iotCode") String iotCode, @Param("ip") String ip, @Param("deviceId") Long deviceId);
+
 }

+ 2 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/service/IIotDeviceInfoService.java

@@ -53,4 +53,6 @@ public interface IIotDeviceInfoService extends IService<IotDeviceInfo> {
 
     AjaxResult baseDeviceGet();
 
+    boolean checkIpRepeat(String iotCode,String ip,Long deviceId);
+
 }

+ 18 - 0
soc-modules/soc-modules-iot/src/main/java/com/xunmei/iot/service/impl/IotDeviceInfoServiceImpl.java

@@ -219,6 +219,10 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
         IotDeviceInfo deviceInfo;
         SysOrg sysOrg = orgService.selectOrgById(req.getOrgId(), SecurityConstants.INNER);
         int effect = 0;
+        final boolean repeat = this.checkIpRepeat(req.getIotCode(), req.getServerIp(), deviceId);
+        if (repeat) {
+            throw new RuntimeException("该IP已存在");
+        }
         if (deviceId == null) {
             deviceInfo = new IotDeviceInfo();
             buildDeviceInfo(deviceInfo, req, sysOrg);
@@ -334,6 +338,10 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
     @Transactional(rollbackFor = Exception.class)
     public Integer editAlarmHostDevice(EditAlarmHostDeviceDto req) {
         Long deviceId = req.getId();
+        final boolean repeat = this.checkIpRepeat(req.getIotCode(), req.getServerIp(), deviceId);
+        if (repeat) {
+            throw new RuntimeException("该IP已存在");
+        }
         SysOrg sysOrg = orgService.selectOrgById(req.getOrgId(), SecurityConstants.INNER);
 
         if (deviceId == null) {
@@ -520,6 +528,10 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Integer editNetHostDevice(EditNetHostDeviceDto req) {
+        final boolean repeat = this.checkIpRepeat(req.getIotCode(), req.getServerIp(), req.getId());
+        if (repeat) {
+            throw new RuntimeException("该IP已存在");
+        }
         final SysUser sysUser = SecurityUtils.getLoginUser().getSysUser();
         final SysOrg sysOrg = orgService.selectSysOrgById(req.getOrgId(), SecurityConstants.INNER);
         IotDeviceInfo deviceInfo;
@@ -594,6 +606,12 @@ public class IotDeviceInfoServiceImpl extends ServiceImpl<IotDeviceInfoMapper, I
     }
 
     @Override
+    public boolean checkIpRepeat(String iotCode, String ip, Long deviceId) {
+        Integer exit = baseMapper.checkIpRepeat(iotCode, ip, deviceId);
+        return exit != null && exit > 0;
+    }
+
+    @Override
     @Transactional(rollbackFor = Exception.class)
     public void deletedDevice(Long deviceId) {
         final IotDeviceInfo deviceInfo = getById(deviceId);

+ 9 - 0
soc-modules/soc-modules-iot/src/main/resources/mapper/IotDeviceInfoMapper.xml

@@ -141,4 +141,13 @@
         set deleted=1
         where id = #{deviceInfoId}
     </update>
+
+    <select id="checkIpRepeat" resultType="java.lang.Integer">
+        select 1 from iot_device_info i inner join iot_device_info_extend e on i.id=e.device_id
+        where i.iot_token=#{iotCode} and e.net_address=#{ip}
+        <if test="deviceId !=null and deviceId !=''">
+            and i.id != #{deviceId}
+        </if>
+        and i.deleted=0 and e.deleted=0 limit 1
+    </select>
 </mapper>