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