shenyijian
2023-12-14 0346ed9f9760bfd136ec01bf14df7fe95f59a603
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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;
    }
}