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