Explorar o código

feate: 设备自动上下线

jackzhou hai 5 meses
pai
achega
b6358421ee

+ 18 - 7
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/offline/DeviceOfflineDetectionService.java

@@ -11,6 +11,8 @@ import vip.xiaonuo.coldchain.core.alarm.bean.SensorAlarmUser;
 import vip.xiaonuo.coldchain.core.alarm.config.ColdChainAlarmMessageProperties;
 import vip.xiaonuo.coldchain.core.event.SensorAlarmEvent;
 import vip.xiaonuo.coldchain.core.renke.config.JfcloudColdChainServerProperties;
+import vip.xiaonuo.coldchain.modular.monitortarget.enums.MonitorStatusEnum;
+import vip.xiaonuo.coldchain.modular.monitortarget.service.MonitorTargetService;
 import vip.xiaonuo.coldchain.modular.monitortargetregion.entity.MonitorTargetRegion;
 import vip.xiaonuo.coldchain.modular.monitortargetregion.service.MonitorTargetRegionService;
 import vip.xiaonuo.common.cache.CommonCacheOperator;
@@ -40,6 +42,7 @@ public class DeviceOfflineDetectionService {
     private final CommonCacheOperator commonCacheOperator;
     private final ApplicationEventPublisher applicationEventPublisher;
     private final MonitorTargetRegionService monitorTargetRegionService;
+    private final MonitorTargetService monitorTargetService;
     private final ColdChainAlarmMessageProperties alarmMessageProperties;
     private final JfcloudColdChainServerProperties jfcloudColdChainServerProperties;
     private static final String KEY_SPILT = "-";
@@ -85,7 +88,7 @@ public class DeviceOfflineDetectionService {
                 route = Integer.valueOf(split[1]);
             }
             // 从 Redis 中获取设备的最后上报时间
-            String lastReportTimeStr = getLastDeviceTime(getKey(deviceCode,route));
+            String lastReportTimeStr = getLastDeviceTime(getKey(deviceCode, route));
             if (lastReportTimeStr != null) {
                 // 将上报时间字符串解析为 LocalDateTime 对象
                 LocalDateTime lastReportTime = LocalDateTime.parse(lastReportTimeStr, DATE_TIME_FORMATTER);
@@ -96,10 +99,10 @@ public class DeviceOfflineDetectionService {
                 if (lastReportTime.plusMinutes(OFFLINE_THRESHOLD_MINUTES).isBefore(now)) {
                     log.error("设备{}-{} 已离线,最后上报时间:{}。\n", deviceCode, route, lastReportTimeStr);
                     publishAlarm(deviceCode, route, lastReportTimeStr);
-                    // TODO 标识设备离线
+                    monitorTargetService.updateStatusByDeviceCode(deviceCode, route, MonitorStatusEnum.OFF);
                 } else {
-                    // TODO 标识设备在线
                     log.info("设备 {}-{} 在线,最后上报时间:{}。\n", deviceCode, route, lastReportTimeStr);
+                    monitorTargetService.updateStatusByDeviceCode(deviceCode, route, MonitorStatusEnum.ONLINE);
                 }
             } else {
                 // 如果设备上报时间为空,认为设备可能从未上报过数据
@@ -114,6 +117,13 @@ public class DeviceOfflineDetectionService {
         if (Objects.isNull(monitorTargetRegion)) {
             return;
         }
+        /**
+         * jackzhou add 设备下线预警标识
+         */
+        if (Objects.isNull(monitorTargetRegion.getDeviceOfflineAlarm()) || !monitorTargetRegion.getDeviceOfflineAlarm()) {
+            log.error("***********************设备未启动设备下线预警设置");
+            return;
+        }
         String monitorTargetId = monitorTargetRegion.getMonitorTargetId();
         Integer sensorRoute = monitorTargetRegion.getSensorRoute();
         String sensorCode = monitorTargetRegion.getSensorCode();
@@ -161,8 +171,10 @@ public class DeviceOfflineDetectionService {
      * @param time
      */
     private void cacheDeviceTime(String deviceCode, Integer route, String time) {
-        final long OFFLINE_THRESHOLD_MINUTES = jfcloudColdChainServerProperties.getDeviceOfflineInterval() / 60 / 1000;
-        commonCacheOperator.put(getKey(deviceCode, route), time/*, OFFLINE_THRESHOLD_MINUTES + 1, TimeUnit.MINUTES*/);
+//        final int minte_sufix = 2;
+//        final long OFFLINE_THRESHOLD_MINUTES = jfcloudColdChainServerProperties.getDeviceOfflineInterval() / 60 / 1000;
+//        commonCacheOperator.put(getKey(deviceCode, route), time, OFFLINE_THRESHOLD_MINUTES + minte_sufix, TimeUnit.MINUTES);
+        commonCacheOperator.put(getKey(deviceCode, route), time);
     }
 
     @NotNull
@@ -186,8 +198,7 @@ public class DeviceOfflineDetectionService {
     }
 
     private Set<String> getAllDeviceCodes() {
-        return commonCacheOperator.getAllKeys().stream()
-                .filter(key -> key.startsWith(CACHE_KEY_PREFIX)) // 过滤指定前缀的键
+        return commonCacheOperator.getAllKeys().stream().filter(key -> key.startsWith(CACHE_KEY_PREFIX)) // 过滤指定前缀的键
                 .map(key -> key.replace(CACHE_KEY_PREFIX, "")) // 去掉前缀
                 .collect(Collectors.toSet());
     }

+ 9 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/service/MonitorTargetService.java

@@ -15,6 +15,7 @@ package vip.xiaonuo.coldchain.modular.monitortarget.service;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import vip.xiaonuo.coldchain.modular.monitortarget.entity.MonitorTarget;
+import vip.xiaonuo.coldchain.modular.monitortarget.enums.MonitorStatusEnum;
 import vip.xiaonuo.coldchain.modular.monitortarget.param.*;
 
 import java.util.Date;
@@ -109,6 +110,14 @@ public interface MonitorTargetService extends IService<MonitorTarget> {
      */
     boolean updateLastLoginTimeByDeviceId(Integer deviceId, Date timestamp);
 
+    /**
+     * 更新设备状态
+     * @param deviceCode
+     * @return
+     */
+
+    boolean updateStatusByDeviceCode(String deviceCode, Integer route, MonitorStatusEnum monitorStatusEnum);
+
     /**
      * 获取监控对象列表
      * @param isAll

+ 16 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/service/impl/MonitorTargetServiceImpl.java

@@ -273,6 +273,22 @@ public class MonitorTargetServiceImpl extends ServiceImpl<MonitorTargetMapper, M
         return updateBatchById(monitorTargetList);
     }
 
+    @Override
+    public boolean updateStatusByDeviceCode(String deviceCode, Integer route, MonitorStatusEnum monitorStatusEnum) {
+        MonitorTargetRegion oneByDeviceCodeAndSensorNo = monitorTargetRegionService.findOneByDeviceCodeAndSensorNo(deviceCode, route);
+        if (Objects.nonNull(oneByDeviceCodeAndSensorNo)) {
+            String monitorTargetId = oneByDeviceCodeAndSensorNo.getMonitorTargetId();
+            if (StrUtil.isNotBlank(monitorTargetId)) {
+                MonitorTarget monitorTarget = this.getById(monitorTargetId);
+                if (Objects.nonNull(monitorTarget)) {
+                    monitorTarget.setStatus(monitorStatusEnum.getCode());
+                    return this.updateById(monitorTarget);
+                }
+            }
+        }
+        return false;
+    }
+
     @Override
     public List<MonitorTarget> myList(Boolean isAll) {
         SaBaseLoginUser loginUser = StpLoginUserUtil.getLoginUser();

+ 7 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortargetregion/entity/MonitorTargetRegion.java

@@ -99,6 +99,13 @@ public class MonitorTargetRegion extends OrgEntity {
     @Schema(description = "冷链编号")
     private String deviceCode;
 
+
+    /**
+     * 设备下线预警
+     */
+    @Schema(description = "设备下线预警")
+    private Boolean deviceOfflineAlarm;
+
     /**
      * 温度报警上限 temperature humidity co2
      */