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 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() .eq(WaylineJobHistoryEntity::getJobId, dto.getJobId() )); return id>0; } @Override public PaginationData getJobsList(long page, long pageSize, Integer status, Long startTime, Long endTime, Integer taskType, String name, Boolean isComplete) { Page pageData = mapper.selectPage( new Page(page, pageSize), new LambdaQueryWrapper() .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 records = pageData.getRecords() .stream() .map(this::entity2Dto) .peek(job -> { List childOpt = this.getJobByJobParentId(job.getJobId()); job.setChildren(childOpt); }) .collect(Collectors.toList()); return new PaginationData(records, new Pagination(pageData)); } public List getJobByJobParentId(String parentId) { List jobEntities = mapper.selectList( new LambdaQueryWrapper() .eq(WaylineJobHistoryEntity::getParentId, parentId)); if (CollectionUtils.isEmpty(jobEntities)) { return Collections.emptyList(); // 返回不可变空列表,更安全 } return jobEntities.stream() .map(this::entity2Dto) // 调用原有的单个转换方法 .collect(Collectors.toList()); } @Override public Optional getJobByJobId(String jobId) { WaylineJobHistoryEntity jobEntities = mapper.selectOne( new LambdaQueryWrapper() .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 taskProgress = (EventsReceiver) 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(); } }