From 473b5351fbbfd4e5fa4b0f87356253776bfa6da6 Mon Sep 17 00:00:00 2001
From: zhaowenyu <35589726@qq.com>
Date: Mon, 02 Mar 2026 08:25:41 +0800
Subject: [PATCH] 2026-03-02 优化媒体文件查询列表,新增任务名称

---
 ard-sample/src/main/java/com/ard/sample/media/service/impl/FileServiceImpl.java |   97 ++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 88 insertions(+), 9 deletions(-)

diff --git a/ard-sample/src/main/java/com/ard/sample/media/service/impl/FileServiceImpl.java b/ard-sample/src/main/java/com/ard/sample/media/service/impl/FileServiceImpl.java
index 3e065a3..ebf91a4 100644
--- a/ard-sample/src/main/java/com/ard/sample/media/service/impl/FileServiceImpl.java
+++ b/ard-sample/src/main/java/com/ard/sample/media/service/impl/FileServiceImpl.java
@@ -2,6 +2,10 @@
 
 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;
@@ -14,18 +18,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 +37,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;
@@ -44,7 +52,16 @@
     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>()
@@ -67,6 +84,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);
     }
 
@@ -78,11 +106,49 @@
                 .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()
@@ -111,7 +177,7 @@
     }
 
     /**
-     * Convert the received file object into a database entity object.
+     * 将接收到的文件对象转换为数据库实体对象。
      * @param file
      * @return
      */
@@ -119,6 +185,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 +197,7 @@
                     .isOriginal(file.getExt().getIsOriginal())
                     .jobId(file.getExt().getFlightId())
                     .drone(file.getExt().getSn())
+                    .startTime(creaeTime)
                     .tinnyFingerprint(file.getExt().getTinnyFingerprint());
 
             // domain-type-subType
@@ -142,7 +213,7 @@
     }
 
     /**
-     * Convert database entity objects into file data transfer object.
+     * 将数据库实体对象转换为文件数据传输对象。
      * @param entity
      * @return
      */
@@ -159,9 +230,17 @@
                     .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());
 
         }
 

--
Gitblit v1.9.3