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<MqttReply> deviceExitHomingNotify(TopicEventsRequest<DeviceExitHomingNotify> request, MessageHeaders headers) {
|
// return super.deviceExitHomingNotify(request, headers);
|
|
WebSocketServerPlayBack.sendInfo(request.toString());
|
return new TopicEventsResponse<>();
|
}
|
|
@Override
|
public TopicEventsResponse<MqttReply> flighttaskProgress(TopicEventsRequest<EventsDataRequest<FlighttaskProgress>> request, MessageHeaders headers) {
|
|
WebSocketServerPlayBack.sendInfo(request.toString());
|
EventsReceiver<FlighttaskProgress> 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<DeviceDTO> 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<MqttReply<FlighttaskResourceGetResponse>> flighttaskResourceGet(TopicRequestsRequest<FlighttaskResourceGetRequest> request, MessageHeaders headers) {
|
String jobId = request.getData().getFlightId();
|
|
Optional<DeviceDTO> 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<WaylineJobDTO> 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<GetWaylineListResponse> 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<MqttReply<FlighttaskResourceGetResponse>>().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));
|
}
|
}
|
}
|