浏览代码

主机上报物联告警数据,中间存在几次数据丢失,未结束历史告警数据处理优化

humingshi-7@163.com 9 月之前
父节点
当前提交
f5417b6183

+ 14 - 20
soc-modules/soc-modules-host/src/main/java/com/xunmei/host/iot/service/impl/IotDeviceStatusServiceImpl.java

@@ -257,32 +257,26 @@ public class IotDeviceStatusServiceImpl extends ServiceImpl<IotDeviceStatusMappe
     }
 
     private void otherLogic(AlarmDataReq dataReq, Long deviceId) {
-        //如果历史没有产生告警 那么这次不管上报什么都不做操作
+        //存在正在告警数据,且与上报的id不一致
         LambdaQueryWrapper<IotAlarmData> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(IotAlarmData::getDeviceId, deviceId);
         queryWrapper.eq(IotAlarmData::getFieldCode, dataReq.getProductProperty());
-        queryWrapper.orderByDesc(IotAlarmData::getTime);
-        queryWrapper.last(Constants.LIMIT1);
-        final IotAlarmData alarmData = iotAlarmDataService.getOne(queryWrapper);
-        if (alarmData == null) {
+        queryWrapper.isNull(IotAlarmData::getEndTime);
+        queryWrapper.ne(IotAlarmData::getId, dataReq.getId());
+        List<IotAlarmData> alarmingList = iotAlarmDataService.list(queryWrapper);
+        if (alarmingList == null || alarmingList.isEmpty()) {
             return;
         }
 
-        //处理平台设备正在告警中,又上报了同设备的告警开始数据的情况(丢失了中间的告警结束数据)
-        if (ObjectUtil.isNull(dataReq.getEndTime())) {
-            LambdaUpdateWrapper<IotAlarmData> wrapper = new LambdaUpdateWrapper<>();
-            wrapper.eq(IotAlarmData::getDeviceId, deviceId);
-            wrapper.eq(IotAlarmData::getFieldCode, dataReq.getProductProperty());
-            wrapper.isNull(IotAlarmData::getTime);
-            wrapper.ne(IotAlarmData::getId, dataReq.getId());
-            wrapper.set(IotAlarmData::getEndTime, LocalDateTime.now());
-            iotAlarmDataService.update(wrapper);
-        }
-        //当前设备正在告警,却收到设备恢复的数据,说明丢失了设备的告警恢复与告警开始数据,那么将当前设备历史告警的结束时间设置为当前时间
-        if (alarmData.getEndTime() == null && !alarmData.getId().equals(dataReq.getId())){
-            alarmData.setEndTime(LocalDateTime.now());
-            LogUtils.SOCKET_DEVICE_ALARM_DATA.warn("收到设备告警恢复数据,但存在历史告警未能正常结束告警,修改历史告警的恢复时间为当前时间,设备id:{},告警数据id:{},告警数据:{}", deviceId, dataReq.getId(), JSON.toJSONString(alarmData));
-        }
+        //更新异常丢失数据为结束
+        LambdaUpdateWrapper<IotAlarmData> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.eq(IotAlarmData::getDeviceId, String.valueOf(deviceId));
+        wrapper.eq(IotAlarmData::getFieldCode, dataReq.getProductProperty());
+        wrapper.isNull(IotAlarmData::getEndTime);
+        wrapper.ne(IotAlarmData::getId, dataReq.getId());
+        wrapper.set(IotAlarmData::getEndTime, LocalDateTime.now());
+        iotAlarmDataService.update(wrapper);
+        LogUtils.SOCKET_DEVICE_ALARM_DATA.info("收到设备告警数据,但存在历史告警未能正常结束告警,修改历史告警的恢复时间为当前时间,设备id:{}", deviceId);
     }