From 5d06d78cbf238c383a229f61bf16d3c59051ee9e Mon Sep 17 00:00:00 2001
From: aix <vip_xiaobin810@163.com>
Date: Wed, 14 Aug 2024 20:40:36 +0800
Subject: [PATCH] 拍照录像接口

---
 src/main/java/com/dji/sample/media/dao/IFileMapper.xml                                 |    8 ++++
 src/main/java/com/dji/sample/media/service/IMediaService.java                          |    6 +-
 src/main/java/com/dji/sample/media/service/impl/MediaServiceImpl.java                  |    5 ++
 src/main/java/com/dji/sample/media/model/MediaFileEntity.java                          |    2 +
 src/main/java/com/dji/sample/component/mqtt/service/impl/MessageSenderServiceImpl.java |   34 ++++++++++++++++-
 src/main/java/com/dji/sample/component/mqtt/service/IMessageSenderService.java         |    4 ++
 src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java              |    7 +++
 src/main/java/com/dji/sample/media/dao/IFileMapper.java                                |    7 ++-
 src/main/java/com/dji/sample/component/redis/RedisConst.java                           |    2 +
 src/main/java/com/dji/sample/droneairport/controller/MediaApiController.java           |   37 ++++++++++++++++++
 10 files changed, 104 insertions(+), 8 deletions(-)

diff --git a/src/main/java/com/dji/sample/component/mqtt/service/IMessageSenderService.java b/src/main/java/com/dji/sample/component/mqtt/service/IMessageSenderService.java
index 6611ade..a1aecb8 100644
--- a/src/main/java/com/dji/sample/component/mqtt/service/IMessageSenderService.java
+++ b/src/main/java/com/dji/sample/component/mqtt/service/IMessageSenderService.java
@@ -80,6 +80,10 @@
      */
     <T> ServiceReply<T> publishServicesTopic(TypeReference<T> clazz, String sn, String method, Object data);
 
+    <T> ServiceReply<T> publishServicesTopic(TypeReference<T> clazz, String sn, String method, Object data, String bid,Long timestamp);
+
+    ServiceReply publishServicesTopic(String sn, String method, Object data, String bid,Long timestamp);
+
     /**
      * Used exclusively for sending messages for services, and does not set the received subtype.
      * @param sn
diff --git a/src/main/java/com/dji/sample/component/mqtt/service/impl/MessageSenderServiceImpl.java b/src/main/java/com/dji/sample/component/mqtt/service/impl/MessageSenderServiceImpl.java
index 57718c6..23b265a 100644
--- a/src/main/java/com/dji/sample/component/mqtt/service/impl/MessageSenderServiceImpl.java
+++ b/src/main/java/com/dji/sample/component/mqtt/service/impl/MessageSenderServiceImpl.java
@@ -21,8 +21,8 @@
 
 /**
  * @author sean.zhou
- * @date 2021/11/16
  * @version 0.1
+ * @date 2021/11/16
  */
 @Service
 @Slf4j
@@ -43,6 +43,7 @@
     public void publish(String topic, CommonTopicResponse response) {
         this.publish(topic, 1, response);
     }
+
     public void sendRabbitMQ(String topic, Object data) {
         try {
             if (sendRabbitMQ) {
@@ -139,6 +140,35 @@
     }
 
     @Override
+    public <T> ServiceReply<T> publishServicesTopic(TypeReference<T> clazz, String sn, String method, Object data, String bid, Long timestamp) {
+        String topic = TopicConst.THING_MODEL_PRE + TopicConst.PRODUCT + sn + TopicConst.SERVICES_SUF;
+        ServiceReply reply = this.publishWithReply(ServiceReply.class, topic,
+                CommonTopicResponse.builder()
+                        .tid(UUID.randomUUID().toString())
+                        .bid(StringUtils.hasText(bid) ? bid : UUID.randomUUID().toString())
+                        .timestamp(timestamp)
+                        .method(method)
+                        .data(Objects.requireNonNullElse(data, ""))
+                        .build());
+        if (Objects.isNull(clazz)) {
+            return reply;
+        }
+        // put together in "output"
+        if (Objects.nonNull(reply.getInfo())) {
+            reply.setOutput(mapper.convertValue(reply.getInfo(), clazz));
+        }
+        if (Objects.nonNull(reply.getOutput())) {
+            reply.setOutput(mapper.convertValue(reply.getOutput(), clazz));
+        }
+        return reply;
+    }
+
+    @Override
+    public ServiceReply publishServicesTopic(String sn, String method, Object data, String bid, Long timestamp) {
+        return this.publishServicesTopic(null, sn, method, data, bid, timestamp);
+    }
+
+    @Override
     public ServiceReply publishServicesTopic(String sn, String method, Object data, String bid) {
         return this.publishServicesTopic(null, sn, method, data, bid);
     }
@@ -154,7 +184,7 @@
     }
 
     @Override
-    public  <T> ServiceReply<T> publishRequestsTopic(TypeReference<T> clazz, String sn, String method, Object data, String bid) {
+    public <T> ServiceReply<T> publishRequestsTopic(TypeReference<T> clazz, String sn, String method, Object data, String bid) {
         String topic = TopicConst.THING_MODEL_PRE + TopicConst.PRODUCT + sn + TopicConst.REQUESTS_SUF;
         ServiceReply reply = this.publishWithReply(ServiceReply.class, topic,
                 CommonTopicResponse.builder()
diff --git a/src/main/java/com/dji/sample/component/redis/RedisConst.java b/src/main/java/com/dji/sample/component/redis/RedisConst.java
index cd64f22..6c0aea2 100644
--- a/src/main/java/com/dji/sample/component/redis/RedisConst.java
+++ b/src/main/java/com/dji/sample/component/redis/RedisConst.java
@@ -49,6 +49,8 @@
 
     public static final String OSD_PREFIX = "osd" + DELIMITER;
 
+    public static final String COMMANDS_PREFIX = "commands" + DELIMITER;
+
     public static final String MEDIA_FILE_PREFIX = "media_file" + DELIMITER;
 
     public static final String MEDIA_HIGHEST_PRIORITY_PREFIX = "media_highest_priority" + DELIMITER;
diff --git a/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java b/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java
index 8207d79..d9d039c 100644
--- a/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java
+++ b/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java
@@ -426,7 +426,12 @@
         ResponseResult result = ResponseResult.success();
         result.setTraceid(bid);
 
-        ServiceReply serviceReply = messageSenderService.publishServicesTopic(param.getSn(), param.getCmd().getCmd(), param.getData(),bid);
+        Long timestamp = System.currentTimeMillis();
+
+        //拍照事件存redis
+        RedisOpsUtils.hashSet(RedisConst.COMMANDS_PREFIX + param.getSn() + RedisConst.DELIMITER + bid,bid,timestamp);
+
+        ServiceReply serviceReply = messageSenderService.publishServicesTopic(param.getSn(), param.getCmd().getCmd(), param.getData(),bid,timestamp);
         return ResponseResult.CODE_SUCCESS != serviceReply.getResult() ?
                 ResponseResult.error(serviceReply.getResult(), "错误码:" + serviceReply.getResult())
                 : result;
diff --git a/src/main/java/com/dji/sample/droneairport/controller/MediaApiController.java b/src/main/java/com/dji/sample/droneairport/controller/MediaApiController.java
new file mode 100644
index 0000000..5413184
--- /dev/null
+++ b/src/main/java/com/dji/sample/droneairport/controller/MediaApiController.java
@@ -0,0 +1,37 @@
+package com.dji.sample.droneairport.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.dji.sample.common.model.ResponseResult;
+import com.dji.sample.component.redis.RedisConst;
+import com.dji.sample.component.redis.RedisOpsUtils;
+import com.dji.sample.media.model.MediaFileEntity;
+import com.dji.sample.media.service.IMediaService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@RequestMapping("/droneAirport/mediaApi")
+@RestController
+public class MediaApiController {
+
+    @Autowired
+    private IMediaService mediaService;
+
+    @GetMapping("{sn}/getMedia/{traceid}")
+    public ResponseResult getMedia(@PathVariable String sn, @PathVariable String traceid) {
+
+        String timestamp = (Long)RedisOpsUtils.hashGet(RedisConst.COMMANDS_PREFIX + sn + RedisConst.DELIMITER + traceid,traceid) / 1000 * 1000 + "";
+        MediaFileEntity entity = mediaService.getMediaFieByTid(timestamp);
+        String url = "https://wrj.shuixiongit.com/minio/cloud-bucket" + entity.getObjectKey();
+        Map ret = new HashMap();
+        ret.put("url", url);
+        ret.put("metadata", JSONObject.parseObject(entity.getMetadata().toString()));
+        return ResponseResult.success(ret);
+    }
+
+}
diff --git a/src/main/java/com/dji/sample/media/dao/IFileMapper.java b/src/main/java/com/dji/sample/media/dao/IFileMapper.java
index 5886478..81e4364 100644
--- a/src/main/java/com/dji/sample/media/dao/IFileMapper.java
+++ b/src/main/java/com/dji/sample/media/dao/IFileMapper.java
@@ -18,10 +18,13 @@
  */
 @Mapper
 public interface IFileMapper extends BaseMapper<MediaFileEntity> {
-    Page<MediaFileEntity> getPage(@Param("page") Page<MediaFileEntity> mediaFileEntityPage, @Param("workspaceId") String workspaceId,@Param("query") MediaFileQueryParam mediaFileQueryParam);
+
+    Page<MediaFileEntity> getPage(@Param("page") Page<MediaFileEntity> mediaFileEntityPage, @Param("workspaceId") String workspaceId, @Param("query") MediaFileQueryParam mediaFileQueryParam);
 
     Page<MediaJobDTO> mediaPage(@Param("page") Page<MediaJobDTO> mediaFileEntityPage, @Param("workspaceId") String workspaceId, @Param("param") SearchMediaParam param);
 
-
     Page<MediaJobDTO> mediaDetail(Page<MediaJobDTO> mediaJobDTOPage, @Param("jobId") String jobId, @Param("fileAddress") String fileAddress);
+
+    MediaFileEntity getMediaFieByTid(@Param("timestamp") String timestamp);
+
 }
diff --git a/src/main/java/com/dji/sample/media/dao/IFileMapper.xml b/src/main/java/com/dji/sample/media/dao/IFileMapper.xml
index 3d6ff33..7062db7 100644
--- a/src/main/java/com/dji/sample/media/dao/IFileMapper.xml
+++ b/src/main/java/com/dji/sample/media/dao/IFileMapper.xml
@@ -85,4 +85,12 @@
         </if>
         ORDER BY type = '视频' DESC
     </select>
+
+    <select id="getMediaFieByTid" resultType="com.dji.sample.media.model.MediaFileEntity">
+        SELECT *
+        FROM media_file
+        WHERE CAST(JSON_EXTRACT(metadata, '$.createdTime') AS UNSIGNED) >= #{timestamp}
+        ORDER BY CAST(JSON_EXTRACT(metadata, '$.createdTime') / 1000 AS UNSIGNED) ASC
+            LIMIT 1;
+    </select>
 </mapper>
diff --git a/src/main/java/com/dji/sample/media/model/MediaFileEntity.java b/src/main/java/com/dji/sample/media/model/MediaFileEntity.java
index cf11ab3..133eb12 100644
--- a/src/main/java/com/dji/sample/media/model/MediaFileEntity.java
+++ b/src/main/java/com/dji/sample/media/model/MediaFileEntity.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.annotation.*;
 import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -74,6 +75,7 @@
     private String userId;
 
     @TableField(value = "metadata", typeHandler = FastjsonTypeHandler.class)
+    @JsonFormat
     private Object metadata;
 
     @TableField("examine")
diff --git a/src/main/java/com/dji/sample/media/service/IMediaService.java b/src/main/java/com/dji/sample/media/service/IMediaService.java
index 62214c9..07f2b5b 100644
--- a/src/main/java/com/dji/sample/media/service/IMediaService.java
+++ b/src/main/java/com/dji/sample/media/service/IMediaService.java
@@ -2,13 +2,11 @@
 
 import com.dji.sample.common.model.PaginationData;
 import com.dji.sample.media.model.FileUploadDTO;
+import com.dji.sample.media.model.MediaFileEntity;
 import com.dji.sample.media.model.MediaJobDTO;
 import com.dji.sample.media.model.param.SearchMediaParam;
-import com.dji.sample.wayline.model.dto.WaylineJobDTO;
 import com.drew.imaging.ImageProcessingException;
-import org.springframework.web.bind.annotation.RequestParam;
 
-import java.awt.*;
 import java.io.IOException;
 import java.util.List;
 
@@ -58,4 +56,6 @@
     PaginationData<MediaJobDTO> mediaPage(String workspaceId, SearchMediaParam param);
 
     PaginationData<MediaJobDTO> mediaDetail(String jobId, Long page, Long pageSize);
+
+    MediaFileEntity getMediaFieByTid(String timestamp);
 }
diff --git a/src/main/java/com/dji/sample/media/service/impl/MediaServiceImpl.java b/src/main/java/com/dji/sample/media/service/impl/MediaServiceImpl.java
index 648305a..2ca1a5c 100644
--- a/src/main/java/com/dji/sample/media/service/impl/MediaServiceImpl.java
+++ b/src/main/java/com/dji/sample/media/service/impl/MediaServiceImpl.java
@@ -272,4 +272,9 @@
 
         return receiver;
     }
+
+    @Override
+    public MediaFileEntity getMediaFieByTid(String timestamp) {
+        return mapper.getMediaFieByTid(timestamp);
+    }
 }

--
Gitblit v1.9.3