| | |
| | | * @return 成功插入的记录数 |
| | | */ |
| | | @Override |
| | | public int insertArdDroneLs(String[] boxSn, Long deptId) { |
| | | public int insertArdDroneLs(String[] boxSn,Long deptId,String serverId) { |
| | | // 参数校验 |
| | | if (boxSn == null || boxSn.length == 0) { |
| | | log.warn("传入的盒子编码为空"); |
| | |
| | | try { |
| | | // 1. 检查已存在的无人机盒子 |
| | | List<ArdDroneInfo> existingDrones = getExistingDrones(boxSn); |
| | | // 1.1 新增时不能添加重复的 |
| | | // 1.1 新增时不能添加重复的boxSn |
| | | checkDuplicateBox(existingDrones, boxSn); |
| | | // 2. 授权数量验证 |
| | | validateAuthorization(existingDrones.size(), boxSn.length); |
| | | // 3. 获取并组装新的无人机信息 |
| | | List<ArdDroneInfo> newDrones = assembleNewDrones(boxSn, deptId); |
| | | List<ArdDroneInfo> newDrones = assembleNewDrones(boxSn,deptId,serverId); |
| | | // 4. 批量插入 |
| | | return batchInsertDrones(newDrones); |
| | | } catch (Exception e) { |
| | |
| | | /** |
| | | * 组装新的无人机信息 |
| | | */ |
| | | private List<ArdDroneInfo> assembleNewDrones(String[] boxSn, Long deptId) { |
| | | private List<ArdDroneInfo> assembleNewDrones(String[] boxSn,Long deptId,String serverId) { |
| | | List<BoxInfoReceiver> allBoxes = tyService.getBoxList(); |
| | | Set<String> targetBoxSnSet = new HashSet<>(Arrays.asList(boxSn)); |
| | | return allBoxes.stream() |
| | | .filter(box -> targetBoxSnSet.contains(box.getBoxSn())) |
| | | .map(box -> createDroneInfo(box, deptId)) |
| | | .map(box -> createDroneInfo(box, deptId, serverId)) |
| | | .collect(Collectors.toList()); |
| | | } |
| | | |
| | | /** |
| | | * 创建无人机信息对象 |
| | | */ |
| | | private ArdDroneInfo createDroneInfo(BoxInfoReceiver box, Long deptId) { |
| | | private ArdDroneInfo createDroneInfo(BoxInfoReceiver box, Long deptId ,String serverId) { |
| | | ArdDroneInfo drone = new ArdDroneInfo(); |
| | | drone.setId(IdUtils.simpleUUID()); |
| | | drone.setBoxSn(box.getBoxSn()); |
| | |
| | | drone.setVideoPort(box.getVideoPort()); |
| | | drone.setLastTaskId(box.getLastTaskId()); |
| | | drone.setDeptId(deptId); |
| | | |
| | | // 设置创建信息和更新信息 |
| | | setCreateAndUpdateInfo(drone); |
| | | |
| | | drone.setCreateTime(new Date()); |
| | | drone.setUpdateTime(new Date()); |
| | | drone.setServerId(serverId); |
| | | drone.setBoxVersion(box.getBoxVersion()); |
| | | return drone; |
| | | } |
| | | |
| | | /** |
| | | * 设置创建和更新信息 |
| | | */ |
| | | private void setCreateAndUpdateInfo(ArdDroneInfo drone) { |
| | | Date currentTime = new Date(); |
| | | drone.setCreateTime(currentTime); |
| | | drone.setUpdateTime(currentTime); |
| | | } |
| | | |
| | | /** |
| | | * 批量插入无人机信息 |
| | |
| | | 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){ |
| | | // 更新 Redis |
| | | if (currentOnline) { |
| | | redisCache.setCacheObject(redisKey, remote); |
| | | } else { |
| | | redisCache.deleteObject(redisKey); |
| | | } |
| | | // 发布事件 |
| | | eventPublisher.publishEvent(new DeviceStatusEvent(boxSn, currentOnline)); |
| | | // 更新数据库 |
| | |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 更新 localBoxInfo 的字段,如果有变化返回 true,否则返回 false |
| | | */ |
| | | private boolean updateChangedAttributes(ArdDroneInfo localBoxInfo, BoxInfoReceiver remoteArdDrone) { |
| | | boolean changed = false; |
| | | |
| | | 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; |
| | | } |
| | | |
| | | } |