From 3430a3dd889ba51d06cbdb77014aa63d0a070e48 Mon Sep 17 00:00:00 2001
From: rain <167982779@qq.com>
Date: Fri, 16 Aug 2024 16:38:08 +0800
Subject: [PATCH] 优化国土对接接口

---
 src/main/java/com/dji/sample/droneairport/utils/SM4Util.java                      |   34 --
 src/main/java/com/dji/sample/droneairport/controller/RegistController.java        |   21 +
 src/main/java/com/dji/sample/territory/service/ITbFJService.java                  |    2 
 src/main/java/com/dji/sample/manage/controller/DeviceController.java              |    9 
 src/main/java/com/dji/sample/droneairport/model/Entity/DbUploadEntity.java        |   40 +++
 src/main/java/com/dji/sample/droneairport/service/RegistService.java              |   15 +
 src/main/java/com/dji/sample/patches/service/impl/ShpToDataSourceServiceImpl.java |    2 
 src/main/java/com/dji/sample/territory/service/impl/TbFjServiceImpl.java          |   33 --
 src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java              |   18 +
 src/main/java/com/dji/sample/droneairport/service/impl/RegistServiceImpl.java     |  264 ++++++++++++++-------
 src/main/java/com/dji/sample/droneairport/dao/DbUploadMapper.java                 |    9 
 src/main/java/com/dji/sample/media/service/IFileService.java                      |    2 
 src/main/java/com/dji/sample/common/model/ResponseResult.java                     |    7 
 src/main/java/com/dji/sample/droneairport/model/dto/DbUploadDto.java              |   38 +++
 src/main/java/com/dji/sample/media/util/ImgUtil.java                              |   13 +
 src/main/java/com/dji/sample/patches/utils/TimerUtil.java                         |  136 +++++++---
 src/main/java/com/dji/sample/droneairport/model/dto/AuthorDto.java                |   15 +
 src/main/java/com/dji/sample/territory/utils/WaterMarkUtil.java                   |   12 
 18 files changed, 474 insertions(+), 196 deletions(-)

diff --git a/src/main/java/com/dji/sample/common/model/ResponseResult.java b/src/main/java/com/dji/sample/common/model/ResponseResult.java
index a9b443b..dca4c19 100644
--- a/src/main/java/com/dji/sample/common/model/ResponseResult.java
+++ b/src/main/java/com/dji/sample/common/model/ResponseResult.java
@@ -56,6 +56,13 @@
                 .traceid(traceid)
                 .build();
     }
+    public static<T> ResponseResult success(int code, String message,T data) {
+        return ResponseResult.builder()
+                .code(code)
+                .data(data)
+                .message(message)
+                .build();
+    }
     public static ResponseResult success(int code, String message,String traceid) {
         return ResponseResult.builder()
                 .code(code)
diff --git a/src/main/java/com/dji/sample/droneairport/controller/RegistController.java b/src/main/java/com/dji/sample/droneairport/controller/RegistController.java
index f969124..f4dbad9 100644
--- a/src/main/java/com/dji/sample/droneairport/controller/RegistController.java
+++ b/src/main/java/com/dji/sample/droneairport/controller/RegistController.java
@@ -29,12 +29,12 @@
 //    public ResponseResult resgitePort(@RequestBody RegistDto param) {
 //        return ResponseResult.success(registService.registPort(param));
 //    }
-    @PostMapping("/authorization")
-    public ResponseResult checkDeviceOnline(@RequestBody String body, HttpServletRequest request) throws Exception {
-        String headerValue = request.getHeader("x-lc-secret");
-        return registService.authorization(body, headerValue);
-
-    }
+//    @PostMapping("/authorization")
+//    public ResponseResult checkDeviceOnline(@RequestBody String body, HttpServletRequest request) throws Exception {
+//        String headerValue = request.getHeader("x-lc-secret");
+//        return registService.authorization(body, headerValue);
+//
+//    }
 
     @PostMapping("/addDevice/{workspace_id}")
     public ResponseResult registeDrone(@PathVariable(name = "workspace_id") String workspaceId) {
@@ -70,11 +70,14 @@
     }
     @PostMapping("/queryTaskStatus")
     public ResponseResult queryTaskStatus(HttpServletRequest request, @RequestParam String taskid) throws Exception {
-        return ResponseResult.success(registService.queryTaskStatus(taskid));
+        return registService.queryTaskStatus(taskid);
     }
     @GetMapping("/getResult/{taskId}")
     public ResponseResult getResult(@PathVariable(name = "taskId") String taskId) {
-        return ResponseResult.success(registService.findDbFilesByTaskId(taskId));
+        return ResponseResult.success(200, "无人机成果获取成功!",registService.findDbFilesByTaskId(taskId));
     }
-
+    @PostMapping("/test")
+    public ResponseResult test(@RequestBody String param) {
+        return ResponseResult.success(param);
+    }
 }
diff --git a/src/main/java/com/dji/sample/droneairport/dao/DbUploadMapper.java b/src/main/java/com/dji/sample/droneairport/dao/DbUploadMapper.java
new file mode 100644
index 0000000..964e953
--- /dev/null
+++ b/src/main/java/com/dji/sample/droneairport/dao/DbUploadMapper.java
@@ -0,0 +1,9 @@
+package com.dji.sample.droneairport.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dji.sample.droneairport.model.Entity.DbUploadEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface DbUploadMapper extends BaseMapper<DbUploadEntity> {
+}
diff --git a/src/main/java/com/dji/sample/droneairport/model/Entity/DbUploadEntity.java b/src/main/java/com/dji/sample/droneairport/model/Entity/DbUploadEntity.java
new file mode 100644
index 0000000..580d267
--- /dev/null
+++ b/src/main/java/com/dji/sample/droneairport/model/Entity/DbUploadEntity.java
@@ -0,0 +1,40 @@
+package com.dji.sample.droneairport.model.Entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName(value = "db_info")
+public class DbUploadEntity {
+
+    @TableField("task_id")
+    private String taskId;
+    @TableField("code")
+    private String regioncode;
+    @TableField("size")
+    private long size;
+    @TableField("count")
+    private int count;
+    @TableField("attachment")
+    private int attachmentCount;
+    @TableField("extension")
+    private String extension;
+    @TableField("hash")
+    private String hash;
+    @TableField(value = "timestamp", fill = FieldFill.INSERT)
+    private Long timestamp;
+    @TableField("url")
+    private String url;
+    @TableField("decrypt")
+    private String decrypt;
+    @TableField("data_sign")
+    private String dataSign;
+}
diff --git a/src/main/java/com/dji/sample/droneairport/model/dto/AuthorDto.java b/src/main/java/com/dji/sample/droneairport/model/dto/AuthorDto.java
new file mode 100644
index 0000000..eac365e
--- /dev/null
+++ b/src/main/java/com/dji/sample/droneairport/model/dto/AuthorDto.java
@@ -0,0 +1,15 @@
+package com.dji.sample.droneairport.model.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AuthorDto {
+    private String sn;
+    private int status;
+}
diff --git a/src/main/java/com/dji/sample/droneairport/model/dto/DbUploadDto.java b/src/main/java/com/dji/sample/droneairport/model/dto/DbUploadDto.java
new file mode 100644
index 0000000..88293d3
--- /dev/null
+++ b/src/main/java/com/dji/sample/droneairport/model/dto/DbUploadDto.java
@@ -0,0 +1,38 @@
+package com.dji.sample.droneairport.model.dto;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class DbUploadDto {
+
+    private String taskId;
+
+    private String regioncode;
+
+    private long size;
+
+    private int count;
+
+    private int attachmentCount;
+
+    private String extension;
+
+    private String hash;
+
+    private Long timestamp;
+
+    private String url;
+
+    private String key;
+
+    private String sign;
+}
diff --git a/src/main/java/com/dji/sample/droneairport/service/RegistService.java b/src/main/java/com/dji/sample/droneairport/service/RegistService.java
index bffd8e0..d25e319 100644
--- a/src/main/java/com/dji/sample/droneairport/service/RegistService.java
+++ b/src/main/java/com/dji/sample/droneairport/service/RegistService.java
@@ -39,8 +39,10 @@
      * @return 返回授权结果,包括成功与否、错误信息等
      * @throws Exception 如果授权过程中出现错误,可能会抛出异常
      */
-    ResponseResult authorization(String base64, String Secret) throws Exception;
+//    ResponseResult authorization(String base64, String Secret) throws Exception;
+    void noAuthorization(String sn);
 
+    void Authorization(String sn);
     /**
      * 添加任务接口
      * 该方法将基础64编码的配置信息、密钥和用户名作为参数,实现任务的添加
@@ -76,10 +78,17 @@
      * 查询任务状态
      * 此方法用于根据设备ID查询设备任务的状态
      *
-     * @param deviceId 设备ID,用于标识特定的设备
+     * @param taskid 设备ID,用于标识特定的设备
      * @return 返回一个ResponseResult对象,包含查询到的任务状态信息
      */
     ResponseResult queryTaskStatus(String taskid);
 
-    List<String> findDbFilesByTaskId(String taskId);
+    /**
+     * 获取无人机拍摄的成果DB包下载地址
+     *
+     * @param taskId 无人机的设备ID,用于唯一标识一台无人机
+     * @return 返回一个包含无人机状态信息的ResponseResult对象
+     * @throws Exception 如果在获取无人机状态过程中发生错误,将抛出异常
+     */
+    String findDbFilesByTaskId(String taskId);
 }
diff --git a/src/main/java/com/dji/sample/droneairport/service/impl/RegistServiceImpl.java b/src/main/java/com/dji/sample/droneairport/service/impl/RegistServiceImpl.java
index feb0af2..74d0d85 100644
--- a/src/main/java/com/dji/sample/droneairport/service/impl/RegistServiceImpl.java
+++ b/src/main/java/com/dji/sample/droneairport/service/impl/RegistServiceImpl.java
@@ -10,7 +10,9 @@
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.dji.sample.common.model.ResponseResult;
 import com.dji.sample.component.redis.RedisOpsUtils;
+import com.dji.sample.droneairport.dao.DbUploadMapper;
 import com.dji.sample.droneairport.dao.DeviceExpanSionMapper;
+import com.dji.sample.droneairport.model.Entity.DbUploadEntity;
 import com.dji.sample.droneairport.model.Entity.DeviceExpanSionEntity;
 import com.dji.sample.droneairport.model.dto.*;
 import com.dji.sample.droneairport.model.param.ReturnTaskParam;
@@ -47,11 +49,15 @@
 import java.io.File;
 import java.io.IOException;
 import java.security.NoSuchAlgorithmException;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
 
 import static com.dji.sample.droneairport.utils.TaskAllocator.assignTasks;
 import static com.dji.sample.patches.utils.TimerUtil.getCurrentTimestampPlus8Hours;
+import static com.dji.sample.patches.utils.TimerUtil.getNextDayEightAMTimestamp;
 
 @Service
 public class RegistServiceImpl implements RegistService {
@@ -73,13 +79,13 @@
     private IWaylineJobMapper waylineJobMapper;
     @Autowired
     private IWaylineFileMapper fileMapper;
+    @Autowired
+    private DbUploadMapper dbUploadMapper;
 
     public String registPort(DeviceExpanSionEntity airport) {
         try {
             RegistDto registDto = airportEntityToDto(airport);
-            // 构建请求体
             String jsonBody = buildRequestBody(registDto);
-            // 设置请求头
             String base64 = SM4Util.encrypt("jsimjrby3wqb7dbq", jsonBody);
             // 设置请求头
             HttpHeaders headers = new HttpHeaders();
@@ -87,13 +93,13 @@
             headers.setAccept(List.of(MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN, MediaType.ALL));
             headers.set("Accept-Language", "zh-CN,zh;q=0.9");
             headers.setConnection("keep-alive");
-            headers.set("x-lc-token", AuthUtil.getToken());
-            headers.set("x-lc-secret", Utils.hexToBase64(Utils.encrypt("jsimjrby3wqb7dbq", "044D6061FC08A19D3F32CEAA8CF6679B40500008FD741FC26DE7E50AEBF3A9115D47274437730EADEDAEF0CCC4853C5F0B35B30C6AEA83A5F6FBCA4ABEAC9E3B98")));
+            headers.set("x-auth-token", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ3b3Jrc3BhY2VfaWQiOiJlM2RlYTBmNS0zN2YyLTRkNzktYWU1OC00OTBhZjMyMjgwNjkiLCJzdWIiOiJDbG91ZEFwaVNhbXBsZSIsInVzZXJfdHlwZSI6IjEiLCJuYmYiOjE3MjA2NTg3NDMsImxvZyI6IkxvZ2dlcltjb20uZGppLnNhbXBsZS5jb21tb24ubW9kZWwuQ3VzdG9tQ2xhaW1dIiwiaXNzIjoiREpJIiwiaWQiOiI5Y2MwMGY3Zi0yODMwLTRmM2UtYjdmNC1lN2E1ZjIzYjNjNGYiLCJleHAiOjE4MDcwNTg3NDMsImlhdCI6MTcyMDY1ODc0MywidXNlcm5hbWUiOiJhZG1pbkRQIn0.CrRFYUTK357HleqrrfL7nLdwFJw5Bcv3ms33n_Or8eM");
+            headers.set("x-lc-token", "");
             // 构建请求实体
             HttpEntity<String> requestEntity = new HttpEntity<>(base64, headers);
             // 发送请求
             ResponseEntity<String> response = restTemplate.exchange(
-                    "https://xcx.geoway.com.cn:8033/v1/droneAirport/RegistService",
+                    "http://localhost:6789/droneAirport/test",
                     HttpMethod.POST,
                     requestEntity,
                     String.class);
@@ -105,11 +111,19 @@
         }
     }
 
-    private String buildRequestBody(RegistDto dto) {
+//    private String buildRequestBody(RegistDto dto) {
+//        try {
+//            return objectMapper.writeValueAsString(dto);
+//        } catch (JsonProcessingException e) {
+//            throw new RuntimeException("数据有误", e);
+//        }
+//    }
+
+    public <T> String buildRequestBody(T obj) {
         try {
-            return objectMapper.writeValueAsString(dto);
+            return objectMapper.writeValueAsString(obj);
         } catch (JsonProcessingException e) {
-            throw new RuntimeException("数据有误", e);
+            throw new RuntimeException("对象转换为JSON字符串时发生错误", e);
         }
     }
 
@@ -126,24 +140,25 @@
             // 构建请求体
             String jsonBody = buildRequestBody(dto);
             String base64 = SM4Util.encrypt("jsimjrby3wqb7dbq", jsonBody);
-            String secret = enSM2("jsimjrby3wqb7dbq", "044D6061FC08A19D3F32CEAA8CF6679B40500008FD741FC26DE7E50AEBF3A9115D47274437730EADEDAEF0CCC4853C5F0B35B30C6AEA83A5F6FBCA4ABEAC9E3B98");
             // 设置请求头
+
             HttpHeaders headers = new HttpHeaders();
             headers.setContentType(MediaType.APPLICATION_JSON);
             headers.setAccept(List.of(MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN, MediaType.ALL));
             headers.set("Accept-Language", "zh-CN,zh;q=0.9");
             headers.setConnection("keep-alive");
-            headers.set("x-lc-token", AuthUtil.getToken());
-            headers.set("x-lc-secret", secret);
-
+            headers.set("x-auth-token", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ3b3Jrc3BhY2VfaWQiOiJlM2RlYTBmNS0zN2YyLTRkNzktYWU1OC00OTBhZjMyMjgwNjkiLCJzdWIiOiJDbG91ZEFwaVNhbXBsZSIsInVzZXJfdHlwZSI6IjEiLCJuYmYiOjE3MjA2NTg3NDMsImxvZyI6IkxvZ2dlcltjb20uZGppLnNhbXBsZS5jb21tb24ubW9kZWwuQ3VzdG9tQ2xhaW1dIiwiaXNzIjoiREpJIiwiaWQiOiI5Y2MwMGY3Zi0yODMwLTRmM2UtYjdmNC1lN2E1ZjIzYjNjNGYiLCJleHAiOjE4MDcwNTg3NDMsImlhdCI6MTcyMDY1ODc0MywidXNlcm5hbWUiOiJhZG1pbkRQIn0.CrRFYUTK357HleqrrfL7nLdwFJw5Bcv3ms33n_Or8eM");
+            headers.set("x-lc-token", "");
             // 构建请求实体
             HttpEntity<String> requestEntity = new HttpEntity<>(base64, headers);
-
             // 发送请求
-            RestTemplate restTemplate = new RestTemplate();
-            String response = restTemplate.postForObject("https://xcx.geoway.com.cn:8033/v1/droneAirport/addDevice", requestEntity, String.class);
+            ResponseEntity<String> response = restTemplate.exchange(
+                    "http://localhost:6789/droneAirport/test",
+                    HttpMethod.POST,
+                    requestEntity,
+                    String.class);
             registPort(airport);
-            return response;
+            return response.getBody();
 
         } catch (Exception e) {
             // 异常处理
@@ -159,17 +174,66 @@
         return SM4Screct;
     }
 
+    //    @Override
+//    public ResponseResult authorization(String base64, String Secret) throws Exception {
+//        String sm4Secrect = deSM2(Secret, "23E57DA1E4AB865CCBC325B668762207DEF74345B782237808AE0BABDF26734D");
+//        String decryptedJson = SM4Util.decrypt(sm4Secrect, base64);
+//        JSONObject jsonObject = new JSONObject(decryptedJson);
+//        String deviceId = jsonObject.getStr("deviceid");
+//        boolean online = redisService.checkDeviceOnline(deviceId);
+//        if (online) {
+//            return ResponseResult.success(200, "无人机机场授权成功!", "", "");
+//        }
+//        return ResponseResult.error(500, "无人机机场授权失败!");
+//    }
     @Override
-    public ResponseResult authorization(String base64, String Secret) throws Exception {
-        String sm4Secrect = deSM2(Secret, "23E57DA1E4AB865CCBC325B668762207DEF74345B782237808AE0BABDF26734D");
-        String decryptedJson = SM4Util.decrypt(sm4Secrect, base64);
-        JSONObject jsonObject = new JSONObject(decryptedJson);
-        String deviceId = jsonObject.getStr("deviceid");
-        boolean online = redisService.checkDeviceOnline(deviceId);
-        if (online) {
-            return ResponseResult.success(200, "无人机机场授权成功!", "", "");
-        }
-        return ResponseResult.error(500, "无人机机场授权失败!");
+    public void noAuthorization(String sn) {
+        AuthorDto dto = new AuthorDto();
+        dto.setSn(sn);
+        dto.setStatus(0);
+        String jsonBody = buildRequestBody(dto);
+        String base64 = SM4Util.encrypt("jsimjrby3wqb7dbq", jsonBody);
+        // 设置请求头
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        headers.setAccept(List.of(MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN, MediaType.ALL));
+        headers.set("Accept-Language", "zh-CN,zh;q=0.9");
+        headers.setConnection("keep-alive");
+        headers.set("x-auth-token", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ3b3Jrc3BhY2VfaWQiOiJlM2RlYTBmNS0zN2YyLTRkNzktYWU1OC00OTBhZjMyMjgwNjkiLCJzdWIiOiJDbG91ZEFwaVNhbXBsZSIsInVzZXJfdHlwZSI6IjEiLCJuYmYiOjE3MjA2NTg3NDMsImxvZyI6IkxvZ2dlcltjb20uZGppLnNhbXBsZS5jb21tb24ubW9kZWwuQ3VzdG9tQ2xhaW1dIiwiaXNzIjoiREpJIiwiaWQiOiI5Y2MwMGY3Zi0yODMwLTRmM2UtYjdmNC1lN2E1ZjIzYjNjNGYiLCJleHAiOjE4MDcwNTg3NDMsImlhdCI6MTcyMDY1ODc0MywidXNlcm5hbWUiOiJhZG1pbkRQIn0.CrRFYUTK357HleqrrfL7nLdwFJw5Bcv3ms33n_Or8eM");
+        headers.set("x-lc-token", "");
+        // 构建请求实体
+        HttpEntity<String> requestEntity = new HttpEntity<>(base64, headers);
+        // 发送请求
+        ResponseEntity<String> response = restTemplate.exchange(
+                "http://localhost:6789/droneAirport/test",
+                HttpMethod.POST,
+                requestEntity,
+                String.class);
+    }
+
+    @Override
+    public void Authorization(String sn) {
+        AuthorDto dto = new AuthorDto();
+        dto.setSn(sn);
+        dto.setStatus(1);
+        String jsonBody = buildRequestBody(dto);
+        String base64 = SM4Util.encrypt("jsimjrby3wqb7dbq", jsonBody);
+        // 设置请求头
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        headers.setAccept(List.of(MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN, MediaType.ALL));
+        headers.set("Accept-Language", "zh-CN,zh;q=0.9");
+        headers.setConnection("keep-alive");
+        headers.set("x-auth-token", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ3b3Jrc3BhY2VfaWQiOiJlM2RlYTBmNS0zN2YyLTRkNzktYWU1OC00OTBhZjMyMjgwNjkiLCJzdWIiOiJDbG91ZEFwaVNhbXBsZSIsInVzZXJfdHlwZSI6IjEiLCJuYmYiOjE3MjA2NTg3NDMsImxvZyI6IkxvZ2dlcltjb20uZGppLnNhbXBsZS5jb21tb24ubW9kZWwuQ3VzdG9tQ2xhaW1dIiwiaXNzIjoiREpJIiwiaWQiOiI5Y2MwMGY3Zi0yODMwLTRmM2UtYjdmNC1lN2E1ZjIzYjNjNGYiLCJleHAiOjE4MDcwNTg3NDMsImlhdCI6MTcyMDY1ODc0MywidXNlcm5hbWUiOiJhZG1pbkRQIn0.CrRFYUTK357HleqrrfL7nLdwFJw5Bcv3ms33n_Or8eM");
+        headers.set("x-lc-token", "");
+        // 构建请求实体
+        HttpEntity<String> requestEntity = new HttpEntity<>(base64, headers);
+        // 发送请求
+        ResponseEntity<String> response = restTemplate.exchange(
+                "http://localhost:6789/droneAirport/test",
+                HttpMethod.POST,
+                requestEntity,
+                String.class);
     }
 
     @Override
@@ -197,7 +261,7 @@
         for (TaskListDto taskListDto : tasklist) {
             LotInfo lotInfo = convertToLotInfo(taskListDto);
             lotInfo.setTaskId(taskId);
-            lotInfo.setType(0);
+            lotInfo.setType(1);
             lotInfo.setTaskName(addTaskDto.getBizidname());
             lotInfo.setUserName(username);
             lotInfos.add(lotInfo);
@@ -220,7 +284,7 @@
                 String waylineName = TimerUtil.getTimeName();
                 MultipartFile multipartFile = timerUtil.getFile(waylineName, lotInfosForAirport, airport.getLat(), airport.getLon());
                 WaylineFileEntity waylineFile = timerUtil.backWayline(multipartFile, waylineName, airport.getWorkspaceId(), username);
-                Long time = getCurrentTimestampPlus8Hours(14);
+                Long time = getNextDayEightAMTimestamp(countDistinctTaskIdsForToday(airport.getWorkspaceId()));
                 List<List<Long>> listOfLists = new ArrayList<>();
                 List<Long> sublist = new ArrayList<>();
                 sublist.add(time);
@@ -228,7 +292,7 @@
                 List<Long> lists1 = new ArrayList<>();
                 lists1.add(time);
                 String times = TimerUtil.convertTimestampToFormattedString(time);
-                param.setJobId(taskId);
+                param.setJobId(SM4Util.encrypt("jsimjrby3wqb7dbq", taskId));
                 timerUtil.sendPostWithParameters(waylineName, waylineFile.getWaylineId(), times, lists1, listOfLists, taskId + "~" + airport.getWorkspaceId(), airport.getDockSn());
                 timerUtil.updatePatchesStatu(lotInfosForAirport);
             }
@@ -267,7 +331,7 @@
         for (TaskListDto taskListDto : tasklist) {
             LotInfo lotInfo = convertToLotInfo(taskListDto);
             lotInfo.setTaskId(taskId);
-            lotInfo.setType(0);
+            lotInfo.setType(1);
             lotInfo.setTaskName(Bizidname);
             lotInfo.setUserName(username);
             lotInfos.add(lotInfo);
@@ -292,7 +356,7 @@
                 WaylineFileEntity waylineFile = timerUtil.backWayline(multipartFile, waylineName, airport.getWorkspaceId(), username);
 
                 // 将为规划的图斑状态更新为已规划
-                Long time = getCurrentTimestampPlus8Hours(14);
+                Long time = getNextDayEightAMTimestamp(countDistinctTaskIdsForToday(airport.getWorkspaceId()));
                 List<List<Long>> listOfLists = new ArrayList<>();
                 List<Long> sublist = new ArrayList<>();
                 sublist.add(time);
@@ -333,28 +397,28 @@
 
     @Override
     public ResponseResult queryTaskStatus(String taskid) {
-        WaylineJobEntity jobEntity = waylineJobMapper.selectOne(new LambdaQueryWrapper<WaylineJobEntity>().eq(WaylineJobEntity::getJobId, taskid));
-        if (jobEntity == null) {
+        List<WaylineJobEntity> jobEntity = waylineJobMapper.selectList(new LambdaQueryWrapper<WaylineJobEntity>().like(WaylineJobEntity::getJobId, taskid));
+
+        if (jobEntity == null || jobEntity.isEmpty()) {
             return ResponseResult.error(201, "查询无人机机场任务状态失败!");
         }
-        int code = jobEntity.getStatus();
 
-        //1: 待执行; 2: 执行中; 3: 完成; 4: 取消; 5: 失败
-        if (code == 1) {
-            return ResponseResult.success(200, "查询无人机机场任务状态成功!", "", "");
-        } else if (code == 2) {
-            return ResponseResult.success(202, "查询无人机机场任务状态成功!", "", "");
-        } else if (code == 3) {
-            return ResponseResult.success(203, "查询无人机机场任务状态成功!", "", "");
-        } else if (code == 4) {
-            return ResponseResult.success(204, "查询无人机机场任务状态成功!", "", "");
-        } else if (code == 5) {
-            return ResponseResult.success(205, "查询无人机机场任务状态成功!", "", "");
+        // 检查是否所有 status 都等于 4
+        boolean allStatusAreFour = jobEntity.stream()
+                .allMatch(job -> job.getStatus() == 4);
+
+        // 检查是否所有 status 都等于 3
+        boolean allStatusAreThree = jobEntity.stream()
+                .allMatch(job -> job.getStatus() == 3);
+
+        if (allStatusAreFour) {
+            return ResponseResult.error(204, "查询无人机机场任务状态成功!");
+        } else if (allStatusAreThree) {
+            return ResponseResult.error(200, "查询无人机机场任务状态成功!");
+        } else {
+            return ResponseResult.error(202, "查询无人机机场任务状态成功!");
         }
-        return null;
     }
-
-    private static final String BASE_DIR = "src/main/resources/tmp";
 
     /**
      * 根据任务 ID 查找对应的 DB 文件路径
@@ -362,49 +426,65 @@
      * @param taskId 任务 ID
      * @return 匹配的 DB 文件路径列表
      */
-    public List<String> findDbFilesByTaskId(String taskId) {
-        List<String> dbFilePaths = new ArrayList<>();
-        File baseDir = new File(BASE_DIR);
-
-        // 检查基础目录是否存在
-        if (!baseDir.exists() || !baseDir.isDirectory()) {
-            throw new IllegalStateException("Base directory does not exist or is not a directory.");
+    public String findDbFilesByTaskId(String taskId) {
+        DbUploadEntity entity = dbUploadMapper.selectOne(new LambdaQueryWrapper<DbUploadEntity>()
+                .eq(DbUploadEntity::getTaskId, taskId));
+        if (entity!=null){
+            DbUploadDto dto=DbEntityToDto(entity);
+           return SM4Util.encrypt("jsimjrby3wqb7dbq",buildRequestBody(dto));
         }
+        return null;
 
-        // 遍历基础目录下的所有文件夹
-        File[] subDirs = baseDir.listFiles(File::isDirectory);
-        if (subDirs != null) {
-            for (File subDir : subDirs) {
-                // 如果文件夹名称包含任务 ID,则查找该文件夹中的 DB 文件
-                if (subDir.getName().contains(taskId)) {
-                    File[] files = subDir.listFiles((dir, name) -> name.endsWith(".db"));
-                    if (files != null) {
-                        for (File file : files) {
-                            dbFilePaths.add(file.getAbsolutePath());
-                        }
-                    }
-                }
-            }
-        }
-
-        return dbFilePaths;
+//        File baseDir = new File(BASE_DIR);
+//
+//        // 检查基础目录是否存在并且是目录
+//        if (!baseDir.exists() || !baseDir.isDirectory()) {
+//            throw new IllegalStateException("Base directory does not exist or is not a directory.");
+//        }
+//
+//        // 构建文件路径
+//        File targetDir = new File(baseDir, taskId);
+//        File dbFile = new File(targetDir, ".db");
+//
+//        // 如果文件存在,则返回文件路径
+//        if (dbFile.exists()) {
+//            return dbFile.getAbsolutePath();
+//        }
+//
+//        return null; // 或者抛出异常,视需求而定
     }
+
 
     public void delPatchesByTaskId(String taskId) {
         patchesMapper.delete(new LambdaUpdateWrapper<LotInfo>().eq(LotInfo::getTaskId, taskId));
     }
 
+    public DbUploadDto DbEntityToDto(DbUploadEntity entity) {
+        DbUploadDto dto = new DbUploadDto();
+        dto.setAttachmentCount(entity.getAttachmentCount());
+        dto.setCount(entity.getCount());
+        dto.setSign(entity.getDataSign());
+        dto.setExtension(entity.getExtension());
+        dto.setHash(entity.getHash());
+        dto.setRegioncode(entity.getRegioncode());
+        dto.setTaskId(entity.getTaskId());
+        dto.setKey(entity.getDecrypt());
+        dto.setTimestamp(entity.getTimestamp());
+        dto.setSize(entity.getSize());
+        dto.setUrl(entity.getUrl());
+        return dto;
+    }
     public void delTaskInfo(String taskId) {
         taskInfoMapper.delete(new LambdaUpdateWrapper<TaskInfo>().eq(TaskInfo::getTaskId, taskId));
     }
 
-    private String buildRequestBody(AddDeviceDto dto) {
-        try {
-            return objectMapper.writeValueAsString(dto);
-        } catch (JsonProcessingException e) {
-            throw new RuntimeException("数据有误", e);
-        }
-    }
+//    private String buildRequestBody(AddDeviceDto dto) {
+//        try {
+//            return objectMapper.writeValueAsString(dto);
+//        } catch (JsonProcessingException e) {
+//            throw new RuntimeException("数据有误", e);
+//        }
+//    }
 
     public String getWorkspaceId(String devicesn) {
         DeviceEntity entity = deviceMapper.selectOne(new LambdaQueryWrapper<DeviceEntity>()
@@ -481,7 +561,7 @@
             String sn = deviceMapper.selectOne(new LambdaQueryWrapper<DeviceEntity>().eq(DeviceEntity::getChildSn, deviceId)).getDeviceSn();
             Optional<OsdDockReceiver> dockOsdOpt = redisService.getDeviceOsd(sn, OsdDockReceiver.class);
             boolean results = dockOsdOpt.isPresent();
-            if (!results){
+            if (!results) {
                 DroneStateDto.DroneStateDtoBuilder builder = DroneStateDto.builder();
                 builder.gimbalYaw(0.0)
                         .gimbalPitch(0.0)
@@ -498,11 +578,10 @@
             OsdDockReceiver osdDockReceiver = objectMapper.convertValue(dockOsdOpt.get(), OsdDockReceiver.class);
             int mode;
             int sne = osdDockReceiver.getModeCode().getVal();
-            if (sne==0){
-                mode=1;
-            }
-            else {
-                mode=2;
+            if (sne == 0) {
+                mode = 0;
+            } else {
+                mode = 2;
             }
             DroneStateDto.DroneStateDtoBuilder builder = DroneStateDto.builder();
             builder.gimbalYaw(0.0)
@@ -669,4 +748,19 @@
         // 调用 update 方法进行更新操作
         waylineJobMapper.update(null, updateWrapper);
     }
+    public int countDistinctTaskIdsForToday(String workspaceId) {
+        // 获取当天的开始和结束时间戳
+        long startOfDay = LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli();
+        long startOfNextDay = LocalDate.now().plusDays(1).atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli();
+
+        // 查询数据库,计算不同 taskId 的数量
+        return patchesMapper.selectCount(new LambdaQueryWrapper<LotInfo>()
+                .eq(LotInfo::getWorkspaceId, workspaceId)
+                .ge(LotInfo::getCreateTime, startOfDay)
+                .lt(LotInfo::getCreateTime, startOfNextDay)
+                .select(LotInfo::getTaskId)
+                .groupBy(LotInfo::getTaskId)
+        );
+    }
+
 }
diff --git a/src/main/java/com/dji/sample/droneairport/utils/SM4Util.java b/src/main/java/com/dji/sample/droneairport/utils/SM4Util.java
index 314bd76..394e466 100644
--- a/src/main/java/com/dji/sample/droneairport/utils/SM4Util.java
+++ b/src/main/java/com/dji/sample/droneairport/utils/SM4Util.java
@@ -108,15 +108,16 @@
     }
 
     public static void main(String[] args) {
+//        System.out.println(generateSM4Key());
         byte[] key = "jsimjrby3wqb7dbq".getBytes(StandardCharsets.UTF_8); // 16字节密钥
 
         // 原始明文
         String plaintext = "{\n" +
                 "  \"deviceid\": [\n" +
                 "    \"1581F6QAD241800B6V95\",\n" +
-                "    \"1581F5BMD22CK0014H2U\"\n" +
+                "    \"1581F6QAD241500BDZ3J\"\n" +
                 "  ],\n" +
-                "  \"bizidname\": \"南昌市西湖区图斑下发\",\n" +
+                "  \"bizidname\": \"2023年度全国国土变更调查举证模块\",\n" +
                 "  \"tasklist\": [\n" +
                 "    {\n" +
                 "      \"bsm\": \"2028107171717717107171017\",\n" +
@@ -125,7 +126,7 @@
                 "      \"dklx\": \"ndbg2024\",\n" +
                 "      \"dkmc\": \"小桥头\",\n" +
                 "      \"dkmj\": 20.5,\n" +
-                "      \"dkfw\": \"MULTIPOLYGON(((115.86528871951153 28.625287925196325,115.86561708513025 28.625787612007546,115.86815834948467 28.624602640426623,115.86773004650362 28.62425999804172,115.86528871951153 28.625287925196325)))\",\n" +
+                "      \"dkfw\": \"MULTIPOLYGON(((115.85261028414699 28.628065910491646,115.85234952636368 28.627469892700983,115.85043542990357 28.628240439727712,115.85050295853954 28.62842805760428,115.85071376127738 28.628739229859185,115.85080329411801 28.628869938164858,115.85261028414699 28.628065910491646)))\",\n" +
                 "      \"bz\": null\n" +
                 "    },\n" +
                 "    {\n" +
@@ -135,7 +136,7 @@
                 "      \"dklx\": \"n4\",\n" +
                 "      \"dkmc\": \"小桥\",\n" +
                 "      \"dkmj\": 20.5,\n" +
-                "      \"dkfw\": \"MULTIPOLYGON(((115.86262525992014 28.634623244731678,115.86214341906647 28.63383445340825,115.86164016306374 28.63418423417594,115.86204348170406 28.63485524217979,115.86262525992014 28.634623244731678)))\",\n" +
+                "      \"dkfw\": \"MULTIPOLYGON(((115.86528871951153 28.625287925196325,115.86561708513025 28.625787612007546,115.86815834948467 28.624602640426623,115.86773004650362 28.62425999804172,115.86528871951153 28.625287925196325)))\",\n" +
                 "      \"bz\": null\n" +
                 "    },\n" +
                 "    {\n" +
@@ -145,7 +146,7 @@
                 "      \"dklx\": \"ndbg2774\",\n" +
                 "      \"dkmc\": \"桥头\",\n" +
                 "      \"dkmj\": 20.574,\n" +
-                "      \"dkfw\": \"MULTIPOLYGON(((115.86528871951153 28.625287925196325,115.86561708513025 28.625787612007546,115.86815834948467 28.624602640426623,115.86773004650362 28.62425999804172,115.86528871951153 28.625287925196325)))\",\n" +
+                "      \"dkfw\": \"POLYGON((116.0216 25.8926,116.0217 25.8921,116.0205 25.8919,116.0204 25.8928,116.0214 25.8931,116.0216 25.8926))\",\n" +
                 "      \"bz\": null\n" +
                 "    },\n" +
                 "    {\n" +
@@ -155,28 +156,7 @@
                 "      \"dklx\": \"ndbg2774\",\n" +
                 "      \"dkmc\": \"大桥头\",\n" +
                 "      \"dkmj\": 20.54,\n" +
-                "      \"dkfw\": \"MULTIPOLYGON(((115.84891670917342 28.62884019080562,115.84861068074487 28.628310237250474,115.84801105657137 28.628543424429186,115.84836943314201 28.629060290948733,115.84891670917342 28.62884019080562)))\",\n" +
-                "      \"bz\": null\n" +
-                "    },\n" +
-                "    {\n" +
-                "      \"bsm\": \"177177\",\n" +
-                "      \"xzqdm\": \"3\",\n" +
-                "      \"dkbh\": \"n1\",\n" +
-                "      \"dklx\": \"ndbg2774\",\n" +
-                "      \"dkmc\": \"大桥头\",\n" +
-                "      \"dkmj\": 20.54,\n" +
-                "      \"dkfw\": \"MULTIPOLYGON(((115.85261028414699 28.628065910491646,115.85234952636368 28.627469892700983,115.85043542990357 28.628240439727712,115.85050295853954 28.62842805760428,115.85071376127738 28.628739229859185,115.85080329411801 28.628869938164858,115.85261028414699 28.628065910491646)))\",\n" +
-                "      \"bz\": null\n" +
-                "    }\n" +
-                ",\n" +
-                "    {\n" +
-                "      \"bsm\": \"177177\",\n" +
-                "      \"xzqdm\": \"3\",\n" +
-                "      \"dkbh\": \"n1\",\n" +
-                "      \"dklx\": \"ndbg2774\",\n" +
-                "      \"dkmc\": \"大桥头\",\n" +
-                "      \"dkmj\": 20.54,\n" +
-                "      \"dkfw\": \"MULTIPOLYGON(((115.85063001998248 28.61939504315339,115.85047227189142 28.619025124342414,115.8490255596 28.6190394011085,115.8491588094162 28.61949625762165,115.84966325514971 28.61989600707048,115.84993419451101 28.620007388652688,115.85063001998248 28.61939504315339)))\",\n" +
+                "      \"dkfw\": \"POLYGON((116.0126 25.8866,116.0127 25.8849,116.0125 25.885,116.0125 25.8866,116.0126 25.8866))\",\n" +
                 "      \"bz\": null\n" +
                 "    }\n" +
                 "  ]\n" +
diff --git a/src/main/java/com/dji/sample/manage/controller/DeviceController.java b/src/main/java/com/dji/sample/manage/controller/DeviceController.java
index 3c608b3..2fa7308 100644
--- a/src/main/java/com/dji/sample/manage/controller/DeviceController.java
+++ b/src/main/java/com/dji/sample/manage/controller/DeviceController.java
@@ -6,6 +6,7 @@
 import com.dji.sample.component.mqtt.model.ChannelName;
 import com.dji.sample.component.mqtt.model.CommonTopicReceiver;
 import com.dji.sample.component.mqtt.model.CommonTopicResponse;
+import com.dji.sample.droneairport.service.RegistService;
 import com.dji.sample.manage.model.dto.DeviceDTO;
 import com.dji.sample.manage.model.dto.DeviceFirmwareUpgradeDTO;
 import com.dji.sample.manage.model.enums.DeviceSetPropertyEnum;
@@ -32,6 +33,8 @@
 
     @Autowired
     private IDeviceService deviceService;
+    @Autowired
+    private RegistService registService;
 
     /**
      * Handles the message that the drone goes online.
@@ -49,6 +52,9 @@
                             .timestamp(System.currentTimeMillis())
                             .method(receiver.getMethod())
                             .build());
+        }
+        if (receiver.getData().getSn().length()==14){
+            registService.Authorization(receiver.getData().getSn());
         }
     }
 
@@ -71,6 +77,9 @@
                             .build());
 
         }
+        if (receiver.getData().getSn().length()==14){
+            registService.noAuthorization(receiver.getData().getSn());
+        }
     }
 
     /**
diff --git a/src/main/java/com/dji/sample/media/service/IFileService.java b/src/main/java/com/dji/sample/media/service/IFileService.java
index 6d29baa..94ff38b 100644
--- a/src/main/java/com/dji/sample/media/service/IFileService.java
+++ b/src/main/java/com/dji/sample/media/service/IFileService.java
@@ -9,6 +9,7 @@
 
 import javax.servlet.http.HttpServletResponse;
 import java.awt.*;
+import java.io.File;
 import java.io.IOException;
 import java.net.URL;
 import java.util.List;
@@ -61,6 +62,7 @@
      */
     List<MediaFileDTO> getAllFilesByWorkspaceId(String workspaceId);
 
+    void saveMarkFile(String workspaceId, MediaFileEntity file, File file1);
     PaginationData<MediaFileEntity> mediaQuery(Integer page, Integer pageSize, Long updateStart, Long updateEnd, Long photoStart, Long photoEnd, String jobName,String worksapceId,String isVedio,String jobId);
 
     PaginationData<MediaFileNailEntity> mediaNailQuery(Integer page, Integer pageSize, Long updateStart, Long updateEnd, Long photoStart, Long photoEnd, String jobName, String workspaceId, String type);
diff --git a/src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java b/src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java
index 40ea318..950203a 100644
--- a/src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java
+++ b/src/main/java/com/dji/sample/media/service/impl/FileServiceImpl.java
@@ -110,7 +110,22 @@
                 .eq(MediaFileEntity::getFileId, fileId));
         return Optional.ofNullable(fileEntity);
     }
-
+    public void saveMarkFile(String workspaceId, MediaFileEntity file,File file1) {
+        try {
+            MediaFileMarkEntity mediaFileMarkEntity= new MediaFileMarkEntity();
+            mediaFileMarkEntity.setWorkspaceId(workspaceId);
+            mediaFileMarkEntity.setIsadd(0);
+            mediaFileMarkEntity.setIsOriginal(false);
+            mediaFileMarkEntity.setFileId(UUID.randomUUID().toString());
+            mediaFileMarkEntity.setObjectKey("/mark" + file.getFilePath()+ "/" + file.getFileName());
+            mediaFileMarkEntity.setFileName("mark" + file.getFileName());
+            mediaFileMarkEntity.setFilePath("mark" + file.getFilePath());
+            uploadFile(pojo.getEndpoint(), pojo.getAccessKey(), pojo.getSecretKey(), pojo.getBucket(), mediaFileMarkEntity.getObjectKey(), file1, "image/jpeg");
+            markMapper.insert(mediaFileMarkEntity);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
     @Override
     public Boolean checkExist(String workspaceId, String fingerprint) {
         return this.getMediaByFingerprint(workspaceId, fingerprint).isPresent();
@@ -121,6 +136,7 @@
         MediaFileEntity fileEntity = this.fileUploadConvertToEntity(file);
         fileEntity.setWorkspaceId(workspaceId);
         fileEntity.setFileId(UUID.randomUUID().toString());
+        //避免对视频处理引发报错
         if (file.getObjectKey().endsWith("jpeg")){
             fileEntity.setIsadd(0);
             String url = pojo.getEndpoint() + "/" + pojo.getBucket() + file.getObjectKey();
diff --git a/src/main/java/com/dji/sample/media/util/ImgUtil.java b/src/main/java/com/dji/sample/media/util/ImgUtil.java
index b3d803f..f7b9a6f 100644
--- a/src/main/java/com/dji/sample/media/util/ImgUtil.java
+++ b/src/main/java/com/dji/sample/media/util/ImgUtil.java
@@ -91,7 +91,16 @@
             return null;
         }
     }
+    /**
+     * 获取图片的XMP信息
+     *
+     * @param file 图片文件
+     * @return 包含图片XMP信息的JSONObject对象
+     * @throws ImageProcessingException 图像处理异常
+     * @throws IOException 输入输出异常
+     */
     public static Object getInfo(File file) throws ImageProcessingException, IOException {
+        // 从文件中提取XMP信息
         String str =getXmp(file);
         // 解析 JSON 字符串为 JSON 对象
         JSONObject jsonObject = JSON.parseObject(str);
@@ -101,15 +110,19 @@
         String flightYawDegree = jsonObject.getString("drone-dji:FlightYawDegree");
         String flightPitchDegree = jsonObject.getString("drone-dji:FlightPitchDegree");
         String gimbalPitchDegree = jsonObject.getString("drone-dji:GimbalPitchDegree");
+        // 读取图片的XMP信息中的焦距
         String mm=readPicExifInfo(file).get("Focal Length 35");
         // 构造新的 JSON 对象
         JSONObject newJsonObject = new JSONObject();
+        // 将获取到的信息添加到新的 JSON 对象中
         newJsonObject.put("GimbalYawDegree", gimbalYawDegree);
         newJsonObject.put("FlightYawDegree", flightYawDegree);
         newJsonObject.put("FlightPitchDegree", flightPitchDegree);
         newJsonObject.put("GimbalPitchDegree", gimbalPitchDegree);
         newJsonObject.put("FocalLength", mm);
+        // 返回包含图片XMP信息的JSON对象
         return newJsonObject;
     }
 
+
 }
diff --git a/src/main/java/com/dji/sample/patches/service/impl/ShpToDataSourceServiceImpl.java b/src/main/java/com/dji/sample/patches/service/impl/ShpToDataSourceServiceImpl.java
index ad39577..2c5d384 100644
--- a/src/main/java/com/dji/sample/patches/service/impl/ShpToDataSourceServiceImpl.java
+++ b/src/main/java/com/dji/sample/patches/service/impl/ShpToDataSourceServiceImpl.java
@@ -82,7 +82,7 @@
             LotInfo lotInfo = new LotInfo();
             lotInfo.setWorkspaceId(workspaceId);
             lotInfo.setTaskId(id);
-            lotInfo.setType(1);
+            lotInfo.setType(2);
             lotInfo.setTaskName(name);
             lotInfo = dbConvertToEntity(list.get(i), workspaceId, id, name);
             shpToDataSourceMapper.insert(lotInfo);
diff --git a/src/main/java/com/dji/sample/patches/utils/TimerUtil.java b/src/main/java/com/dji/sample/patches/utils/TimerUtil.java
index 662eac6..b8c1fe2 100644
--- a/src/main/java/com/dji/sample/patches/utils/TimerUtil.java
+++ b/src/main/java/com/dji/sample/patches/utils/TimerUtil.java
@@ -2,6 +2,8 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.dji.sample.common.model.CustomClaim;
+import com.dji.sample.droneairport.dao.DbUploadMapper;
+import com.dji.sample.droneairport.model.Entity.DbUploadEntity;
 import com.dji.sample.manage.dao.IDeviceMapper;
 import com.dji.sample.manage.model.entity.DeviceEntity;
 import com.dji.sample.media.dao.IFileMapper;
@@ -55,6 +57,7 @@
 
 import static com.dji.sample.patches.utils.MultipartFileTOFileUtil.convert;
 import static com.dji.sample.patches.utils.ZipUtil.zipFolder;
+import static com.dji.sample.territory.utils.SM3.sm3;
 import static com.dji.sample.wayline.model.enums.WaylineTaskTypeEnum.TIMED;
 import static com.dji.sample.wayline.model.enums.WaylineTemplateTypeEnum.WAYPOINT;
 
@@ -82,6 +85,8 @@
     private IWaylineJobBreakPointService jobBreakPointService;
     @Autowired
     private IDeviceMapper deviceMapper;
+    @Autowired
+    private DbUploadMapper dbUploadMapper;
     /**
      * 定时器,将没有规划的图斑生成航线,并将航线飞完后的成果数据进行保存推送
      *
@@ -252,6 +257,9 @@
         String taskId = "";
         String dkbh = null;
         List<List<LotInfo>> lists = convertToLists(getNoPush(workspaceId));
+        if (lists.isEmpty()){
+            return;
+        }
         for (List<LotInfo> lotInfo : lists) {
             for (LotInfo lotInfo1 : lotInfo) {
                 List<MediaFileEntity> media = getPatchesService.listPohto(lotInfo1.getDkbh(), workspaceId);
@@ -276,29 +284,55 @@
         }
     }
     @Scheduled(cron = "0 3 17 * * ?")
-    public void GtdbOperation() throws Exception {
-        String taskId = "";
-        String dkbh = null;
-        List<List<LotInfo>> lists = convertToLists(getNoPush());
-        for (List<LotInfo> lotInfo : lists) {
-            for (LotInfo lotInfo1 : lotInfo) {
-                List<MediaFileEntity> media = getPatchesService.listPohto(lotInfo1.getDkbh());
-                //清空FJ表
-                tbFJService.deleteData();
-                for (MediaFileEntity mediaFile : media) {
-                    //获取媒体文件名里的dkbh和taskId
-                    dkbh = getDkbh(mediaFile.getFileName());
-                    //获取该媒体文件的图斑信息
-                    LotInfo lotInfo2 = getPatchesService.getLotinfo(dkbh);
-                    taskId = lotInfo2.getTaskId();
-                    tbFJService.insertOneData(mediaFile, lotInfo2);
-                    getPatchesService.patchesPushed(taskId, dkbh);
-                }
-            }
-            //存储db到服务器
-            dbSaveGt(territoryConfigPojo.getResult(), territoryConfigPojo.getResultGtsave(), taskId);
+   public void GtdbOperation() throws Exception {
+    String taskId = "";
+    String dkbh = null;
+    String code="";
+    int count = 0;
+    Set<String> dkbhSet = new HashSet<>(); // 用于存储不同的dkbh
+    List<List<LotInfo>> lists = convertToLists(getNoPush());
+        if (lists.isEmpty()){
+            return;
         }
+        tbFJService.deleteData();
+    for (List<LotInfo> lotInfo : lists) {
+        for (LotInfo lotInfo1 : lotInfo) {
+            List<MediaFileEntity> media = getPatchesService.listPohto(lotInfo1.getDkbh());
+            // 清空FJ表
+            for (MediaFileEntity mediaFile : media) {
+                // 获取媒体文件名里的dkbh和taskId
+                dkbh = getDkbh(mediaFile.getFileName());
+                dkbhSet.add(dkbh); // 添加dkbh到set中
+                // 获取该媒体文件的图斑信息
+                LotInfo lotInfo2 = getPatchesService.getLotinfo(dkbh);
+                taskId = lotInfo2.getTaskId();
+                code=lotInfo2.getXzqdm();
+                count++;
+                // 插入数据到数据库
+                tbFJService.insertOneData(mediaFile, lotInfo2);
+                getPatchesService.patchesPushed(taskId, dkbh);
+            }
+        }
+
+        // 存储db到服务器
+        String dbName = dbSaveGt(territoryConfigPojo.getResult(), territoryConfigPojo.getResultGtsave(), taskId);
+        DbUploadEntity entity = new DbUploadEntity();
+        File file = new File(territoryConfigPojo.getResult());
+        byte[] bytesArray = Files.readAllBytes(file.toPath());
+        long currentTimeMillis = System.currentTimeMillis();
+        entity.setTimestamp(currentTimeMillis);
+        entity.setSize(getFileSize(file))  ;
+        entity.setHash(sm3(bytesArray));
+        entity.setCount(dkbhSet.size());// 统计dkbh的数量
+        entity.setUrl(territoryConfigPojo.getResultGtsave()+"/"+dbName);
+        entity.setRegioncode(code);
+        entity.setExtension(".db");
+        entity.setAttachmentCount(count);
+        entity.setTaskId(taskId);
+        dbUploadMapper.insert(entity);
     }
+}
+
 
     /**
      * 创建航线
@@ -378,7 +412,7 @@
     public List<List<LotInfo>> getNoPush(String workspaceId) {
         List<LotInfo> list = patchesMapper.selectList(new LambdaQueryWrapper<LotInfo>()
                 .eq(LotInfo::getIsPush, 0)
-                .eq(LotInfo::getType, 1)
+                .eq(LotInfo::getType, 2)
                 .eq(LotInfo::getInvestigate, 1)
                 .eq(LotInfo::getWorkspaceId, workspaceId));
         return groupTasks(list);
@@ -386,7 +420,7 @@
     public List<List<LotInfo>> getNoPush() {
         List<LotInfo> list = patchesMapper.selectList(new LambdaQueryWrapper<LotInfo>()
                 .eq(LotInfo::getIsPush, 0)
-                .eq(LotInfo::getType, 0)
+                .eq(LotInfo::getType, 1)
                 .eq(LotInfo::getInvestigate, 1));
         return groupTasks(list);
     }
@@ -691,30 +725,17 @@
             throw new RuntimeException("Db文件复制失败", e); // 捕获并抛出原始异常
         }
     }
-    public void dbSaveGt(String path, String folder, String taskId) {
-        String sourceFilePath = path; // 源文件路径
-        String targetFolderPath = fileFold(folder,taskId).getPath(); // 目标文件夹路径
-
+    public String dbSaveGt(String path, String folder, String taskId) {
         try {
-            // 创建目标文件夹
-            File targetFolder = new File(targetFolderPath);
-            if (!targetFolder.exists()) {
-                targetFolder.mkdirs();
-            }
-
-            // 获取当前时间
-            LocalDateTime currentTime = LocalDateTime.now();
-
-            // 格式化时间,生成文件名
-            String timeName = currentTime.format(DateTimeFormatter.ofPattern("HHmmss"));
-            String fileName = timeName + "_" + taskId + ".db";
+            String fileName = taskId + ".db";
             // 构建目标文件路径
-            String targetFilePath = targetFolderPath + File.separator + fileName;
+            String targetFilePath = folder + File.separator + fileName;
 
-            // 复制文件到目标文件夹
-            Path sourcePath = Paths.get(sourceFilePath);
+            // 复制文件到目标位置
+            Path sourcePath = Paths.get(path);
             Path targetPath = Paths.get(targetFilePath);
             Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
+            return fileName;
         } catch (IOException e) {
             throw new RuntimeException("Db文件复制失败", e); // 捕获并抛出原始异常
         }
@@ -775,6 +796,21 @@
         // 将毫秒级时间戳转换为秒级时间戳
         return timestamp / 1000;
     }
+    public static long getNextDayEightAMTimestamp(int hour) {
+        // 获取当前时间
+        LocalDateTime now = LocalDateTime.now();
+
+        // 获取第二天的日期并设置时间为08:00
+        LocalDateTime nextDayEightAM = now.plusDays(1).withHour(8).withMinute(0).withSecond(0).withNano(0);
+
+        // 根据传入的hour参数增加小时
+        LocalDateTime adjustedTime = nextDayEightAM.plusHours(hour);
+
+        // 转换为时间戳(秒级)
+        ZonedDateTime zonedDateTime = adjustedTime.atZone(ZoneId.systemDefault());
+        return zonedDateTime.toEpochSecond();
+    }
+
 
     public static Long addOneHourToTimestamp(Long timestampInSeconds, long hours, long min) {
         // 将输入的秒级时间戳转换为Instant对象
@@ -821,4 +857,20 @@
         // 格式化时间,生成当前时间
         return currentTime.format(DateTimeFormatter.ofPattern("MMddHHmmssSSS"));
     }
+    public static long getFileSize(File file) {
+        if (file == null || !file.exists() || !file.isFile()) {
+            return -1L; // 文件不存在或不是普通文件
+        }
+        return file.length();
+    }
+
+    public static void main(String[] args) {
+        File file = new File("DB/result_db.db");
+        long size = getFileSize(file);
+        System.out.println("文件大小: " + size + " 字节");
+    }
+    public static void  getFileInfo(File file){
+        long size=getFileSize(file);
+
+    }
 }
diff --git a/src/main/java/com/dji/sample/territory/service/ITbFJService.java b/src/main/java/com/dji/sample/territory/service/ITbFJService.java
index 41bfa4e..b2696c4 100644
--- a/src/main/java/com/dji/sample/territory/service/ITbFJService.java
+++ b/src/main/java/com/dji/sample/territory/service/ITbFJService.java
@@ -27,5 +27,5 @@
      * @param lotInfo
      * @throws Exception
      */
-    void insertOneData(MediaFileEntity mediaFile, LotInfo lotInfo) throws Exception;
+    int insertOneData(MediaFileEntity mediaFile, LotInfo lotInfo) throws Exception;
 }
diff --git a/src/main/java/com/dji/sample/territory/service/impl/TbFjServiceImpl.java b/src/main/java/com/dji/sample/territory/service/impl/TbFjServiceImpl.java
index 4ccc300..e4c774b 100644
--- a/src/main/java/com/dji/sample/territory/service/impl/TbFjServiceImpl.java
+++ b/src/main/java/com/dji/sample/territory/service/impl/TbFjServiceImpl.java
@@ -5,6 +5,7 @@
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.dji.sample.media.dao.IMarkMapper;
 import com.dji.sample.media.model.*;
+import com.dji.sample.media.service.IFileService;
 import com.dji.sample.media.util.ImgUtil;
 import com.dji.sample.patches.config.pojo.PatchesConfigPojo;
 import com.dji.sample.patches.model.entity.LotInfo;
@@ -48,7 +49,9 @@
     @Autowired
     private MinioPojo pojo;
     @Autowired
-    private IMarkMapper markMapper;
+    private IFileService fileService;
+    @Autowired
+    private WaterMarkUtil waterMarkUtil;
     /**
      * 按照地块编号所对应的信息和音视频文件存入sqlite数据库
      *
@@ -72,11 +75,10 @@
         return count;
     }
 
-    public void insertOneData(MediaFileEntity mediaFile, LotInfo lotInfo) throws Exception {
+    public int insertOneData(MediaFileEntity mediaFile, LotInfo lotInfo) throws Exception {
         TbFjEntity tbFj = dbConvertToEntity(mediaFile, lotInfo);
-        if (tbFj.getFjysgd() == 3000) {
             tbFjMapper.insert(tbFj);
-        }
+        return 0;
     }
 
     @Override
@@ -141,11 +143,11 @@
         //对应图片和视频文件进行不同处理
         boolean endsWith = key.endsWith(".mp4");
         if (!endsWith) {
-            file1 = WaterMarkUtil.addWatermark(file, sj, lat, lng, gimbalYawDegree);
+            file1 = waterMarkUtil.addWatermark(file, sj, lat, lng, gimbalYawDegree,lotInfo.getType());
             byte[] bytesArray = Files.readAllBytes(file1.toPath());
             fjhxz= sm3(bytesArray);
             FJ = fileToByteArray(file1);
-            saveMarkFile(lotInfo.getWorkspaceId(),mediaFile,file1);
+//            fileService.saveMarkFile(lotInfo.getWorkspaceId(),mediaFile,file1);
         } else {
             file1 = VideoZipUtil.compressVideo(file, 800000, 128000, 1280, 720);
             FJ = fileToByteArray(file1);
@@ -188,7 +190,7 @@
     }
 
     /**
-     * 将音视频文件转换成字节流
+     * 文件下载
      *
      * @param fileUrl
      * @return
@@ -235,23 +237,6 @@
         fis.close();
         return data;
     }
-    public void saveMarkFile(String workspaceId, MediaFileEntity file,File file1) {
-        try {
-            MediaFileMarkEntity mediaFileMarkEntity= new MediaFileMarkEntity();
-            mediaFileMarkEntity.setWorkspaceId(workspaceId);
-            mediaFileMarkEntity.setIsadd(0);
-            mediaFileMarkEntity.setIsOriginal(false);
-            mediaFileMarkEntity.setFileId(UUID.randomUUID().toString());
-            mediaFileMarkEntity.setObjectKey("/mark" + file.getFilePath()+ "/" + file.getFileName());
-            mediaFileMarkEntity.setFileName("mark" + file.getFileName());
-            mediaFileMarkEntity.setFilePath("mark" + file.getFilePath());
-            uploadFile(pojo.getEndpoint(), pojo.getAccessKey(), pojo.getSecretKey(), pojo.getBucket(), mediaFileMarkEntity.getObjectKey(), file1, "image/jpeg");
-            markMapper.insert(mediaFileMarkEntity);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
     public static String convertTimestampToDateTime(long timestamp) {
         // 将时间戳转换为 Instant 对象
         Instant instant = Instant.ofEpochMilli(timestamp);
diff --git a/src/main/java/com/dji/sample/territory/utils/WaterMarkUtil.java b/src/main/java/com/dji/sample/territory/utils/WaterMarkUtil.java
index 6a2854d..d658674 100644
--- a/src/main/java/com/dji/sample/territory/utils/WaterMarkUtil.java
+++ b/src/main/java/com/dji/sample/territory/utils/WaterMarkUtil.java
@@ -1,5 +1,7 @@
 package com.dji.sample.territory.utils;
 
+import com.dji.sample.media.service.IFileService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import javax.imageio.ImageIO;
@@ -12,7 +14,8 @@
 import java.util.Date;
 @Component
 public class WaterMarkUtil {
-
+    @Autowired
+    private IFileService fileService;
     /**
      * 将图片加上水印并压缩
      *
@@ -23,7 +26,7 @@
      * @return 添加水印并压缩后的图片文件。
      * @throws IOException 如果读取或保存图片失败。
      */
-    public static File addWatermark(File file, Long pssj, Double lat, Double lng, Double angles) throws IOException, FontFormatException {
+    public  File addWatermark(File file, Long pssj, Double lat, Double lng, Double angles, int type) throws IOException, FontFormatException {
         double anglses = convertAngle(angles);
         String angel = angle(anglses);
         Long timestamp = pssj; // 例如:Unix 时间戳(以秒为单位)
@@ -36,12 +39,15 @@
         } catch (IOException e) {
             throw new IllegalArgumentException("读取图片失败" + e.getMessage());
         }
-
+//        fileService.saveMarkFile(lotInfo.getWorkspaceId(),mediaFile,file1);
         // 创建 Graphics2D 对象以在图像上绘制水印
         Graphics2D g2d = originalImage.createGraphics();
 
         // 设置水印文字 "江西调查云"
         String watermarkText = "江西调查云";
+        if (type == 1){
+            watermarkText = "国土调查云";
+        }
         float alpha = 0.8f; // 设置透明度为 0.7
         AlphaComposite alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
         g2d.setComposite(alphaComposite);

--
Gitblit v1.9.3