| New file |
| | |
| | | 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; |
| | | } |
| | | } |