| | |
| | | |
| | | import com.ard.common.config.OssConfiguration; |
| | | import com.ard.oss.service.impl.OssServiceContext; |
| | | import com.ard.sample.utils.TimestampUtils; |
| | | import com.ard.sample.utils.VideoDurationUtilFFmpeg; |
| | | import com.ard.sample.wayline.model.dto.WaylineJobDTO; |
| | | import com.ard.sample.wayline.service.IWaylineJobService; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ard.sample.common.model.Pagination; |
| | |
| | | import com.ard.sample.media.model.MediaFileDTO; |
| | | import com.ard.sample.media.model.MediaFileEntity; |
| | | import com.ard.sample.media.service.IFileService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import javax.annotation.Resource; |
| | | import java.math.BigDecimal; |
| | | import java.net.URL; |
| | | import java.time.Instant; |
| | | import java.time.LocalDateTime; |
| | | import java.time.ZoneId; |
| | | import java.util.Arrays; |
| | | import java.util.List; |
| | | import java.util.Optional; |
| | | import java.util.UUID; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | |
| | | * @version 0.2 |
| | | * @date 2021/12/9 |
| | | */ |
| | | @Slf4j |
| | | @Service |
| | | @Transactional |
| | | public class FileServiceImpl implements IFileService { |
| | | |
| | | // 定义全局的日期时间格式化器(复用避免重复创建) |
| | | private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); |
| | | |
| | | @Resource |
| | | private IFileMapper mapper; |
| | |
| | | private IDeviceDictionaryService deviceDictionaryService; |
| | | |
| | | @Autowired |
| | | private IWaylineJobService _waylineJobService; |
| | | |
| | | @Autowired |
| | | private OssServiceContext ossService; |
| | | |
| | | @Autowired |
| | | private VideoDurationUtilFFmpeg _videoDurationUtil; |
| | | |
| | | @Autowired |
| | | private TimestampUtils _timestampUtils; |
| | | |
| | | private Optional<MediaFileEntity> getMediaByFingerprint(String fingerprint) { |
| | | MediaFileEntity fileEntity = mapper.selectOne(new LambdaQueryWrapper<MediaFileEntity>() |
| | |
| | | public Integer saveFile(FileUploadDTO file) { |
| | | MediaFileEntity fileEntity = this.fileUploadConvertToEntity(file); |
| | | fileEntity.setFileId(UUID.randomUUID().toString()); |
| | | if(fileEntity.getFileName().contains(".mp4")) { |
| | | log.info("mp4文件入库时读取视频时长,文件名:{},文件地址:{}",fileEntity.getFileName(),fileEntity.getFilePath()); |
| | | double duration = _videoDurationUtil.getRemoteMp4Duration(file.getPath()); |
| | | log.info("mp4视频文件时长为:{}",duration); |
| | | fileEntity.setDuration(duration); |
| | | log.info("视频创建时间:{}",fileEntity.getStartTime()); |
| | | long endTime=_timestampUtils.plusSecondsByMillis(fileEntity.getStartTime(), duration); |
| | | log.info("视频创建时间+时长=结束时间:{}",endTime); |
| | | fileEntity.setEndTime(endTime); |
| | | } |
| | | |
| | | return mapper.insert(fileEntity); |
| | | } |
| | | |
| | |
| | | .collect(Collectors.toList()); |
| | | } |
| | | |
| | | /** |
| | | * 根据任务id获取全部媒体库文件 |
| | | * |
| | | * @param jobId 任务id |
| | | * @return List<MediaFileDTO> 媒体库文件列表 |
| | | */ |
| | | @Override |
| | | public PaginationData<MediaFileDTO> getMediaFilesPagination(long page, long pageSize) { |
| | | public PaginationData<MediaFileDTO> getJobFiles(long page, long pageSize,String jobId, String isType) { |
| | | Page<MediaFileEntity> pageData = mapper.selectPage( |
| | | new Page<MediaFileEntity>(page, pageSize), |
| | | new LambdaQueryWrapper<MediaFileEntity>() |
| | | .eq(Objects.nonNull(jobId), MediaFileEntity::getJobId, jobId) |
| | | // .orderByDesc(MediaFileEntity::getId)); |
| | | // isType=1 时匹配 V.jpeg |
| | | .like("1".equals(isType), MediaFileEntity::getFileName, "V.jpeg") |
| | | // isType=0 时匹配 V.mp4 |
| | | .like("0".equals(isType), MediaFileEntity::getFileName, "V.mp4") |
| | | // 排序修改:按start_time正序(升序)排列 |
| | | .orderByAsc(MediaFileEntity::getStartTime)); // 关键改动1:替换排序方式 |
| | | |
| | | List<MediaFileDTO> records = pageData.getRecords() |
| | | .stream() |
| | | .map(this::entityConvertToDto) |
| | | .collect(Collectors.toList()); |
| | | |
| | | return new PaginationData<MediaFileDTO>(records, new Pagination(pageData)); |
| | | } |
| | | |
| | | /** |
| | | * 分页获取媒体文件列表 |
| | | * 增加筛选条件 |
| | | * @param page 当前页码 |
| | | * @param pageSize 每页大小 |
| | | * @return 分页数据对象,包含媒体文件列表和分页信息 |
| | | */ |
| | | @Override |
| | | public PaginationData<MediaFileDTO> getMediaFilesPagination(long page, long pageSize, String jobId, Long startTime, Long endTime) { |
| | | Page<MediaFileEntity> pageData = mapper.selectPage( |
| | | new Page<MediaFileEntity>(page, pageSize), |
| | | new LambdaQueryWrapper<MediaFileEntity>() |
| | | .eq(jobId != null, MediaFileEntity::getJobId, jobId) |
| | | .ge(startTime != null, MediaFileEntity::getStartTime, startTime) |
| | | .le(endTime != null, MediaFileEntity::getStartTime, endTime) |
| | | .orderByDesc(MediaFileEntity::getId)); |
| | | List<MediaFileDTO> records = pageData.getRecords() |
| | | .stream() |
| | |
| | | } |
| | | |
| | | /** |
| | | * Convert the received file object into a database entity object. |
| | | * 将接收到的文件对象转换为数据库实体对象。 |
| | | * @param file |
| | | * @return |
| | | */ |
| | |
| | | MediaFileEntity.MediaFileEntityBuilder builder = MediaFileEntity.builder(); |
| | | |
| | | if (file != null) { |
| | | long creaeTime = 0; |
| | | if(file.getMetadata().getCreatedTime() != null) { |
| | | creaeTime = file.getMetadata().getCreatedTime().getTime(); |
| | | } |
| | | builder.fileName(file.getName()) |
| | | .filePath(file.getPath()) |
| | | .fingerprint(file.getFingerprint()) |
| | |
| | | .isOriginal(file.getExt().getIsOriginal()) |
| | | .jobId(file.getExt().getFlightId()) |
| | | .drone(file.getExt().getSn()) |
| | | .startTime(creaeTime) |
| | | .tinnyFingerprint(file.getExt().getTinnyFingerprint()); |
| | | |
| | | // domain-type-subType |
| | |
| | | } |
| | | |
| | | /** |
| | | * Convert database entity objects into file data transfer object. |
| | | * 将数据库实体对象转换为文件数据传输对象。 |
| | | * @param entity |
| | | * @return |
| | | */ |
| | |
| | | .tinnyFingerprint(entity.getTinnyFingerprint()) |
| | | .payload(entity.getPayload()) |
| | | .createTime(LocalDateTime.ofInstant( |
| | | Instant.ofEpochMilli(entity.getCreateTime()), ZoneId.systemDefault())) |
| | | Instant.ofEpochMilli(entity.getCreateTime()), ZoneId.systemDefault()).format(DATE_TIME_FORMATTER)) |
| | | .updateTime(LocalDateTime.ofInstant( |
| | | Instant.ofEpochMilli(entity.getUpdateTime()), ZoneId.systemDefault()).format(DATE_TIME_FORMATTER)) |
| | | .startTime(LocalDateTime.ofInstant( |
| | | Instant.ofEpochMilli(entity.getStartTime()), ZoneId.systemDefault()).format(DATE_TIME_FORMATTER)) |
| | | .endTime(LocalDateTime.ofInstant( |
| | | Instant.ofEpochMilli(entity.getEndTime()), ZoneId.systemDefault()).format(DATE_TIME_FORMATTER)) |
| | | .duration(entity.getDuration()) |
| | | .drone(entity.getDrone()) |
| | | .jobId(entity.getJobId()); |
| | | .jobId(entity.getJobId()) |
| | | .jobName(entity.getJobName()); |
| | | |
| | | } |
| | | |