shenyijian
2023-12-14 0346ed9f9760bfd136ec01bf14df7fe95f59a603
无人机 -执行飞行任务
3 files modified
3 files added
170 ■■■■■ changed files
src/main/java/com/dji/sample/component/mqtt/handler/InboundMessageRouter.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/wayline/controller/WayLineTaskController.java 27 ●●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/wayline/model/param/CreateJobParam.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/wayline/service/IWayLineTaskService.java 10 ●●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/wayline/service/impl/IWayLineTaskServiceImpl.java 122 ●●●●● patch | view | raw | blame | history
src/main/java/com/dji/sample/wayline/service/impl/WaylineJobServiceImpl.java 4 ●●●● patch | view | raw | blame | history
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());
src/main/java/com/dji/sample/wayline/controller/WayLineTaskController.java
New file
@@ -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);
    }
}
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;
}
src/main/java/com/dji/sample/wayline/service/IWayLineTaskService.java
New file
@@ -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;
}
src/main/java/com/dji/sample/wayline/service/impl/IWayLineTaskServiceImpl.java
New file
@@ -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;
    }
}
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());