| | |
| | | updateArdDrone(ArdDroneInfo.builder().serverId(server.getId()).onLine(0).build()); |
| | | continue; |
| | | } |
| | | boxList.forEach(remote -> { |
| | | for (BoxInfoReceiver remote : boxList) { |
| | | String boxSn = remote.getBoxSn(); |
| | | |
| | | // ✅ 维护在线状态缓存 |
| | | // 只有在线的无人机才存 Redis |
| | | String redisKey = CacheConstants.UAV_ONLINE_KEY + boxSn; |
| | | |
| | | // 只处理在线的 Redis |
| | | if (remote.getOnLine() == 1) { |
| | | redisCache.setCacheObject(redisKey, remote, 30, TimeUnit.SECONDS); |
| | | } else { |
| | | redisCache.deleteObject(CacheConstants.UAV_ONLINE_KEY + boxSn); |
| | | redisCache.deleteObject(redisKey); |
| | | } |
| | | |
| | | // 数据库同步 |
| | | ArdDroneInfo local = localMap.get(boxSn); |
| | | if (local != null && !local.isSameAs(remote)) { |
| | | updateChangedAttributes(local, remote); |
| | | updateArdDrone(local); |
| | | if (local == null) continue; |
| | | |
| | | if (updateChangedAttributes(local, remote)) { |
| | | updateArdDrone(local); // 只有真的有变化才更新数据库 |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | } |
| | | /** |
| | | * 更新 localBoxInfo 的字段,如果有变化返回 true,否则返回 false |
| | | */ |
| | | private boolean updateChangedAttributes(ArdDroneInfo localBoxInfo, BoxInfoReceiver remoteArdDrone) { |
| | | boolean changed = false; |
| | | |
| | | // 更新变化的属性 |
| | | private void updateChangedAttributes(ArdDroneInfo localBoxInfo, BoxInfoReceiver remoteArdDrone) { |
| | | if (!Objects.equals(localBoxInfo.getBoxName(), remoteArdDrone.getBoxName())) { |
| | | localBoxInfo.setBoxName(remoteArdDrone.getBoxName()); |
| | | changed = true; |
| | | } |
| | | if (!Objects.equals(localBoxInfo.getBoxVersion(), remoteArdDrone.getBoxVersion())) { |
| | | localBoxInfo.setBoxVersion(remoteArdDrone.getBoxVersion()); |
| | | changed = true; |
| | | } |
| | | if (!Objects.equals(localBoxInfo.getLastTaskId(), remoteArdDrone.getLastTaskId())) { |
| | | localBoxInfo.setLastTaskId(remoteArdDrone.getLastTaskId()); |
| | | changed = true; |
| | | } |
| | | if (!Objects.equals(localBoxInfo.getOnLine(), remoteArdDrone.getOnLine())) { |
| | | localBoxInfo.setOnLine(remoteArdDrone.getOnLine()); |
| | | changed = true; |
| | | } |
| | | // 更新其他属性 |
| | | |
| | | // TODO: 更新其他属性时,如果变化也设置 changed = true |
| | | |
| | | return changed; |
| | | } |
| | | } |