| | |
| | | package com.ard.work.service.impl; |
| | | |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.ard.common.annotation.DataScope; |
| | | import com.ard.common.constant.CacheConstants; |
| | | import com.ard.common.core.redis.RedisCache; |
| | | import com.ard.common.exception.ServiceException; |
| | | import com.ard.common.utils.DateUtils; |
| | | import com.ard.common.utils.uuid.IdUtils; |
| | |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.*; |
| | | import java.util.concurrent.TimeUnit; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | |
| | | |
| | | @Resource |
| | | private AuthorizeService authorizeService; |
| | | |
| | | @Resource |
| | | private RedisCache redisCache; |
| | | |
| | | /** |
| | | * 查询无人机盒子 |
| | |
| | | /** |
| | | * 查询无人机盒子列表 |
| | | * |
| | | * @param ArdDroneInfo 无人机盒子 |
| | | * @param ardDroneInfo 无人机盒子 |
| | | * @return 无人机盒子 |
| | | */ |
| | | @Override |
| | | public List<ArdDroneInfo> selectArdDroneList(ArdDroneInfo ArdDroneInfo) { |
| | | return ArdDroneInfoMapper.selectArdDroneList(ArdDroneInfo); |
| | | @DataScope(deptAlias = "d", userAlias = "u") |
| | | public List<ArdDroneInfo> selectArdDroneList(ArdDroneInfo ardDroneInfo) { |
| | | return ArdDroneInfoMapper.selectArdDroneList(ardDroneInfo); |
| | | } |
| | | |
| | | /** |
| | |
| | | /** |
| | | * 批量新增无人机盒子 |
| | | * |
| | | * @param boxSn 盒子编码数组 |
| | | * @param boxSn 盒子编码数组 |
| | | * @param deptId 部门ID |
| | | * @return 成功插入的记录数 |
| | | */ |
| | |
| | | /** |
| | | * 同步盒子属性 |
| | | * |
| | | * @return 结果 |
| | | */ |
| | | @Scheduled(fixedRate = 1000 * 10) |
| | | @Scheduled(fixedRate = 1000 * 5) |
| | | public void syncBoxInfo() { |
| | | List<ArdDroneInfo> ArdDroneeListEntity = selectArdDroneList(new ArdDroneInfo()); |
| | | // 将本地列表转换为Map,方便快速查找 |
| | | Map<String, ArdDroneInfo> localArdDroneMap = ArdDroneeListEntity.stream() |
| | | List<ArdDroneInfo> localList = selectArdDroneList(new ArdDroneInfo(){{setUseDataScope(false);}}); |
| | | Map<String, ArdDroneInfo> localMap = localList.stream() |
| | | .collect(Collectors.toMap(ArdDroneInfo::getBoxSn, drone -> drone)); |
| | | //遍历接口最新获取的无人机盒子信息 |
| | | tyService.getBoxList().forEach(remoteArdDrone -> { |
| | | ArdDroneInfo localArdDroneInfo = localArdDroneMap.get(remoteArdDrone.getBoxSn()); |
| | | if (localArdDroneInfo != null) { |
| | | if (!localArdDroneInfo.isSameAs(remoteArdDrone)) { |
| | | // 修改无人机(只更新变化的属性) |
| | | updateChangedAttributes(localArdDroneInfo, remoteArdDrone); |
| | | updateArdDrone(localArdDroneInfo); |
| | | } |
| | | |
| | | tyService.getBoxList().forEach(remote -> { |
| | | String boxSn = remote.getBoxSn(); |
| | | |
| | | // ✅ 维护在线状态缓存 |
| | | // 只有在线的无人机才存 Redis |
| | | String redisKey = CacheConstants.UAV_ONLINE_KEY + boxSn; |
| | | if (remote.getOnLine() == 1) { |
| | | redisCache.setCacheObject(redisKey, remote, 10, TimeUnit.SECONDS); |
| | | } else { |
| | | redisCache.deleteObject(CacheConstants.UAV_ONLINE_KEY + boxSn); |
| | | } |
| | | // 数据库同步 |
| | | ArdDroneInfo local = localMap.get(boxSn); |
| | | if (local != null && !local.isSameAs(remote)) { |
| | | updateChangedAttributes(local, remote); |
| | | updateArdDrone(local); |
| | | } |
| | | }); |
| | | } |