zhaowenyu
2026-03-02 1050a0dbace06b1510d53de5baedfc0ca07c8d71
ard-work/src/main/java/com/ard/work/service/impl/ArdDroneInfoServiceImpl.java
@@ -307,57 +307,62 @@
     */
    @Scheduled(fixedRate = 5000)
    public void syncBoxInfo() {
        ArdServerInfo ardServerInfo = new ArdServerInfo();
        ardServerInfo.setUseDataScope(false);
        List<ArdServerInfo> servers = ardServerInfoService.selectArdServerInfoList(ardServerInfo);
        log.debug("定时执行同步盒子属性任务");
        try {
            ArdServerInfo ardServerInfo = new ArdServerInfo();
            ardServerInfo.setUseDataScope(false);
            List<ArdServerInfo> servers = ardServerInfoService.selectArdServerInfoList(ardServerInfo);
        for (ArdServerInfo server : servers) {
            ArdDroneInfo droneInfo = new ArdDroneInfo();
            droneInfo.setServerId(server.getId());
            droneInfo.setUseDataScope(false);
            List<ArdDroneInfo> localList = selectArdDroneList(droneInfo);
            Map<String, ArdDroneInfo> localMap = localList.stream().collect(Collectors.toMap(ArdDroneInfo::getBoxSn,
                    d -> d));
            List<BoxInfoReceiver> boxList = tyService.getBoxList(server.getId());
            // server 没有返回设备列表 → 全部离线
            if (boxList == null || boxList.isEmpty()) {
                for (ArdDroneInfo local : localList) {
                    if (local.getOnLine() != 0) { // 仅当状态变化才更新
                        local.setOnLine(0);
                        ArdDroneInfoMapper.updateArdDrone(local);
                        eventPublisher.publishEvent(new DeviceStatusEvent(local.getBoxSn(), false));
                        redisCache.deleteObject(CacheConstants.UAV_ONLINE_KEY + local.getBoxSn());
            for (ArdServerInfo server : servers) {
                ArdDroneInfo droneInfo = new ArdDroneInfo();
                droneInfo.setServerId(server.getId());
                droneInfo.setUseDataScope(false);
                List<ArdDroneInfo> localList = selectArdDroneList(droneInfo);
                Map<String, ArdDroneInfo> localMap = localList.stream().collect(Collectors.toMap(ArdDroneInfo::getBoxSn,
                        d -> d));
                List<BoxInfoReceiver> boxList = tyService.getBoxList(server.getId());
                // server 没有返回设备列表 → 全部离线
                if (boxList == null || boxList.isEmpty()) {
                    for (ArdDroneInfo local : localList) {
                        if (local.getOnLine() != 0) { // 仅当状态变化才更新
                            local.setOnLine(0);
                            ArdDroneInfoMapper.updateArdDrone(local);
                            eventPublisher.publishEvent(new DeviceStatusEvent(local.getBoxSn(), false));
                            redisCache.deleteObject(CacheConstants.UAV_ONLINE_KEY + local.getBoxSn());
                        }
                    }
                    continue;
                }
                continue;
            }
            // server 返回设备列表 →  通过缓存判断状态
            for (BoxInfoReceiver remote : boxList) {
                String boxSn = remote.getBoxSn();
                String redisKey = CacheConstants.UAV_ONLINE_KEY + boxSn;
                boolean currentOnline = remote.getOnLine() == 1;
                // server 返回设备列表 →  通过缓存判断状态
                for (BoxInfoReceiver remote : boxList) {
                    String boxSn = remote.getBoxSn();
                    String redisKey = CacheConstants.UAV_ONLINE_KEY + boxSn;
                    boolean currentOnline = remote.getOnLine() == 1;
                ArdDroneInfo local = localMap.get(boxSn);
                boolean dbOnline = local != null && local.getOnLine() == 1;
                boolean needUpdate = (dbOnline != currentOnline);
                // 只要远端设备在线,就刷新Redis缓存(无论状态是否变化),保证缓存一定存在
                if (currentOnline) {
                    redisCache.setCacheObject(redisKey, remote);
                } else {
                    // 远端离线,删除Redis缓存
                    redisCache.deleteObject(redisKey);
                }
                // 如果状态变化才更新
                if (needUpdate){
                    // 发布事件
                    eventPublisher.publishEvent(new DeviceStatusEvent(boxSn, currentOnline));
                    // 更新数据库
                    if (local != null) {
                        local.setOnLine(currentOnline ? 1 : 0);
                        updateArdDrone(local);
                    ArdDroneInfo local = localMap.get(boxSn);
                    boolean dbOnline = local != null && local.getOnLine() == 1;
                    boolean needUpdate = (dbOnline != currentOnline);
                    // 只要远端设备在线,就刷新Redis缓存(无论状态是否变化),保证缓存一定存在
                    if (currentOnline) {
                        redisCache.setCacheObject(redisKey, remote);
                    } else {
                        // 远端离线,删除Redis缓存
                        redisCache.deleteObject(redisKey);
                    }
                    // 如果状态变化才更新
                    if (needUpdate) {
                        // 发布事件
                        eventPublisher.publishEvent(new DeviceStatusEvent(boxSn, currentOnline));
                        // 更新数据库
                        if (local != null) {
                            local.setOnLine(currentOnline ? 1 : 0);
                            updateArdDrone(local);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("同步盒子属性任务异常", e);
        }
    }