zhaowenyu
2026-01-16 aafd104dd7de1db565cd2081e8eb445d7a1bd481
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
package com.ard.sample.wayline.service.impl;
 
import com.ard.route.service.IArdRouteInfoService;
import com.ard.sample.common.model.Pagination;
import com.ard.sample.common.model.PaginationData;
import com.ard.sample.manage.model.dto.DeviceDTO;
import com.ard.sample.manage.service.IDeviceService;
import com.ard.sample.media.service.IFileService;
import com.ard.sample.wayline.mapper.IWaylineJobHistoryMapper;
import com.ard.sample.wayline.model.dto.WaylineJobDTO;
import com.ard.sample.wayline.model.entity.WaylineJobEntity;
import com.ard.sample.wayline.model.entity.WaylineJobHistoryEntity;
import com.ard.sample.wayline.model.enums.WaylineJobStatusEnum;
import com.ard.sample.wayline.service.IWaylineJobHistoryService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
 
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
 
@Service
@Transactional
@Slf4j
@SuppressWarnings("all")
public class WaylineJobHistoryServiceImpl implements IWaylineJobHistoryService {
    @Autowired
    private IWaylineJobHistoryMapper mapper;
 
    @Autowired
    private IFileService fileService;
 
    @Autowired
    private IDeviceService deviceService;
 
    @Override
    public Optional<WaylineJobDTO> createWaylineJob(WaylineJobHistoryEntity entity) {
        int id = mapper.insert(entity);
        if (id <= 0) {
            return Optional.empty();
        }
        return Optional.ofNullable(this.entity2Dto(entity));
    }
 
    @Override
    public Boolean updateJob(WaylineJobDTO dto) {
        int id = mapper.update(dto2Entity(dto),
                new LambdaQueryWrapper<WaylineJobHistoryEntity>()
                        .eq(WaylineJobHistoryEntity::getJobId, dto.getJobId()
                ));
        return id>0;
    }
 
    @Override
    public PaginationData<WaylineJobDTO> getJobsList(long page, long pageSize, Integer status,
                                                     Long startTime, Long endTime, Integer taskType,
                                                     String name, Boolean isComplete) {
        Page<WaylineJobHistoryEntity> pageData = mapper.selectPage(
                new Page<WaylineJobHistoryEntity>(page, pageSize),
                new LambdaQueryWrapper<WaylineJobHistoryEntity>()
                        .isNull(WaylineJobHistoryEntity::getParentId)
                        // 实际开始时间筛选,允许为空,为空则不进行筛选
                        .ge(startTime != null, WaylineJobHistoryEntity::getBeginTime, startTime)
                        .le(endTime != null, WaylineJobHistoryEntity::getBeginTime, endTime)
                        // 任务类型筛选,允许为空,为空则不进行筛选
                        .eq(taskType != null, WaylineJobHistoryEntity::getTaskType, taskType)
                        // 任务名称筛选,允许为空,为空则不进行筛选;....模糊查询
                        .like(name != null, WaylineJobHistoryEntity::getName, "%" + name + "%")
                        // 根据是否完成筛选,允许为空,为空则不进行筛选
                        .eq(isComplete != null && isComplete, WaylineJobHistoryEntity::getStatus, 3)
                        .ne(isComplete != null && !isComplete, WaylineJobHistoryEntity::getStatus, 3)
                        // 任务状态筛选,允许为空,为空则不进行筛选
                        .eq(status != null, WaylineJobHistoryEntity::getStatus, status)
                        .orderByDesc(WaylineJobHistoryEntity::getBeginTime));
        List<WaylineJobDTO> records = pageData.getRecords()
                .stream()
                .map(this::entity2Dto)
                .peek(job -> {
                    List<WaylineJobDTO> childOpt = this.getJobByJobParentId(job.getJobId());
                    job.setChildren(childOpt);
                })
                .collect(Collectors.toList());
 
        return new PaginationData<WaylineJobDTO>(records, new Pagination(pageData));
    }
 
    public List<WaylineJobDTO> getJobByJobParentId(String parentId) {
        List<WaylineJobHistoryEntity> jobEntities = mapper.selectList(
                new LambdaQueryWrapper<WaylineJobHistoryEntity>()
                        .eq(WaylineJobHistoryEntity::getParentId, parentId));
        if (CollectionUtils.isEmpty(jobEntities)) {
            return Collections.emptyList(); // 返回不可变空列表,更安全
        }
        return jobEntities.stream()
                .map(this::entity2Dto) // 调用原有的单个转换方法
                .collect(Collectors.toList());
    }
 
    @Override
    public Optional<WaylineJobDTO> getJobByJobId(String jobId) {
        WaylineJobHistoryEntity jobEntities = mapper.selectOne(
                new LambdaQueryWrapper<WaylineJobHistoryEntity>()
                        .eq(WaylineJobHistoryEntity::getJobId, jobId));
        return Optional.ofNullable(this.entity2Dto(jobEntities));
    }
 
    /**
     * 将WaylineJobDTO对象转换为WaylineJobHistoryEntity对象
     *
     * @param dto WaylineJobDTO对象
     * @return WaylineJobHistoryEntity对象
     */
    @Override
    public WaylineJobHistoryEntity dto2Entity(WaylineJobDTO dto) {
        WaylineJobHistoryEntity.WaylineJobHistoryEntityBuilder builder = WaylineJobHistoryEntity.builder();
 
        if (dto == null) {
            return builder.build();
        }
        if (Objects.nonNull(dto.getBeginTime())) {
            builder.beginTime(dto.getBeginTime().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
        }
        if (Objects.nonNull(dto.getEndTime())) {
            builder.endTime(dto.getEndTime().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
        }
        if (Objects.nonNull(dto.getExecuteTime())) {
            builder.executeTime(dto.getExecuteTime().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
        }
        if (Objects.nonNull(dto.getCompletedTime())) {
            builder.completedTime(dto.getCompletedTime().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
        }
        return builder.status(dto.getStatus())
                .mediaCount(dto.getMediaCount())
                .name(dto.getJobName())
                .errorCode(dto.getCode())
                .jobId(dto.getJobId())
                .fileId(dto.getFileId())
                .filename(dto.getFileName())
                .dockSn(dto.getDockSn())
                .taskType(dto.getTaskType())
                .waylineType(dto.getWaylineType())
                .username(dto.getUsername())
                .rthAltitude(dto.getRthAltitude())
                .outOfControlAction(dto.getOutOfControlAction())
                .parentId(dto.getParentId())
                .loopSum(dto.getLoopSum())
                .build();
    }
 
    /**
     * 将实体对象转换为数据传输对象
     *
     * @param entity WaylineJobEntity 实体对象
     * @return WaylineJobDTO 数据传输对象
     */
    private WaylineJobDTO entity2Dto(WaylineJobHistoryEntity entity) {
        if (entity == null) {
            return null;
        }
        // 修改航线文件名称,从ard_route_info航线表中取;
        String fileId = entity.getFileId();
        WaylineJobDTO.WaylineJobDTOBuilder builder = WaylineJobDTO.builder()
                .jobId(entity.getJobId())
                .jobName(entity.getName())
                .fileId(entity.getFileId())
                .fileName(entity.getFilename())
                .dockSn(entity.getDockSn())
                .dockName(deviceService.getDeviceBySn(entity.getDockSn())
                        .orElse(DeviceDTO.builder().build()).getNickname())
                .username(entity.getUsername())
                .status(entity.getStatus())
                .code(entity.getErrorCode())
                .beginTime(LocalDateTime.ofInstant(Instant.ofEpochMilli(entity.getBeginTime()), ZoneId.systemDefault()))
                .endTime(Objects.nonNull(entity.getEndTime()) ?
                        LocalDateTime.ofInstant(Instant.ofEpochMilli(entity.getEndTime()), ZoneId.systemDefault()) : null)
                .executeTime(Objects.nonNull(entity.getExecuteTime()) ?
                        LocalDateTime.ofInstant(Instant.ofEpochMilli(entity.getExecuteTime()), ZoneId.systemDefault()) : null)
                .completedTime(WaylineJobStatusEnum.find(entity.getStatus()).getEnd() ?
                        LocalDateTime.ofInstant(Instant.ofEpochMilli(entity.getUpdateTime()), ZoneId.systemDefault()) : null)
                .taskType(entity.getTaskType())
                .waylineType(entity.getWaylineType())
                .rthAltitude(entity.getRthAltitude())
                .rthMode(entity.getRthMode())
                .outOfControlAction(entity.getOutOfControlAction())
                .mediaCount(entity.getMediaCount())
                .loopSum(entity.getLoopSum());
 
 
//        if (Objects.nonNull(entity.getEndTime())) {
//            builder.endTime(LocalDateTime.ofInstant(Instant.ofEpochMilli(entity.getEndTime()), ZoneId.systemDefault()));
//        }
//        if (WaylineJobStatusEnum.IN_PROGRESS.getVal() == entity.getStatus() && RedisOpsUtils.getExpire(entity.getJobId()) > 0) {
//            EventsReceiver<WaylineTaskProgressReceiver> taskProgress = (EventsReceiver<WaylineTaskProgressReceiver>) RedisOpsUtils.get(RedisConst.WAYLINE_JOB_RUNNING_PREFIX + entity.getDockSn());
//            if (Objects.nonNull(taskProgress.getOutput()) && Objects.nonNull(taskProgress.getOutput().getProgress())) {
//                builder.progress(taskProgress.getOutput().getProgress().getPercent());
//            }
//        }
//
//        if (entity.getMediaCount() == 0) {
//            return builder.build();
//        }
//
//        // sync the number of media files
//        String key = RedisConst.MEDIA_HIGHEST_PRIORITY_PREFIX + entity.getDockSn();
//        String countKey = RedisConst.MEDIA_FILE_PREFIX + entity.getDockSn();
//        Object mediaFileCount = RedisOpsUtils.hashGet(countKey, entity.getJobId());
//        if (Objects.nonNull(mediaFileCount)) {
//            builder.uploadedCount(((MediaFileCountDTO) mediaFileCount).getUploadedCount())
//                    .uploading(RedisOpsUtils.checkExist(key) && entity.getJobId().equals(((MediaFileCountDTO) RedisOpsUtils.get(key)).getJobId()));
//            return builder.build();
//        }
 
//        int uploadedSize = fileService.getFilesByWorkspaceAndJobId(entity.getJobId()).size();
//        // All media for this job have been uploaded.
//        if (uploadedSize >= entity.getMediaCount()) {
//            return builder.uploadedCount(uploadedSize).build();
//        }
//        RedisOpsUtils.hashSet(countKey, entity.getJobId(),
//                MediaFileCountDTO.builder()
//                        .jobId(entity.getJobId())
//                        .mediaCount(entity.getMediaCount())
//                        .uploadedCount(uploadedSize).build());
        return builder.build();
    }
}