From a7aaeabc7873a0eafb4a7ecad7f65b018b7a9bc9 Mon Sep 17 00:00:00 2001
From: sean.zhou <sean.zhou@dji.com>
Date: Fri, 24 Feb 2023 19:31:23 +0800
Subject: [PATCH] What's new? 1. Add license for dock. 2. Modify the logic corresponding to the firmware file and device type. 3. Add multiple mqtt clients options. 4. Modify the structure of the interface for obtaining the device list. 5. Fixed some issues.

---
 src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java |  199 +++++++++++++++++++++++++------------------------
 1 files changed, 100 insertions(+), 99 deletions(-)

diff --git a/src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java b/src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java
index 75a97d1..6677ca8 100644
--- a/src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java
+++ b/src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java
@@ -86,9 +86,6 @@
     private ObjectMapper objectMapper;
 
     @Autowired
-    private RedisOpsUtils redisOps;
-
-    @Autowired
     private IWebSocketManageService webSocketManageService;
 
     @Autowired
@@ -99,7 +96,7 @@
     private ITSAService tsaService;
 
     private static final List<String> INIT_TOPICS_SUFFIX = List.of(
-            OSD_SUF, STATE_SUF, SERVICES_SUF + _REPLY_SUF, REQUESTS_SUF, EVENTS_SUF, PROPERTY_SUF + SET_SUF + _REPLY_SUF);
+            OSD_SUF, STATE_SUF, SERVICES_SUF + _REPLY_SUF, EVENTS_SUF, PROPERTY_SUF + SET_SUF + _REPLY_SUF);
 
     @Override
     public Boolean deviceOffline(StatusGatewayReceiver gateway) {
@@ -109,24 +106,22 @@
         // Only the remote controller is logged in and the aircraft is not connected.
         String key = RedisConst.DEVICE_ONLINE_PREFIX + gatewaySn;
 
-        boolean exist = redisOps.checkExist(key);
+        boolean exist = RedisOpsUtils.checkExist(key);
         if (!exist) {
             Optional<DeviceDTO> gatewayOpt = this.getDeviceBySn(gatewaySn);
             if (gatewayOpt.isPresent()) {
                 DeviceDTO value = gatewayOpt.get();
-                value.setBoundTime(null);
-                value.setLoginTime(null);
-                redisOps.setWithExpire(key, value, RedisConst.DEVICE_ALIVE_SECOND);
+                RedisOpsUtils.setWithExpire(key, value, RedisConst.DEVICE_ALIVE_SECOND);
                 this.pushDeviceOnlineTopo(value.getWorkspaceId(), gatewaySn, gatewaySn);
                 return true;
             }
 
             // When connecting for the first time
             DeviceEntity gatewayDevice = deviceGatewayConvertToDeviceEntity(gateway);
-            return firstSaveDevice(gatewayDevice, null);
+            return onlineSaveDevice(gatewayDevice, null).isPresent();
         }
 
-        DeviceDTO deviceDTO = (DeviceDTO) (redisOps.get(key));
+        DeviceDTO deviceDTO = (DeviceDTO) (RedisOpsUtils.get(key));
         String deviceSn = deviceDTO.getChildDeviceSn();
         if (!StringUtils.hasText(deviceSn)) {
             return true;
@@ -140,11 +135,11 @@
 
         // If no information about this device exists in the cache, the drone is considered to be offline.
         String key = RedisConst.DEVICE_ONLINE_PREFIX + deviceSn;
-        if (!redisOps.checkExist(key) || redisOps.getExpire(key) <= 0) {
+        if (!RedisOpsUtils.checkExist(key) || RedisOpsUtils.getExpire(key) <= 0) {
             log.debug("The drone is already offline.");
             return true;
         }
-        DeviceDTO device = (DeviceDTO) redisOps.get(key);
+        DeviceDTO device = (DeviceDTO) RedisOpsUtils.get(key);
         // Cancel drone-related subscriptions.
         this.unsubscribeTopicOffline(deviceSn);
 
@@ -152,8 +147,9 @@
         // Publish the latest device topology information in the current workspace.
         this.pushDeviceOfflineTopo(device.getWorkspaceId(), deviceSn);
 
-        redisOps.del(key);
-        redisOps.del(RedisConst.OSD_PREFIX + device.getDeviceSn());
+        RedisOpsUtils.del(key);
+        RedisOpsUtils.del(RedisConst.OSD_PREFIX + device.getDeviceSn());
+        RedisOpsUtils.del(RedisConst.HMS_PREFIX + device.getDeviceSn());
         log.debug("{} offline.", deviceSn);
         return true;
     }
@@ -163,11 +159,11 @@
         String deviceSn = deviceGateway.getSubDevices().get(0).getSn();
         String key = RedisConst.DEVICE_ONLINE_PREFIX + deviceSn;
         // change log:  Use redis instead of
-        long time = redisOps.getExpire(key);
-        long gatewayTime = redisOps.getExpire(RedisConst.DEVICE_ONLINE_PREFIX + deviceGateway.getSn());
+        long time = RedisOpsUtils.getExpire(key);
+        long gatewayTime = RedisOpsUtils.getExpire(RedisConst.DEVICE_ONLINE_PREFIX + deviceGateway.getSn());
 
         if (time > 0 && gatewayTime > 0) {
-            redisOps.expireKey(key, RedisConst.DEVICE_ALIVE_SECOND);
+            RedisOpsUtils.expireKey(key, RedisConst.DEVICE_ALIVE_SECOND);
             DeviceDTO device = DeviceDTO.builder().loginTime(LocalDateTime.now()).deviceSn(deviceSn).build();
             DeviceDTO gateway = DeviceDTO.builder()
                     .loginTime(LocalDateTime.now())
@@ -175,7 +171,7 @@
                     .childDeviceSn(deviceSn).build();
             this.updateDevice(gateway);
             this.updateDevice(device);
-            String workspaceId = ((DeviceDTO)(redisOps.get(key))).getWorkspaceId();
+            String workspaceId = ((DeviceDTO)(RedisOpsUtils.get(key))).getWorkspaceId();
             if (StringUtils.hasText(workspaceId)) {
                 this.subscribeTopicOnline(deviceSn);
                 this.subscribeTopicOnline(deviceGateway.getSn());
@@ -188,8 +184,8 @@
                 DeviceQueryParam.builder()
                         .childSn(deviceSn)
                         .build());
-        gatewaysList.stream().filter(
-                gateway -> !gateway.getDeviceSn().equals(deviceGateway.getSn()))
+        gatewaysList.stream()
+                .filter(gateway -> !gateway.getDeviceSn().equals(deviceGateway.getSn()))
                 .findAny()
                 .ifPresent(gateway -> {
                     gateway.setChildDeviceSn("");
@@ -197,34 +193,33 @@
                 });
 
         DeviceEntity gateway = deviceGatewayConvertToDeviceEntity(deviceGateway);
-        DeviceEntity subDevice = subDeviceConvertToDeviceEntity(deviceGateway.getSubDevices().get(0));
-        boolean isSave = firstSaveDevice(gateway, deviceSn) && firstSaveDevice(subDevice, null);
-        if (!isSave) {
+        Optional<DeviceEntity> gatewayEntityOpt = onlineSaveDevice(gateway, deviceSn);
+        if (gatewayEntityOpt.isEmpty()) {
+            log.error("Failed to go online, please check the status data or code logic.");
             return false;
         }
 
-        // dock go online
-        if (deviceGateway.getDomain() != null && DeviceDomainEnum.DOCK.getVal() == deviceGateway.getDomain()) {
-            Optional<DeviceDTO> deviceOpt = this.getDeviceBySn(deviceGateway.getSn());
-            if (deviceOpt.isEmpty()) {
-                log.info("The dock is not bound and cannot go online. Please refer to the Cloud API document video for binding.");
-                return false;
-            }
-            gateway.setNickname(null);
-            subDevice.setNickname(null);
+        DeviceEntity subDevice = subDeviceConvertToDeviceEntity(deviceGateway.getSubDevices().get(0));
+        Optional<DeviceEntity> subDeviceEntityOpt = onlineSaveDevice(subDevice, null);
+        if (subDeviceEntityOpt.isEmpty()) {
+            log.error("Failed to go online, please check the status data or code logic.");
+            return false;
         }
 
-        String workspaceId = subDevice.getWorkspaceId();
+        subDevice = subDeviceEntityOpt.get();
+        gateway = gatewayEntityOpt.get();
 
-        this.subscribeTopicOnline(deviceGateway.getSn());
-        if (!StringUtils.hasText(workspaceId)) {
-            log.info("The drone is not bound and cannot go online. Please refer to the Cloud API document video for binding.");
-            return true;
+        // dock go online
+        if (DeviceDomainEnum.DOCK.getVal() == deviceGateway.getDomain() && !subDevice.getBoundStatus()) {
+            // Directly bind the drone of the dock to the same workspace as the dock.
+            bindDevice(DeviceDTO.builder().deviceSn(deviceSn).workspaceId(gateway.getWorkspaceId()).build());
+            subDevice.setWorkspaceId(gateway.getWorkspaceId());
         }
 
         // Subscribe to topic related to drone devices.
+        this.subscribeTopicOnline(deviceGateway.getSn());
         this.subscribeTopicOnline(deviceSn);
-        this.pushDeviceOnlineTopo(workspaceId, deviceGateway.getSn(), deviceSn);
+        this.pushDeviceOnlineTopo(subDevice.getWorkspaceId(), deviceGateway.getSn(), deviceSn);
 
         log.debug("{} online.", subDevice.getDeviceSn());
         return true;
@@ -308,34 +303,33 @@
         List<DeviceDTO> devicesList = this.getDevicesByParams(
                 DeviceQueryParam.builder()
                         .workspaceId(workspaceId)
-                        .domains(List.of(DeviceDomainEnum.SUB_DEVICE.getVal()))
+                        .domains(List.of(DeviceDomainEnum.GATEWAY.getVal(), DeviceDomainEnum.DOCK.getVal()))
                         .build());
 
-        devicesList.forEach(device -> {
-            this.spliceDeviceTopo(device);
-            device.setWorkspaceId(workspaceId);
-            device.setStatus(redisOps.checkExist(RedisConst.DEVICE_ONLINE_PREFIX + device.getDeviceSn()));
-        });
+        devicesList.stream()
+                .filter(gateway -> DeviceDomainEnum.DOCK.getVal() == gateway.getDomain() ||
+                        RedisOpsUtils.checkExist(RedisConst.DEVICE_ONLINE_PREFIX + gateway.getDeviceSn()))
+                .forEach(this::spliceDeviceTopo);
+
         return devicesList;
     }
 
     @Override
-    public void spliceDeviceTopo(DeviceDTO device) {
+    public void spliceDeviceTopo(DeviceDTO gateway) {
 
-        // remote controller
-        List<DeviceDTO> gatewaysList = getDevicesByParams(
-                DeviceQueryParam.builder()
-                        .childSn(device.getDeviceSn())
-                        .build());
+        gateway.setStatus(RedisOpsUtils.checkExist(RedisConst.DEVICE_ONLINE_PREFIX + gateway.getDeviceSn()));
+
+        // sub device
+        if (!StringUtils.hasText(gateway.getChildDeviceSn())) {
+            return;
+        }
+
+        DeviceDTO subDevice = getDevicesByParams(DeviceQueryParam.builder().deviceSn(gateway.getChildDeviceSn()).build()).get(0);
+        subDevice.setStatus(RedisOpsUtils.checkExist(RedisConst.DEVICE_ONLINE_PREFIX + subDevice.getDeviceSn()));
+        gateway.setChildren(subDevice);
 
         // payloads
-        List<DevicePayloadDTO> payloadsList = payloadService
-                .getDevicePayloadEntitiesByDeviceSn(device.getDeviceSn());
-
-
-        device.setGatewaysList(gatewaysList);
-        device.setPayloadsList(payloadsList);
-
+        subDevice.setPayloadsList(payloadService.getDevicePayloadEntitiesByDeviceSn(gateway.getChildDeviceSn()));
     }
 
     @Override
@@ -368,7 +362,7 @@
 
         this.getDeviceTopoForPilot(sn)
                 .ifPresent(pilotMessage::setData);
-        boolean exist = redisOps.checkExist(RedisConst.DEVICE_ONLINE_PREFIX + sn);
+        boolean exist = RedisOpsUtils.checkExist(RedisConst.DEVICE_ONLINE_PREFIX + sn);
         pilotMessage.getData().setOnlineStatus(exist);
         pilotMessage.getData().setGatewaySn(gatewaySn.equals(sn) ? "" : gatewaySn);
 
@@ -380,24 +374,20 @@
         TopologyDeviceDTO.TopologyDeviceDTOBuilder builder = TopologyDeviceDTO.builder();
 
         if (device != null) {
-            int domain = DeviceDomainEnum.getVal(device.getDomain());
-            String subType = String.valueOf(device.getSubType());
-            String type = String.valueOf(device.getType());
-
             builder.sn(device.getDeviceSn())
                     .deviceCallsign(device.getNickname())
                     .deviceModel(DeviceModelDTO.builder()
-                            .domain(String.valueOf(domain))
-                            .subType(subType)
-                            .type(type)
-                            .key(domain + "-" + type + "-" + subType)
+                            .domain(String.valueOf(device.getDomain()))
+                            .subType(String.valueOf(device.getSubType()))
+                            .type(String.valueOf(device.getType()))
+                            .key(device.getDomain() + "-" + device.getType() + "-" + device.getSubType())
                             .build())
                     .iconUrls(device.getIconUrl())
-                    .onlineStatus(redisOps.checkExist(RedisConst.DEVICE_ONLINE_PREFIX + device.getDeviceSn()))
+                    .onlineStatus(RedisOpsUtils.checkExist(RedisConst.DEVICE_ONLINE_PREFIX + device.getDeviceSn()))
                     .boundStatus(device.getBoundStatus())
                     .model(device.getDeviceName())
                     .userId(device.getUserId())
-                    .domain(DeviceDomainEnum.getDesc(domain))
+                    .domain(device.getDomain())
                     .build();
         }
         return builder.build();
@@ -438,9 +428,9 @@
                     topic.indexOf(OSD_SUF));
 
             // Real-time update of device status in memory
-            redisOps.expireKey(RedisConst.DEVICE_ONLINE_PREFIX + from, RedisConst.DEVICE_ALIVE_SECOND);
+            RedisOpsUtils.expireKey(RedisConst.DEVICE_ONLINE_PREFIX + from, RedisConst.DEVICE_ALIVE_SECOND);
 
-            DeviceDTO device = (DeviceDTO) redisOps.get(RedisConst.DEVICE_ONLINE_PREFIX + from);
+            DeviceDTO device = (DeviceDTO) RedisOpsUtils.get(RedisConst.DEVICE_ONLINE_PREFIX + from);
 
             if (device == null) {
                 Optional<DeviceDTO> deviceOpt = this.getDeviceBySn(from);
@@ -449,9 +439,10 @@
                 }
                 device = deviceOpt.get();
                 if (!StringUtils.hasText(device.getWorkspaceId())) {
+                    this.unsubscribeTopicOffline(from);
                     return;
                 }
-                redisOps.setWithExpire(RedisConst.DEVICE_ONLINE_PREFIX + from, device,
+                RedisOpsUtils.setWithExpire(RedisConst.DEVICE_ONLINE_PREFIX + from, device,
                         RedisConst.DEVICE_ALIVE_SECOND);
                 this.subscribeTopicOnline(from);
             }
@@ -520,6 +511,9 @@
                         .eq(DeviceEntity::getDeviceSn, entity.getDeviceSn()));
         // Update the information directly if the device already exists.
         if (deviceEntity != null) {
+            if (deviceEntity.getDeviceName().equals(entity.getNickname())) {
+                entity.setNickname(null);
+            }
             entity.setId(deviceEntity.getId());
             mapper.updateById(entity);
             return Optional.of(deviceEntity);
@@ -607,7 +601,7 @@
                 .workspaceId(entity.getWorkspaceId())
                 .type(entity.getDeviceType())
                 .subType(entity.getSubType())
-                .domain(DeviceDomainEnum.getDesc(entity.getDomain()))
+                .domain(entity.getDomain())
                 .iconUrl(IconUrlDTO.builder()
                         .normalUrl(entity.getUrlNormal())
                         .selectUrl(entity.getUrlSelect())
@@ -629,7 +623,7 @@
             return deviceDTOBuilder.firmwareStatus(DeviceFirmwareStatusEnum.NOT_UPGRADE.getVal()).build();
         }
         // Query whether the device is updating firmware.
-        Object progress = redisOps.get(RedisConst.FIRMWARE_UPGRADING_PREFIX + entity.getDeviceSn());
+        Object progress = RedisOpsUtils.get(RedisConst.FIRMWARE_UPGRADING_PREFIX + entity.getDeviceSn());
         if (Objects.nonNull(progress)) {
             return deviceDTOBuilder.firmwareStatus(DeviceFirmwareStatusEnum.UPGRADING.getVal()).firmwareProgress((int)progress).build();
         }
@@ -668,18 +662,19 @@
         }
 
         String key = RedisConst.DEVICE_ONLINE_PREFIX + device.getDeviceSn();
-        DeviceDTO redisDevice = (DeviceDTO)redisOps.get(key);
-        if (Objects.isNull(redisDevice)) {
+        if (!RedisOpsUtils.checkExist(key)) {
             return false;
         }
-        redisDevice.setWorkspaceId(device.getWorkspaceId());
-        redisOps.setWithExpire(key, redisDevice, RedisConst.DEVICE_ALIVE_SECOND);
 
-        if (DeviceDomainEnum.GATEWAY.getDesc().equals(redisDevice.getDomain())) {
+        DeviceDTO redisDevice = (DeviceDTO)RedisOpsUtils.get(key);
+        redisDevice.setWorkspaceId(device.getWorkspaceId());
+        RedisOpsUtils.setWithExpire(key, redisDevice, RedisConst.DEVICE_ALIVE_SECOND);
+
+        if (DeviceDomainEnum.GATEWAY.getVal() == redisDevice.getDomain()) {
             this.pushDeviceOnlineTopo(webSocketManageService.getValueWithWorkspace(device.getWorkspaceId()),
                     device.getDeviceSn(), device.getDeviceSn());
         }
-        if (DeviceDomainEnum.SUB_DEVICE.getDesc().equals(redisDevice.getDomain())) {
+        if (DeviceDomainEnum.SUB_DEVICE.getVal() == redisDevice.getDomain()) {
             DeviceDTO subDevice = this.getDevicesByParams(DeviceQueryParam.builder()
                     .childSn(device.getChildDeviceSn())
                     .build()).get(0);
@@ -776,21 +771,21 @@
 
     @Override
     public PaginationData<DeviceDTO> getBoundDevicesWithDomain(String workspaceId, Long page,
-                                                               Long pageSize, String domain) {
+                                                               Long pageSize, Integer domain) {
 
         Page<DeviceEntity> pagination = mapper.selectPage(new Page<>(page, pageSize),
                 new LambdaQueryWrapper<DeviceEntity>()
-                        .eq(DeviceEntity::getDomain, DeviceDomainEnum.getVal(domain))
+                        .eq(DeviceEntity::getDomain, domain)
                         .eq(DeviceEntity::getWorkspaceId, workspaceId)
                         .eq(DeviceEntity::getBoundStatus, true));
         List<DeviceDTO> devicesList = pagination.getRecords().stream().map(this::deviceEntityConvertToDTO)
                 .peek(device -> {
-                    device.setStatus(redisOps.checkExist(RedisConst.DEVICE_ONLINE_PREFIX + device.getDeviceSn()));
+                    device.setStatus(RedisOpsUtils.checkExist(RedisConst.DEVICE_ONLINE_PREFIX + device.getDeviceSn()));
                     if (StringUtils.hasText(device.getChildDeviceSn())) {
                         Optional<DeviceDTO> childOpt = this.getDeviceBySn(device.getChildDeviceSn());
                         childOpt.ifPresent(child -> {
                             child.setStatus(
-                                    redisOps.checkExist(RedisConst.DEVICE_ONLINE_PREFIX + child.getDeviceSn()));
+                                    RedisOpsUtils.checkExist(RedisConst.DEVICE_ONLINE_PREFIX + child.getDeviceSn()));
                             child.setWorkspaceName(device.getWorkspaceName());
                             device.setChildren(child);
                         });
@@ -803,9 +798,9 @@
     @Override
     public void unbindDevice(String deviceSn) {
         String key = RedisConst.DEVICE_ONLINE_PREFIX + deviceSn;
-        DeviceDTO redisDevice = (DeviceDTO) redisOps.get(key);
+        DeviceDTO redisDevice = (DeviceDTO) RedisOpsUtils.get(key);
         redisDevice.setWorkspaceId("");
-        redisOps.setWithExpire(key, redisDevice, RedisConst.DEVICE_ALIVE_SECOND);
+        RedisOpsUtils.setWithExpire(key, redisDevice, RedisConst.DEVICE_ALIVE_SECOND);
 
         DeviceDTO device = DeviceDTO.builder()
                 .deviceSn(deviceSn)
@@ -823,7 +818,7 @@
             return Optional.empty();
         }
         DeviceDTO device = devicesList.get(0);
-        device.setStatus(redisOps.checkExist(RedisConst.DEVICE_ONLINE_PREFIX + sn));
+        device.setStatus(RedisOpsUtils.checkExist(RedisConst.DEVICE_ONLINE_PREFIX + sn));
         return Optional.of(device);
     }
 
@@ -851,7 +846,7 @@
 
     @Override
     public ResponseResult createDeviceOtaJob(String workspaceId, List<DeviceFirmwareUpgradeDTO> upgradeDTOS) {
-        List<DeviceOtaCreateParam> deviceOtaFirmwares = deviceFirmwareService.getDeviceOtaFirmware(upgradeDTOS);
+        List<DeviceOtaCreateParam> deviceOtaFirmwares = deviceFirmwareService.getDeviceOtaFirmware(workspaceId, upgradeDTOS);
         if (deviceOtaFirmwares.isEmpty()) {
             return ResponseResult.error();
         }
@@ -877,7 +872,7 @@
         }
 
         // Record the device state that needs to be updated.
-        deviceOtaFirmwares.forEach(deviceOta -> redisOps.setWithExpire(
+        deviceOtaFirmwares.forEach(deviceOta -> RedisOpsUtils.setWithExpire(
                 RedisConst.FIRMWARE_UPGRADING_PREFIX + deviceOta.getSn(),
                 bid,
                 RedisConst.DEVICE_ALIVE_SECOND * RedisConst.DEVICE_ALIVE_SECOND));
@@ -890,7 +885,7 @@
         if (!dockOnline) {
             throw new RuntimeException("Dock is offline.");
         }
-        DeviceDTO deviceDTO = (DeviceDTO) redisOps.get(RedisConst.DEVICE_ONLINE_PREFIX + dockSn);
+        DeviceDTO deviceDTO = (DeviceDTO) RedisOpsUtils.get(RedisConst.DEVICE_ONLINE_PREFIX + dockSn);
         boolean deviceOnline = this.checkDeviceOnline(deviceDTO.getChildDeviceSn());
         if (!deviceOnline) {
             throw new RuntimeException("Device is offline.");
@@ -904,7 +899,7 @@
         }
 
         String topic = THING_MODEL_PRE + PRODUCT + dockSn + PROPERTY_SUF + SET_SUF;
-        OsdSubDeviceReceiver osd = (OsdSubDeviceReceiver) redisOps.get(RedisConst.OSD_PREFIX + deviceDTO.getChildDeviceSn());
+        OsdSubDeviceReceiver osd = (OsdSubDeviceReceiver) RedisOpsUtils.get(RedisConst.OSD_PREFIX + deviceDTO.getChildDeviceSn());
         if (!param.isObject()) {
             this.deviceOnePropertySet(topic, propertyEnum, Map.entry(propertyEnum.getProperty(), param));
             return;
@@ -954,7 +949,7 @@
 
     public Boolean checkDeviceOnline(String sn) {
         String key = RedisConst.DEVICE_ONLINE_PREFIX + sn;
-        return redisOps.checkExist(key) && redisOps.getExpire(key) > 0;
+        return RedisOpsUtils.checkExist(key) && RedisOpsUtils.getExpire(key) > 0;
     }
 
     /**
@@ -978,7 +973,7 @@
                 .boundTime(dto.getBoundTime() != null ?
                         dto.getBoundTime().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() : null)
                 .childSn(dto.getChildDeviceSn())
-                .domain(StringUtils.hasText(dto.getDomain()) ? DeviceDomainEnum.getVal(dto.getDomain()) : null)
+                .domain(dto.getDomain())
                 .firmwareVersion(dto.getFirmwareVersion())
                 .compatibleStatus(dto.getFirmwareStatus() == null ? null :
                         DeviceFirmwareStatusEnum.CONSISTENT_UPGRADE != DeviceFirmwareStatusEnum.find(dto.getFirmwareStatus()))
@@ -1043,7 +1038,7 @@
                 .build();
     }
 
-    private Boolean firstSaveDevice(DeviceEntity device, String deviceSn) {
+    private Optional<DeviceEntity> onlineSaveDevice(DeviceEntity device, String childSn) {
 
         Optional<DeviceDTO> deviceOpt = this.getDeviceBySn(device.getDeviceSn());
         if (deviceOpt.isEmpty()) {
@@ -1051,27 +1046,33 @@
             device.setUrlNormal(IconUrlEnum.NORMAL_PERSON.getUrl());
             // Set the icon of the gateway device displayed in the pilot's map when it is selected, required in the TSA module.
             device.setUrlSelect(IconUrlEnum.SELECT_PERSON.getUrl());
+            device.setBoundStatus(false);
+        } else {
+            DeviceDTO oldDevice = deviceOpt.get();
+            device.setNickname(oldDevice.getNickname());
+            device.setBoundStatus(oldDevice.getBoundStatus());
         }
-        device.setChildSn(deviceSn);
+
+        device.setChildSn(childSn);
         device.setLoginTime(System.currentTimeMillis());
 
         Optional<DeviceEntity> saveDeviceOpt = this.saveDevice(device);
         if (saveDeviceOpt.isEmpty()) {
-            return false;
+            return saveDeviceOpt;
         }
         device.setWorkspaceId(saveDeviceOpt.get().getWorkspaceId());
 
-        redisOps.setWithExpire(RedisConst.DEVICE_ONLINE_PREFIX + device.getDeviceSn(),
+        RedisOpsUtils.setWithExpire(RedisConst.DEVICE_ONLINE_PREFIX + device.getDeviceSn(),
                 DeviceDTO.builder()
                         .deviceSn(device.getDeviceSn())
                         .workspaceId(device.getWorkspaceId())
-                        .childDeviceSn(deviceSn)
-                        .domain(DeviceDomainEnum.getDesc(device.getDomain()))
+                        .childDeviceSn(childSn)
+                        .domain(device.getDomain())
                         .type(device.getDeviceType())
                         .subType(device.getSubType())
                         .build(),
                 RedisConst.DEVICE_ALIVE_SECOND);
 
-        return true;
+        return saveDeviceOpt;
     }
 }
\ No newline at end of file

--
Gitblit v1.9.3