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(LocalDateTime.now())
|
.beginTime(LocalDateTime.now())
|
.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;
|
}
|
}
|