From 0346ed9f9760bfd136ec01bf14df7fe95f59a603 Mon Sep 17 00:00:00 2001
From: shenyijian <1178253012@qq.com>
Date: Thu, 14 Dec 2023 16:26:22 +0800
Subject: [PATCH] 无人机 -执行飞行任务

---
 src/main/java/com/dji/sample/wayline/model/param/CreateJobParam.java           |    5 +
 src/main/java/com/dji/sample/wayline/controller/WayLineTaskController.java     |   27 +++++++++
 src/main/java/com/dji/sample/wayline/service/impl/IWayLineTaskServiceImpl.java |  122 ++++++++++++++++++++++++++++++++++++++++
 src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java   |    4 
 src/main/java/com/dji/sample/component/mqtt/handler/InboundMessageRouter.java  |    2 
 src/main/java/com/dji/sample/wayline/service/IWayLineTaskService.java          |   10 +++
 6 files changed, 167 insertions(+), 3 deletions(-)

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 570e446..5d30c75 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
@@ -45,7 +45,7 @@
         String topic = headers.get(MqttHeaders.RECEIVED_TOPIC).toString();
         byte[] payload = (byte[])message.getPayload();
 
-        log.debug("received topic :{} \t payload :{}", topic, new String(payload));
+//        log.debug("received topic :{} \t payload :{}", topic, new String(payload));
 
         DeviceTopicEnum topicEnum = DeviceTopicEnum.find(topic);
         MessageChannel bean = (MessageChannel) SpringBeanUtils.getBean(topicEnum.getBeanName());
diff --git a/src/main/java/com/dji/sample/wayline/controller/WayLineTaskController.java b/src/main/java/com/dji/sample/wayline/controller/WayLineTaskController.java
new file mode 100644
index 0000000..a7d67fc
--- /dev/null
+++ b/src/main/java/com/dji/sample/wayline/controller/WayLineTaskController.java
@@ -0,0 +1,27 @@
+package com.dji.sample.wayline.controller;
+
+import com.dji.sample.common.model.CustomClaim;
+import com.dji.sample.common.model.ResponseResult;
+import com.dji.sample.log.aspect.SysLogAnnotation;
+import com.dji.sample.wayline.model.param.CreateJobParam;
+import com.dji.sample.wayline.service.IWayLineTaskService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.sql.SQLException;
+
+
+@RequestMapping("${url.wayline.prefix}${url.wayline.version}/workspaces")
+@RestController
+public class WayLineTaskController {
+    @Autowired
+    private IWayLineTaskService iWayLineTaskService;
+
+    @PostMapping("/{workspace_id}/execute_task")
+    @SysLogAnnotation(operModul = "计划库", operType = "新增", operDesc = "执行计划")
+    public ResponseResult executeTask( @Valid @RequestBody CreateJobParam param,
+                                    @PathVariable(name = "workspace_id") String workspaceId) throws SQLException {
+        return iWayLineTaskService.executeTask(param,workspaceId);
+    }
+}
diff --git a/src/main/java/com/dji/sample/wayline/model/param/CreateJobParam.java b/src/main/java/com/dji/sample/wayline/model/param/CreateJobParam.java
index 9b723b7..b59ead0 100644
--- a/src/main/java/com/dji/sample/wayline/model/param/CreateJobParam.java
+++ b/src/main/java/com/dji/sample/wayline/model/param/CreateJobParam.java
@@ -7,6 +7,7 @@
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -58,4 +59,8 @@
     private List<Integer> repRuleVal;
 
     private List<List<Long>> executeStartTimeArr;
+
+    private String jobId;
+
+    private LocalDateTime beginTime;
 }
diff --git a/src/main/java/com/dji/sample/wayline/service/IWayLineTaskService.java b/src/main/java/com/dji/sample/wayline/service/IWayLineTaskService.java
new file mode 100644
index 0000000..d604bb8
--- /dev/null
+++ b/src/main/java/com/dji/sample/wayline/service/IWayLineTaskService.java
@@ -0,0 +1,10 @@
+package com.dji.sample.wayline.service;
+
+import com.dji.sample.common.model.ResponseResult;
+import com.dji.sample.wayline.model.param.CreateJobParam;
+
+import java.sql.SQLException;
+
+public interface IWayLineTaskService {
+    ResponseResult executeTask(CreateJobParam param,String workspaceId)throws SQLException;
+}
diff --git a/src/main/java/com/dji/sample/wayline/service/impl/IWayLineTaskServiceImpl.java b/src/main/java/com/dji/sample/wayline/service/impl/IWayLineTaskServiceImpl.java
new file mode 100644
index 0000000..2370496
--- /dev/null
+++ b/src/main/java/com/dji/sample/wayline/service/impl/IWayLineTaskServiceImpl.java
@@ -0,0 +1,122 @@
+package com.dji.sample.wayline.service.impl;
+
+import com.dji.sample.common.model.ResponseResult;
+import com.dji.sample.common.util.MinioUrlUtils;
+import com.dji.sample.component.mqtt.model.EventsReceiver;
+import com.dji.sample.component.mqtt.model.ServiceReply;
+import com.dji.sample.component.mqtt.service.IMessageSenderService;
+import com.dji.sample.manage.service.IDeviceRedisService;
+import com.dji.sample.wayline.model.dto.*;
+import com.dji.sample.wayline.model.enums.WaylineErrorCodeEnum;
+import com.dji.sample.wayline.model.enums.WaylineJobStatusEnum;
+import com.dji.sample.wayline.model.enums.WaylineMethodEnum;
+import com.dji.sample.wayline.model.enums.WaylineTaskTypeEnum;
+import com.dji.sample.wayline.model.param.CreateJobParam;
+import com.dji.sample.wayline.service.IWayLineTaskService;
+import com.dji.sample.wayline.service.IWaylineFileService;
+import lombok.extern.slf4j.Slf4j;
+import org.checkerframework.checker.units.qual.A;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.net.URL;
+import java.sql.SQLException;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.Objects;
+import java.util.Optional;
+
+@Service
+@Slf4j
+public class IWayLineTaskServiceImpl implements IWayLineTaskService {
+    @Autowired
+    private IDeviceRedisService deviceRedisService;
+
+    @Autowired
+    private IWaylineFileService waylineFileService;
+
+    @Autowired
+    private IMessageSenderService messageSender;
+
+    @Override
+    public ResponseResult executeTask(CreateJobParam param,String workspaceId) throws SQLException {
+        WaylineJobDTO waylineJob = param2DTO(param,workspaceId);
+        Integer result = this.prepareFlightTask(waylineJob);
+        boolean isSuccess = result.equals(0);
+        if (!isSuccess) {
+            return ResponseResult.error("任务准备失败,错误码:"+result);
+        }
+        //发出立即任务执行命令
+        Integer executeFlightTask = executeFlightTask(waylineJob);
+        boolean isExecuted = executeFlightTask.equals(0);
+        if (!isExecuted) {
+            return ResponseResult.error("执行任务失败,错误码:"+executeFlightTask);
+        }
+        return ResponseResult.success();
+    }
+
+    private WaylineJobDTO param2DTO(CreateJobParam param,String workspaceId) {
+        return  WaylineJobDTO.builder()
+                .jobId(param.getJobId())
+                .fileId(param.getFileId())
+                .dockSn(param.getDockSn())
+                .workspaceId(workspaceId)
+                .executeTime(param.getBeginTime())
+                .beginTime(param.getBeginTime())
+                .taskType(param.getTaskType())
+                .waylineType(param.getWaylineType())
+                .rthAltitude(param.getRthAltitude())
+                .outOfControlAction(param.getOutOfControlAction()).build();
+    }
+
+    private Integer executeFlightTask(WaylineJobDTO waylineJob) {
+        boolean isOnline = deviceRedisService.checkDeviceOnline(waylineJob.getDockSn());
+        if (!isOnline) {
+            throw new RuntimeException("设备离线");
+        }
+        String jobId = waylineJob.getJobId();
+        WaylineTaskCreateDTO flightTask = WaylineTaskCreateDTO.builder().flightId(waylineJob.getJobId()).build();
+
+        ServiceReply serviceReply = messageSender.publishServicesTopic(
+                waylineJob.getDockSn(), WaylineMethodEnum.FLIGHT_TASK_EXECUTE.getMethod(), flightTask, jobId);
+        if (ResponseResult.CODE_SUCCESS != serviceReply.getResult()) {
+            log.info("Execute job ====> Error code: {}", serviceReply.getResult());
+            return serviceReply.getResult();
+        }
+        return ResponseResult.CODE_SUCCESS ;
+    }
+
+    public Integer prepareFlightTask(WaylineJobDTO waylineJob) throws SQLException{
+        boolean isOnline = deviceRedisService.checkDeviceOnline(waylineJob.getDockSn());
+        if (!isOnline) {
+            throw new RuntimeException("设备离线。");
+        }
+
+        Optional<WaylineFileDTO> waylineFile = waylineFileService.getWaylineByWaylineId(waylineJob.getWorkspaceId(), waylineJob.getFileId());
+        if (waylineFile.isEmpty()) {
+            throw new SQLException("航线文件不存在。");
+        }
+
+        URL url = waylineFileService.getObjectUrl(waylineJob.getWorkspaceId(), waylineFile.get().getWaylineId());
+        WaylineTaskCreateDTO flightTask = WaylineTaskCreateDTO.builder()
+                .flightId(waylineJob.getJobId())
+                .executeTime(waylineJob.getBeginTime().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli())
+                .taskType(waylineJob.getTaskType())
+                .waylineType(waylineJob.getWaylineType())
+                .rthAltitude(waylineJob.getRthAltitude())
+                .outOfControlAction(waylineJob.getOutOfControlAction())
+                .file(WaylineTaskFileDTO.builder()
+                        .url(MinioUrlUtils.getUrl(url))
+                        .fingerprint(waylineFile.get().getSign())
+                        .build())
+                .build();
+
+        ServiceReply serviceReply = messageSender.publishServicesTopic(
+                waylineJob.getDockSn(), WaylineMethodEnum.FLIGHT_TASK_PREPARE.getMethod(), flightTask, waylineJob.getJobId());
+        if (ResponseResult.CODE_SUCCESS != serviceReply.getResult()) {
+            log.info("Prepare task ====> Error code: {}", serviceReply.getResult());
+            return serviceReply.getResult();
+        }
+        return ResponseResult.CODE_SUCCESS;
+    }
+}
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 9ae0776..c5c97ed 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
@@ -339,10 +339,10 @@
 
     private Boolean prepareFlightTask(WaylineJobDTO waylineJob) throws SQLException {
 
-        boolean isOnline = deviceRedisService.checkDeviceOnline(waylineJob.getDockSn());
+        /*boolean isOnline = deviceRedisService.checkDeviceOnline(waylineJob.getDockSn());
         if (!isOnline) {
             throw new RuntimeException("设备离线。");
-        }
+        }*/
 
         // get wayline file
         Optional<WaylineFileDTO> waylineFile = waylineFileService.getWaylineByWaylineId(waylineJob.getWorkspaceId(), waylineJob.getFileId());

--
Gitblit v1.9.3