From fd16fac820c32c7a244921d0f12076c751855bf4 Mon Sep 17 00:00:00 2001
From: shenyijian <1178253012@qq.com>
Date: Mon, 20 Nov 2023 15:21:15 +0800
Subject: [PATCH] 无人机 -飞行记录新增里程、高度信息

---
 src/main/java/com/dji/sample/log/model/entity/DroneFlightLogEntity.java          |    5 +
 src/main/java/com/dji/sample/log/model/entity/DroneFlightLogInfoEntity.java      |    4 +
 src/main/java/com/dji/sample/manage/service/impl/DeviceOSDServiceImpl.java       |    4 +
 src/main/java/com/dji/sample/wayline/model/dto/WaylineJobCountDTO.java           |    1 
 src/main/java/com/dji/sample/log/dao/IDroneFlightLogMapper.java                  |    7 ++
 src/main/java/com/dji/sample/log/dao/IDroneFlightLogMapper.xml                   |   16 +++++
 src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java     |   25 ++++++--
 src/main/java/com/dji/sample/component/mqtt/handler/InboundMessageRouter.java    |   11 +++
 pom.xml                                                                          |    5 +
 src/main/java/com/dji/sample/manage/model/receiver/OsdSubDeviceReceiver.java     |    2 
 src/main/resources/application.yml                                               |   12 ++++
 src/main/java/com/dji/sample/component/rabbitmq/config/MqttMsgProxyProducer.java |   56 ++++++++++++++++++
 12 files changed, 139 insertions(+), 9 deletions(-)

diff --git a/pom.xml b/pom.xml
index cbfb229..6c48ee4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -197,7 +197,10 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-aop</artifactId>
         </dependency>
-
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/src/main/java/com/dji/sample/component/mqtt/handler/InboundMessageRouter.java b/src/main/java/com/dji/sample/component/mqtt/handler/InboundMessageRouter.java
index 8aa9112..c54759b 100644
--- a/src/main/java/com/dji/sample/component/mqtt/handler/InboundMessageRouter.java
+++ b/src/main/java/com/dji/sample/component/mqtt/handler/InboundMessageRouter.java
@@ -3,7 +3,9 @@
 import com.dji.sample.common.util.SpringBeanUtils;
 import com.dji.sample.component.mqtt.model.ChannelName;
 import com.dji.sample.component.mqtt.model.DeviceTopicEnum;
+import com.dji.sample.component.rabbitmq.config.MqttMsgProxyProducer;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.integration.annotation.Router;
 import org.springframework.integration.mqtt.support.MqttHeaders;
 import org.springframework.integration.router.AbstractMessageRouter;
@@ -24,6 +26,8 @@
 @Component
 @Slf4j
 public class InboundMessageRouter extends AbstractMessageRouter {
+    @Autowired
+    private MqttMsgProxyProducer mqttMsgProxyProducer;
 
     /**
      * All mqtt broker messages will arrive here before distributing them to different channels.
@@ -41,7 +45,12 @@
 
         DeviceTopicEnum topicEnum = DeviceTopicEnum.find(topic);
         MessageChannel bean = (MessageChannel) SpringBeanUtils.getBean(topicEnum.getBeanName());
-
+        String msg = new String(payload);
+        try {
+            mqttMsgProxyProducer.publish(topic.replace("/","."), msg);
+        } catch (Exception e) {
+            log.error("消息发送失败:", e);
+        }
         return Collections.singleton(bean);
     }
 }
diff --git a/src/main/java/com/dji/sample/component/rabbitmq/config/MqttMsgProxyProducer.java b/src/main/java/com/dji/sample/component/rabbitmq/config/MqttMsgProxyProducer.java
new file mode 100644
index 0000000..d73c026
--- /dev/null
+++ b/src/main/java/com/dji/sample/component/rabbitmq/config/MqttMsgProxyProducer.java
@@ -0,0 +1,56 @@
+package com.dji.sample.component.rabbitmq.config;
+
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.core.MessageBuilder;
+import org.springframework.amqp.core.TopicExchange;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
+import org.springframework.amqp.support.converter.MessageConverter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+
+@Component
+public class MqttMsgProxyProducer {
+    @Autowired
+    private RabbitTemplate rabbitTemplate;
+
+    private static final String EXCHANGE_NAME = "mshub.uav";
+
+    @Bean(EXCHANGE_NAME)
+    public TopicExchange createExchange(){
+        return new TopicExchange(EXCHANGE_NAME,true,false);
+    }
+
+    public void publish_test() {
+//        String message = new Date() + "Beijing";
+        Message message = MessageBuilder.withBody("hello javaboy".getBytes())
+                .setExpiration("10000")
+                .build();
+        System.out.println("生产者产生消息=====" + message);
+        rabbitTemplate.convertAndSend(EXCHANGE_NAME,"rabbitmq_queue", message);
+    }
+
+    public void publish(String routingKey, Object content) {
+        rabbitTemplate.convertAndSend(EXCHANGE_NAME,routingKey, content);
+    }
+
+    public void publish(String routingKey, String content) {
+        Message message = MessageBuilder.withBody(content.getBytes())
+                .setExpiration("1000")
+                .build();
+        rabbitTemplate.send(EXCHANGE_NAME,routingKey, message);
+    }
+
+    /**
+     * 使用json序列化机制,进行消息转换
+     * @return -
+     */
+    @Bean
+    public MessageConverter jackson2MessageConverter() {
+        return new Jackson2JsonMessageConverter();
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/dji/sample/log/dao/IDroneFlightLogMapper.java b/src/main/java/com/dji/sample/log/dao/IDroneFlightLogMapper.java
index f523e22..175fab9 100644
--- a/src/main/java/com/dji/sample/log/dao/IDroneFlightLogMapper.java
+++ b/src/main/java/com/dji/sample/log/dao/IDroneFlightLogMapper.java
@@ -2,6 +2,11 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.dji.sample.log.model.entity.DroneFlightLogEntity;
+import com.dji.sample.wayline.model.dto.WaylineJobCountDTO;
+import com.dji.sample.wayline.model.entity.WaylineJobEntity;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * @PROJECT_NAME: iot_drone_api
@@ -10,4 +15,6 @@
  * @DATE: 2023/10/27 17:53
  */
 public interface IDroneFlightLogMapper extends BaseMapper<DroneFlightLogEntity> {
+
+    List<DroneFlightLogEntity>  patrolStatistics(@Param("workspaceId") String workspaceId, @Param("queryTime") String queryTime);
 }
diff --git a/src/main/java/com/dji/sample/log/dao/IDroneFlightLogMapper.xml b/src/main/java/com/dji/sample/log/dao/IDroneFlightLogMapper.xml
new file mode 100644
index 0000000..5017573
--- /dev/null
+++ b/src/main/java/com/dji/sample/log/dao/IDroneFlightLogMapper.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dji.sample.log.dao.IDroneFlightLogMapper">
+
+    <select id="patrolStatistics" resultType="com.dji.sample.log.model.entity.DroneFlightLogEntity">
+        SELECT fl.* FROM drone_flight_log fl
+        WHERE 1=1
+        <if test="queryTime != null and queryTime != ''">
+            and ( FROM_UNIXTIME( fl.end_time / 1000, '%Y' ) = #{queryTime} OR FROM_UNIXTIME( fl.end_time / 1000, '%Y-%m' ) =#{queryTime})
+        </if>
+        <if test="workspaceId != null and workspaceId != ''">
+            and fl.workspace_id = #{workspaceId}
+        </if>
+        ORDER BY fl.end_time DESC
+    </select>
+</mapper>
diff --git a/src/main/java/com/dji/sample/log/model/entity/DroneFlightLogEntity.java b/src/main/java/com/dji/sample/log/model/entity/DroneFlightLogEntity.java
index dad73d2..fe353b3 100644
--- a/src/main/java/com/dji/sample/log/model/entity/DroneFlightLogEntity.java
+++ b/src/main/java/com/dji/sample/log/model/entity/DroneFlightLogEntity.java
@@ -38,5 +38,8 @@
     private Long startTime;
     @TableField(value = "end_time", fill = FieldFill.INSERT_UPDATE)
     private Long endTime;
-
+    @TableField("total_flight_distance")
+    private  Double totalFlightDistance;
+    @TableField("track_id")
+    private String trackId;
 }
diff --git a/src/main/java/com/dji/sample/log/model/entity/DroneFlightLogInfoEntity.java b/src/main/java/com/dji/sample/log/model/entity/DroneFlightLogInfoEntity.java
index 6055d8e..6f4c65f 100644
--- a/src/main/java/com/dji/sample/log/model/entity/DroneFlightLogInfoEntity.java
+++ b/src/main/java/com/dji/sample/log/model/entity/DroneFlightLogInfoEntity.java
@@ -31,5 +31,9 @@
     private Double longitude;
     @TableField(value = "create_time", fill = FieldFill.INSERT)
     private Long createTime;
+    @TableField("height")
+    private Double height;
+    @TableField("elevation")
+    private Double elevation;
 
 }
diff --git a/src/main/java/com/dji/sample/manage/model/receiver/OsdSubDeviceReceiver.java b/src/main/java/com/dji/sample/manage/model/receiver/OsdSubDeviceReceiver.java
index 148ad9a..b8dc76b 100644
--- a/src/main/java/com/dji/sample/manage/model/receiver/OsdSubDeviceReceiver.java
+++ b/src/main/java/com/dji/sample/manage/model/receiver/OsdSubDeviceReceiver.java
@@ -81,4 +81,6 @@
     private Integer totalFlightSorties;
 
     private WaylineRcLostActionEnum exitWaylineWhenRcLost;
+
+    private String trackId;
 }
\ No newline at end of file
diff --git a/src/main/java/com/dji/sample/manage/service/impl/DeviceOSDServiceImpl.java b/src/main/java/com/dji/sample/manage/service/impl/DeviceOSDServiceImpl.java
index 6c19fd9..2f64573 100644
--- a/src/main/java/com/dji/sample/manage/service/impl/DeviceOSDServiceImpl.java
+++ b/src/main/java/com/dji/sample/manage/service/impl/DeviceOSDServiceImpl.java
@@ -88,6 +88,7 @@
                             .workspaceId(device.getWorkspaceId())
                             .title(data.getModeCode().getVal() == 3?"手动飞行":data.getModeCode().getVal() == 4?"自动起飞":data.getModeCode().getVal() == 5?"航线飞行":"未知")
                             .startTime(System.currentTimeMillis())
+                            .trackId(data.getTrackId())
                             .build();
                     droneFlightLogService.save(dflPo);
                     //缓存对象用于关联数据
@@ -102,6 +103,7 @@
 
                     DroneFlightLogEntity dflPo = (DroneFlightLogEntity) RedisOpsUtils.get(RedisConst.FLIGHT_LOG + device.getDeviceSn());
                     dflPo.setEndTime(System.currentTimeMillis());
+                    dflPo.setTotalFlightDistance(data.getTotalFlightDistance());
                     droneFlightLogService.update(dflPo);
 
                     RedisOpsUtils.del(RedisConst.FLIGHT_LOG + device.getDeviceSn());
@@ -116,6 +118,8 @@
                         .latitude(data.getLatitude())
                         .longitude(data.getLongitude())
                         .flightId(dflPo.getId())
+                        .height(data.getHeight())
+                        .elevation(data.getElevation())
                         .build();
                 droneFlightLogInfoService.save(dfliPo);
             }
diff --git a/src/main/java/com/dji/sample/wayline/model/dto/WaylineJobCountDTO.java b/src/main/java/com/dji/sample/wayline/model/dto/WaylineJobCountDTO.java
index 6ab8977..c190b6a 100644
--- a/src/main/java/com/dji/sample/wayline/model/dto/WaylineJobCountDTO.java
+++ b/src/main/java/com/dji/sample/wayline/model/dto/WaylineJobCountDTO.java
@@ -5,6 +5,7 @@
 @Data
 public class WaylineJobCountDTO {
     private Integer totalNumber;
+    private Integer totalTime;
     private String totalDuration;
     private Integer totalDistance;
 }
diff --git a/src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java b/src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java
index b0129cf..ad2b141 100644
--- a/src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java
+++ b/src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java
@@ -5,6 +5,7 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
 import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.dji.sample.common.error.CommonErrorEnum;
@@ -25,6 +26,8 @@
 import com.dji.sample.control.service.IControlService;
 import com.dji.sample.control.service.IDrcService;
 import com.dji.sample.geo.entity.GeoJson;
+import com.dji.sample.log.dao.IDroneFlightLogMapper;
+import com.dji.sample.log.model.entity.DroneFlightLogEntity;
 import com.dji.sample.manage.model.dto.DeviceDTO;
 import com.dji.sample.manage.model.enums.DeviceModeCodeEnum;
 import com.dji.sample.manage.model.enums.DockModeCodeEnum;
@@ -105,6 +108,9 @@
 
     @Autowired
     private IControlService controlService;
+
+    @Autowired
+    private IDroneFlightLogMapper flightLogMapper;
 
     private Optional<WaylineJobDTO> insertWaylineJob(WaylineJobEntity jobEntity) {
         int id = mapper.insert(jobEntity);
@@ -896,16 +902,23 @@
     @Override
     public WaylineJobCountDTO patrolStatistics(String workspaceId, String queryTime) {
         WaylineJobCountDTO waylineJobCountDTO = new WaylineJobCountDTO();
-        List<WaylineJobEntity> list = mapper.patrolStatistics(workspaceId, queryTime);
+      List<DroneFlightLogEntity>  list =  flightLogMapper.patrolStatistics(workspaceId,queryTime);
         if (!CollectionUtils.isEmpty(list)) {
             waylineJobCountDTO.setTotalNumber(list.size());
-            long totalTime = list.stream().filter(task -> task.getCompletedTime()!= null && task.getExecuteTime()!= null).mapToLong(s -> s.getCompletedTime() - s.getExecuteTime()).sum() / 1000;
-            StringBuffer buffer = new StringBuffer();
+            long totalTime = list.stream().filter(task -> task.getEndTime()!= null && task.getStartTime()!= null).mapToLong(s -> s.getEndTime() - s.getStartTime()).sum() / 1000;
             long h = totalTime / 3600;
             long m = (totalTime % 3600) / 60;
-            buffer.append(h).append(" h ");
-            buffer.append(m).append(" min");
-            waylineJobCountDTO.setTotalDuration(buffer.toString());
+            waylineJobCountDTO.setTotalDuration( String.format("%02d h %02d min", h, m));
+            List<String> deviceSn = list.stream().map(DroneFlightLogEntity::getDeviceSn).distinct().collect(Collectors.toList());
+            double sum = 0.0;
+            for (String sn : deviceSn) {
+                Double totalFlightDistance = new LambdaQueryChainWrapper<>(flightLogMapper)
+                        .eq(DroneFlightLogEntity::getDeviceSn, sn).orderByDesc(DroneFlightLogEntity::getEndTime).last("limit 1").one().getTotalFlightDistance();
+               if (totalFlightDistance!= null){
+                   sum+=totalFlightDistance;
+               }
+            }
+            waylineJobCountDTO.setTotalDistance((int) sum);
         }
         return waylineJobCountDTO;
     }
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 24fb258..c3b268d 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -37,6 +37,18 @@
     multipart:
       max-file-size: 2GB
       max-request-size: 2GB
+#  rabbitmq:
+#    host: 182.106.212.58
+#    port: 25672
+#    username: root
+#    password: root
+#    virtualHost: /
+#  rabbitmq:
+#    host: localhost
+#    port: 5672
+#    username: guest
+#    password: guest
+#    virtualHost: /
 
 jwt:
   issuer: DJI

--
Gitblit v1.9.3