From 86a1ca4a1dca8805e0ed217d51b69d37a7f28836 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=B0=8F=E4=BA=91?= Date: Fri, 30 Jan 2026 17:40:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96DjiService=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E6=B8=85=E9=99=A4=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 无人机和机场state消息触发时统一清除机场和所有关联无人机的ThingsBoard缓存 - 添加WebSocket广播机场ID功能 - 优化缓存失效策略,确保数据实时性 --- .../ruoyi/device/service/impl/DjiService.java | 70 ++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ruoyi/device/service/impl/DjiService.java b/src/main/java/com/ruoyi/device/service/impl/DjiService.java index 1296b90..50f6ed6 100644 --- a/src/main/java/com/ruoyi/device/service/impl/DjiService.java +++ b/src/main/java/com/ruoyi/device/service/impl/DjiService.java @@ -4,6 +4,7 @@ import com.ruoyi.device.domain.api.IAircraftDomain; import com.ruoyi.device.domain.api.IDeviceDomain; import com.ruoyi.device.domain.api.IDockAircraftDomain; import com.ruoyi.device.domain.api.IDockDomain; +import com.ruoyi.device.domain.api.IThingsBoardDomain; import com.ruoyi.device.domain.impl.DockDomainImpl; import com.ruoyi.device.domain.impl.djimqtt.callback.IDockDataCallback; import com.ruoyi.device.domain.impl.djimqtt.callback.IDroneDataCallback; @@ -17,6 +18,7 @@ import com.ruoyi.device.domain.model.Aircraft; import com.ruoyi.device.domain.model.Device; import com.ruoyi.device.domain.model.Dock; import com.ruoyi.device.domain.model.DockAircraft; +import com.ruoyi.device.websocket.StatisticsWebSocket; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.event.ApplicationReadyEvent; @@ -50,6 +52,9 @@ public class DjiService { @Autowired private IDockAircraftDomain dockAircraftDomain; + @Autowired + private IThingsBoardDomain thingsBoardDomain; + @EventListener(ApplicationReadyEvent.class) public void onApplicationReady() { @@ -82,6 +87,10 @@ public class DjiService { return; } log.info("droneData:{}", droneData); + + // 判断是否是 state 触发 + boolean isStateMessage = "state".equalsIgnoreCase(droneData.getMessageType()); + // 更新 Dock 表的 lastActiveTime Device device = deviceDomain.selectDeviceByDeviceSn(droneData.getDeviceSn()); if(Objects.nonNull(device)) { @@ -94,6 +103,24 @@ public class DjiService { if(Objects.nonNull(dock)) { dock.setLastActiveTime(new Date()); dockDomain.updateDock(dock); + + // 如果是 state 消息,清除无人机和机场的 ThingsBoard 缓存并广播 + if(isStateMessage) { + // 清除机场缓存 + Device dockDevice = deviceDomain.selectDeviceByDeviceId(dock.getDeviceId()); + if(Objects.nonNull(dockDevice) && Objects.nonNull(dockDevice.getIotDeviceId())) { + thingsBoardDomain.evictDeviceAttributesCache(dockDevice.getIotDeviceId()); + thingsBoardDomain.evictDeviceTelemetryCache(dockDevice.getIotDeviceId()); + } + + thingsBoardDomain.evictDeviceAttributesCache(device.getIotDeviceId()); + thingsBoardDomain.evictDeviceTelemetryCache(device.getIotDeviceId()); + + + // 广播机场 ID + StatisticsWebSocket.broadcast(String.valueOf(dock.getDockId())); + log.debug("已广播机场ID: dockId={}", dock.getDockId()); + } } } } @@ -107,7 +134,48 @@ public class DjiService { handler.registerDockDataCallback(new IDockDataCallback() { @Override public void onDockData(DockData dockData) { - // log.info("droneData:{}", dockData); + // log.info("dockData:{}", dockData); + + // 判断是否是 state 触发 + boolean isStateMessage = "state".equalsIgnoreCase(dockData.getMessageType()); + + // 如果是 state 消息,处理缓存清除和广播 + if(isStateMessage) { + Device dockDevice = deviceDomain.selectDeviceByDeviceSn(dockData.getDeviceSn()); + if(Objects.nonNull(dockDevice)) { + // 查找机场 + Dock dock = dockDomain.selectDockByDeviceId(dockDevice.getDeviceId()); + if(Objects.nonNull(dock)) { + + // 清除机场设备的 ThingsBoard 缓存 + if(Objects.nonNull(dockDevice.getIotDeviceId())) { + thingsBoardDomain.evictDeviceAttributesCache(dockDevice.getIotDeviceId()); + thingsBoardDomain.evictDeviceTelemetryCache(dockDevice.getIotDeviceId()); + // log.debug("已清除机场缓存: deviceSn={}, iotDeviceId={}", dockData.getDeviceSn(), dockDevice.getIotDeviceId()); + } + + // 清除机场关联的所有无人机缓存 + List dockAircrafts = dockAircraftDomain.selectDockAircraftByDockId(dock.getDockId()); + if(!dockAircrafts.isEmpty()) { + for(DockAircraft dockAircraft : dockAircrafts) { + Aircraft aircraft = aircraftDomain.selectAircraftByAircraftId(dockAircraft.getAircraftId()); + if(Objects.nonNull(aircraft)) { + Device droneDevice = deviceDomain.selectDeviceByDeviceId(aircraft.getDeviceId()); + if(Objects.nonNull(droneDevice) && Objects.nonNull(droneDevice.getIotDeviceId())) { + thingsBoardDomain.evictDeviceAttributesCache(droneDevice.getIotDeviceId()); + thingsBoardDomain.evictDeviceTelemetryCache(droneDevice.getIotDeviceId()); + // log.debug("已清除无人机缓存: aircraftId={}, iotDeviceId={}", aircraft.getAircraftId(), droneDevice.getIotDeviceId()); + } + } + } + } + + // 广播机场 ID + StatisticsWebSocket.broadcast(String.valueOf(dock.getDockId())); + log.debug("已广播机场ID: dockId={}", dock.getDockId()); + } + } + } } });