From 8077e8b67bc017a9e0016180a6eacc114cec28c8 Mon Sep 17 00:00:00 2001
From: DJIsean <102007705+DJIsean@users.noreply.github.com>
Date: Thu, 15 Dec 2022 16:14:24 +0800
Subject: [PATCH] Update DeviceServiceImpl.java

---
 src/main/java/com/dji/sample/manage/service/impl/DevicePayloadServiceImpl.java |   60 ++++++++++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 50 insertions(+), 10 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 7f05b54..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
@@ -9,19 +9,19 @@
 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.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Optional;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -29,6 +29,7 @@
  * @version 0.1
  * @date 2021/11/19
  */
+@Slf4j
 @Service
 @Transactional
 public class DevicePayloadServiceImpl implements IDevicePayloadService {
@@ -41,9 +42,6 @@
 
     @Autowired
     private ICapacityCameraService capacityCameraService;
-
-    @Autowired
-    private RedisOpsUtils redisOps;
 
     @Override
     public Integer checkPayloadExist(String payloadSn) {
@@ -71,7 +69,7 @@
 
         String deviceSn = payloadReceiverList.get(0).getDeviceSn();
         String key = RedisConst.DEVICE_ONLINE_PREFIX + deviceSn;
-        DeviceDTO device = (DeviceDTO) redisOps.get(key);
+        DeviceDTO device = (DeviceDTO) RedisOpsUtils.get(key);
         List<DevicePayloadDTO> payloads = new ArrayList<>();
 
         for (DevicePayloadReceiver payloadReceiver : payloadReceiverList) {
@@ -86,7 +84,7 @@
             payloads = this.getDevicePayloadEntitiesByDeviceSn(deviceSn);
         }
         device.setPayloadsList(payloads);
-        redisOps.setWithExpire(RedisConst.DEVICE_ONLINE_PREFIX + device.getDeviceSn(), device, RedisConst.DEVICE_ALIVE_SECOND);
+        RedisOpsUtils.setWithExpire(RedisConst.DEVICE_ONLINE_PREFIX + device.getDeviceSn(), device, RedisConst.DEVICE_ALIVE_SECOND);
         return true;
     }
 
@@ -122,6 +120,48 @@
                         .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))));
     }
 
     /**
@@ -162,7 +202,7 @@
 
             if (arr.length == 3) {
                 Optional<DeviceDictionaryDTO> dictionaryOpt = dictionaryService
-                        .getOneDictionaryInfoByTypeSubType(arr[0], arr[1]);
+                        .getOneDictionaryInfoByTypeSubType(DeviceDomainEnum.PAYLOAD.getVal(), arr[0], arr[1]);
                 dictionaryOpt.ifPresent(dictionary ->
                         builder.payloadName(dictionary.getDeviceName())
                                 .payloadDesc(dictionary.getDeviceDesc()));

--
Gitblit v1.9.3