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/DevicePayloadServiceImpl.java |   97 ++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 88 insertions(+), 9 deletions(-)

diff --git a/src/main/java/com/dji/sample/manage/service/impl/DevicePayloadServiceImpl.java b/src/main/java/com/dji/sample/manage/service/impl/DevicePayloadServiceImpl.java
index a88504f..89a7308 100644
--- a/src/main/java/com/dji/sample/manage/service/impl/DevicePayloadServiceImpl.java
+++ b/src/main/java/com/dji/sample/manage/service/impl/DevicePayloadServiceImpl.java
@@ -1,22 +1,27 @@
 package com.dji.sample.manage.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.dji.sample.component.redis.RedisConst;
+import com.dji.sample.component.redis.RedisOpsUtils;
 import com.dji.sample.manage.dao.IDevicePayloadMapper;
+import com.dji.sample.manage.model.dto.DeviceDTO;
 import com.dji.sample.manage.model.dto.DeviceDictionaryDTO;
 import com.dji.sample.manage.model.dto.DevicePayloadDTO;
 import com.dji.sample.manage.model.entity.DevicePayloadEntity;
 import com.dji.sample.manage.model.enums.DeviceDomainEnum;
 import com.dji.sample.manage.model.receiver.DevicePayloadReceiver;
+import com.dji.sample.manage.model.receiver.FirmwareVersionReceiver;
 import com.dji.sample.manage.service.ICapacityCameraService;
 import com.dji.sample.manage.service.IDeviceDictionaryService;
 import com.dji.sample.manage.service.IDevicePayloadService;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
-import java.util.Arrays;
-import java.util.List;
-import java.util.Optional;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -24,6 +29,7 @@
  * @version 0.1
  * @date 2021/11/19
  */
+@Slf4j
 @Service
 @Transactional
 public class DevicePayloadServiceImpl implements IDevicePayloadService {
@@ -57,12 +63,28 @@
 
     @Override
     public Boolean savePayloadDTOs(List<DevicePayloadReceiver> payloadReceiverList) {
+        if (payloadReceiverList.isEmpty()) {
+            return true;
+        }
+
+        String deviceSn = payloadReceiverList.get(0).getDeviceSn();
+        String key = RedisConst.DEVICE_ONLINE_PREFIX + deviceSn;
+        DeviceDTO device = (DeviceDTO) RedisOpsUtils.get(key);
+        List<DevicePayloadDTO> payloads = new ArrayList<>();
+
         for (DevicePayloadReceiver payloadReceiver : payloadReceiverList) {
             int payloadId = this.saveOnePayloadDTO(payloadReceiver);
             if (payloadId <= 0) {
                 return false;
             }
+            payloads.add(this.receiver2Dto(payloadReceiver));
         }
+
+        if (payloads.isEmpty()) {
+            payloads = this.getDevicePayloadEntitiesByDeviceSn(deviceSn);
+        }
+        device.setPayloadsList(payloads);
+        RedisOpsUtils.setWithExpire(RedisConst.DEVICE_ONLINE_PREFIX + device.getDeviceSn(), device, RedisConst.DEVICE_ALIVE_SECOND);
         return true;
     }
 
@@ -89,6 +111,57 @@
                             .eq(DevicePayloadEntity::getDeviceSn, deviceSn));
             capacityCameraService.deleteCapacityCameraByDeviceSn(deviceSn);
         });
+    }
+
+    @Override
+    public void updateFirmwareVersion(FirmwareVersionReceiver receiver) {
+        mapper.update(DevicePayloadEntity.builder()
+                        .firmwareVersion(receiver.getFirmwareVersion())
+                        .build()
+                , new LambdaUpdateWrapper<DevicePayloadEntity>()
+                        .eq(DevicePayloadEntity::getDeviceSn, receiver.getSn()));
+    }
+
+    @Override
+    public void saveDeviceBasicPayload(List<DevicePayloadReceiver> payloadReceiverList, Long timestamp) {
+        if (payloadReceiverList.isEmpty()) {
+            return;
+        }
+        String deviceSn = payloadReceiverList.stream().findAny().get().getDeviceSn();
+        String key = RedisConst.STATE_PAYLOAD_PREFIX + deviceSn;
+        // Solve timing problems
+        long last = (long) Objects.requireNonNullElse(RedisOpsUtils.get(key), 0L);
+        if (last > timestamp) {
+            return;
+        }
+
+
+        // Filter unsaved payload information.
+        Set<String> payloadSns = this.getDevicePayloadEntitiesByDeviceSn(payloadReceiverList.get(0).getDeviceSn())
+                .stream().map(DevicePayloadDTO::getPayloadSn).collect(Collectors.toSet());
+
+        Set<String> newPayloadSns = payloadReceiverList.stream().map(DevicePayloadReceiver::getSn).collect(Collectors.toSet());
+        Set<String> needToDel = payloadSns.stream().filter(sn -> !newPayloadSns.contains(sn)).collect(Collectors.toSet());
+        this.deletePayloadsByPayloadsSn(needToDel);
+
+        List<DevicePayloadReceiver> needToSave = payloadReceiverList.stream()
+                .filter(payload -> !payloadSns.contains(payload.getSn())).collect(Collectors.toList());
+
+        // Save the new payload information.
+        boolean isSave = this.savePayloadDTOs(needToSave);
+        if (isSave) {
+            RedisOpsUtils.setWithExpire(key, timestamp, RedisConst.DEVICE_ALIVE_SECOND);
+        }
+        log.debug("The result of saving the payloads is {}.", isSave);
+    }
+
+    @Override
+    public void deletePayloadsByPayloadsSn(Collection<String> payloadSns) {
+        if (CollectionUtils.isEmpty(payloadSns)) {
+            return;
+        }
+        mapper.delete(new LambdaUpdateWrapper<DevicePayloadEntity>()
+                .or(wrapper -> payloadSns.forEach(sn -> wrapper.eq(DevicePayloadEntity::getPayloadSn, sn))));
     }
 
     /**
@@ -129,8 +202,7 @@
 
             if (arr.length == 3) {
                 Optional<DeviceDictionaryDTO> dictionaryOpt = dictionaryService
-                        .getOneDictionaryInfoByDomainTypeSubType(DeviceDomainEnum.PAYLOAD.getVal(),
-                                arr[0], arr[1]);
+                        .getOneDictionaryInfoByTypeSubType(DeviceDomainEnum.PAYLOAD.getVal(), arr[0], arr[1]);
                 dictionaryOpt.ifPresent(dictionary ->
                         builder.payloadName(dictionary.getDeviceName())
                                 .payloadDesc(dictionary.getDeviceDesc()));
@@ -147,10 +219,17 @@
 
         return builder
                 .payloadSn(dto.getSn())
-                .version(dto.getVersion())
-                .deviceSn(dto.getSn()
-                        .substring(0,
-                                dto.getSn().indexOf("-")))
+                .deviceSn(dto.getDeviceSn())
+                .build();
+    }
+
+    private DevicePayloadDTO receiver2Dto(DevicePayloadReceiver receiver) {
+        DevicePayloadDTO.DevicePayloadDTOBuilder builder = DevicePayloadDTO.builder();
+        if (receiver == null) {
+            return builder.build();
+        }
+        return builder.payloadSn(receiver.getSn())
+                .payloadName(receiver.getPayloadIndex())
                 .build();
     }
 

--
Gitblit v1.9.3