zhaowenyu
2026-02-27 b5c022295a2d678edff3f54d9ee10e2fa1515c2d
ard-sample/src/main/java/com/ard/sample/media/service/impl/FileServiceImpl.java
@@ -2,6 +2,8 @@
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.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ard.sample.common.model.Pagination;
@@ -14,18 +16,18 @@
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;
/**
@@ -33,9 +35,13 @@
 * @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;
@@ -45,6 +51,12 @@
    @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>()
@@ -67,6 +79,17 @@
    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);
    }
@@ -76,6 +99,34 @@
                .stream()
                .map(this::entityConvertToDto)
                .collect(Collectors.toList());
    }
    /**
     * 根据任务id获取全部媒体库文件
     *
     * @param jobId 任务id
     * @return List<MediaFileDTO> 媒体库文件列表
     */
    @Override
    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));
    }
    @Override
@@ -119,6 +170,10 @@
        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())
@@ -127,6 +182,7 @@
                    .isOriginal(file.getExt().getIsOriginal())
                    .jobId(file.getExt().getFlightId())
                    .drone(file.getExt().getSn())
                    .startTime(creaeTime)
                    .tinnyFingerprint(file.getExt().getTinnyFingerprint());
            // domain-type-subType
@@ -159,7 +215,14 @@
                    .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());