package com.dji.sample.wayline.service.impl; import com.dji.sample.common.error.CommonErrorEnum; import com.dji.sample.component.mqtt.model.EventsReceiver; import com.dji.sample.component.oss.model.OssConfiguration; import com.dji.sample.component.websocket.model.BizCodeEnum; import com.dji.sample.component.websocket.service.IWebSocketMessageService; import com.dji.sample.component.websocketWmm.WebSocketServerPlayBack; import com.dji.sample.manage.model.dto.DeviceDTO; import com.dji.sample.manage.model.enums.UserTypeEnum; import com.dji.sample.manage.service.IDeviceRedisService; import com.dji.sample.media.model.MediaFileCountDTO; import com.dji.sample.media.service.IMediaRedisService; import com.dji.sample.wayline.model.dto.WaylineJobDTO; import com.dji.sample.wayline.model.enums.WaylineJobStatusEnum; import com.dji.sample.wayline.service.IWaylineFileService; import com.dji.sample.wayline.service.IWaylineJobService; import com.dji.sample.wayline.service.IWaylineRedisService; import com.dji.sdk.cloudapi.wayline.*; import com.dji.sdk.cloudapi.wayline.api.AbstractWaylineService; import com.dji.sdk.mqtt.MqttReply; import com.dji.sdk.mqtt.events.EventsDataRequest; import com.dji.sdk.mqtt.events.TopicEventsRequest; import com.dji.sdk.mqtt.events.TopicEventsResponse; import com.dji.sdk.mqtt.requests.TopicRequestsRequest; import com.dji.sdk.mqtt.requests.TopicRequestsResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.MessageHeaders; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Transactional; import java.net.URL; import java.sql.SQLException; import java.time.LocalDateTime; import java.util.Objects; import java.util.Optional; /** * @author sean * @version 1.7 * @date 2023/7/7 */ @Service @Slf4j public class SDKWaylineService extends AbstractWaylineService { @Autowired private IDeviceRedisService deviceRedisService; @Autowired private IWaylineRedisService waylineRedisService; @Autowired private IMediaRedisService mediaRedisService; @Autowired private IWebSocketMessageService webSocketMessageService; @Autowired private IWaylineJobService waylineJobService; @Autowired private IWaylineFileService waylineFileService; @Override public TopicEventsResponse deviceExitHomingNotify(TopicEventsRequest request, MessageHeaders headers) { // return super.deviceExitHomingNotify(request, headers); WebSocketServerPlayBack.sendInfo(request.toString()); return new TopicEventsResponse<>(); } @Override public TopicEventsResponse flighttaskProgress(TopicEventsRequest> request, MessageHeaders headers) { WebSocketServerPlayBack.sendInfo(request.toString()); EventsReceiver eventsReceiver = new EventsReceiver<>(); eventsReceiver.setResult(request.getData().getResult()); eventsReceiver.setOutput(request.getData().getOutput()); eventsReceiver.setBid(request.getBid()); eventsReceiver.setSn(request.getGateway()); FlighttaskProgress output = eventsReceiver.getOutput(); log.info("Task progress: {}", output.getProgress().toString()); if (!eventsReceiver.getResult().isSuccess()) { log.error("Task progress ===> Error: " + eventsReceiver.getResult()); } Optional deviceOpt = deviceRedisService.getDeviceOnline(request.getGateway()); if (deviceOpt.isEmpty()) { return new TopicEventsResponse<>(); } FlighttaskStatusEnum statusEnum = output.getStatus(); waylineRedisService.setRunningWaylineJob(request.getGateway(), eventsReceiver); if (statusEnum.isEnd()) { WaylineJobDTO job = WaylineJobDTO.builder() .jobId(request.getBid()) .status(WaylineJobStatusEnum.SUCCESS.getVal()) .completedTime(LocalDateTime.now()) .mediaCount(output.getExt().getMediaCount()) .build(); // record the update of the media count. if (Objects.nonNull(job.getMediaCount()) && job.getMediaCount() != 0) { mediaRedisService.setMediaCount(request.getGateway(), job.getJobId(), MediaFileCountDTO.builder().deviceSn(deviceOpt.get().getChildDeviceSn()) .jobId(request.getBid()).mediaCount(job.getMediaCount()).uploadedCount(0).build()); } if (FlighttaskStatusEnum.OK != statusEnum) { job.setCode(eventsReceiver.getResult().getCode()); job.setStatus(WaylineJobStatusEnum.FAILED.getVal()); } waylineJobService.updateJob(job); waylineRedisService.delRunningWaylineJob(request.getGateway()); waylineRedisService.delPausedWaylineJob(request.getBid()); } webSocketMessageService.sendBatch(deviceOpt.get().getWorkspaceId(), UserTypeEnum.WEB.getVal(), BizCodeEnum.FLIGHT_TASK_PROGRESS.getCode(), eventsReceiver); return new TopicEventsResponse<>(); } @Transactional(isolation = Isolation.READ_UNCOMMITTED) @Override public TopicRequestsResponse> flighttaskResourceGet(TopicRequestsRequest request, MessageHeaders headers) { String jobId = request.getData().getFlightId(); Optional deviceOpt = deviceRedisService.getDeviceOnline(request.getGateway()); if (deviceOpt.isEmpty()) { log.error("The device is offline, please try again later."); return new TopicRequestsResponse().setData(MqttReply.error(CommonErrorEnum.DEVICE_OFFLINE)); } Optional waylineJobOpt = waylineJobService.getJobByJobId(deviceOpt.get().getWorkspaceId(), jobId); if (waylineJobOpt.isEmpty()) { log.error("The wayline job does not exist."); return new TopicRequestsResponse().setData(MqttReply.error(CommonErrorEnum.ILLEGAL_ARGUMENT)); } WaylineJobDTO waylineJob = waylineJobOpt.get(); // get wayline file Optional waylineFile = waylineFileService.getWaylineByWaylineId(waylineJob.getWorkspaceId(), waylineJob.getFileId()); if (waylineFile.isEmpty()) { log.error("The wayline file does not exist."); return new TopicRequestsResponse().setData(MqttReply.error(CommonErrorEnum.ILLEGAL_ARGUMENT)); } // get file url try { // URL url = waylineFileService.getObjectUrl(waylineJob.getWorkspaceId(), waylineFile.get().getId()); URL url = waylineFileService.getObjectUrl(waylineFile.get().getObjectKey()); return new TopicRequestsResponse>().setData( MqttReply.success(new FlighttaskResourceGetResponse() .setFile(new FlighttaskFile() .setUrl(url.toString().replace(OssConfiguration.endpoint,OssConfiguration.endpointSpare)) .setFingerprint(waylineFile.get().getSign())))); // } catch (SQLException | NullPointerException e) { } catch (NullPointerException e) { e.printStackTrace(); return new TopicRequestsResponse().setData(MqttReply.error(CommonErrorEnum.SYSTEM_ERROR)); } } }