Prechádzať zdrojové kódy

DiskAlbumService#addAlbumFile 实现添加文件/文件夹中的文件到合集

reghao 6 mesiacov pred
rodič
commit
5784abfcda

+ 1 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/db/mapper/DiskFileMapper.java

@@ -22,6 +22,7 @@ public interface DiskFileMapper extends BaseMapper<DiskFile> {
     int countByDiskQuery(DiskQuery diskQuery);
     List<DiskFile> findDiskQueryByPage(@Param("page") Page page, @Param("diskQuery") DiskQuery diskQuery);
     List<DiskFile> findByFileIds(List<String> list);
+    List<DiskFile> findByParentIds(List<String> list);
     DiskFile findRoot();
 
     List<String> countSha256sumGroupByDiskQuery(@Param("fileType") int fileType, @Param("userId") long userId);

+ 34 - 8
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/service/DiskAlbumService.java

@@ -59,9 +59,9 @@ public class DiskAlbumService {
     }
 
     /**
-     * 添加新文件到合集中
+     * 添加某类型的新文件到对应类型的合集中
      *
-     * @param
+     * @param fileIds 文件或文件夹 ID
      * @return
      * @date 2025-09-04 17:47:40
      */
@@ -81,17 +81,44 @@ public class DiskAlbumService {
         Set<String> set = new HashSet<>(existSha256sumList);
         long loginUser = UserContext.getUserId();
         int fileType = diskAlbum.getFileType();
-        List<DiskFile> diskFileList = diskFileService.findByFileIds(fileIds).stream()
-                .filter(diskFile -> !set.contains(diskFile.getSha256sum()))
+
+        List<DiskFile> diskFileList0 = diskFileService.findByFileIds(fileIds);
+        Map<Integer, List<DiskFile>> groupMap = diskFileList0.stream()
                 .filter(diskFile -> diskFile.getOwner() == loginUser)
-                .filter(diskFile -> diskFile.getFileType() == fileType)
-                .collect(Collectors.toList());
+                .collect(Collectors.groupingBy(DiskFile::getFileType));
+
+        List<DiskFile> diskFileList = new ArrayList<>();
+        List<DiskFile> folders = groupMap.get(ObjectType.Dir.getCode());
+        if (folders != null) {
+            List<String> pids = folders.stream().map(DiskFile::getFileId).collect(Collectors.toList());
+            // 只获取当前文件夹中的文件, 不递归查找子文件夹
+            List<DiskFile> diskFileList1 = diskFileService.findByParentIds(pids).stream()
+                    .filter(diskFile -> diskFile.getOwner() == loginUser)
+                    .filter(diskFile -> diskFile.getFileType() == fileType)
+                    .collect(Collectors.toList());
+            diskFileList.addAll(diskFileList1);
+        }
+
+        List<DiskFile> files = groupMap.get(fileType);
+        if (files != null) {
+            List<DiskFile> diskFileList2 = diskFileList = files.stream()
+                    .filter(diskFile -> !set.contains(diskFile.getSha256sum()))
+                    .collect(Collectors.toList());
+            diskFileList.addAll(diskFileList2);
+        }
 
         if (diskFileList.isEmpty()) {
             return Result.fail("添加的文件在当前合集中已存在");
         }
 
-        int startPos = existSha256sumList.size()+1;
+        int currentNum = diskAlbum.getNum();
+        int addNum = diskFileList.size();
+        int num = currentNum + addNum;
+        if (num > albumMaxFiles) {
+            log.info("新添加文件数量超过合集容量, 但这个限制尚未实现...");
+        }
+
+        int startPos = currentNum+1;
         List<DiskAlbumFile> list = new ArrayList<>();
         for (DiskFile diskFile : diskFileList) {
             list.add(new DiskAlbumFile(albumId, diskFile, startPos));
@@ -99,7 +126,6 @@ public class DiskAlbumService {
         }
 
         String coverFileId = diskFileList.get(0).getFileId();
-        int num = existSha256sumList.size() + diskFileList.size();
         diskAlbumRepository.saveDiskAlbum(albumId, coverFileId, num, list);
         return Result.successWithMsg(String.format("当前合集中新添加了 %s 张文件", list.size()));
     }

+ 8 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/service/DiskFileService.java

@@ -500,6 +500,14 @@ public class DiskFileService {
         return diskFileMapper.findByFileIds(fileIds);
     }
 
+    public List<DiskFile> findByParentIds(List<String> parentIds) {
+        if (parentIds.isEmpty()) {
+            return Collections.emptyList();
+        }
+
+        return diskFileMapper.findByParentIds(parentIds);
+    }
+
     public List<DiskFile> findBySha256sumList(List<String> sha256sumList) {
         if (sha256sumList.isEmpty()) {
             return Collections.emptyList();

+ 8 - 0
content/content-service/src/main/resources/mapper/disk/DiskFileMapper.xml

@@ -94,6 +94,14 @@
             #{id}
         </foreach>
     </select>
+    <select id="findByParentIds" resultType="cn.reghao.tnb.content.app.disk.model.po.DiskFile">
+        select *
+        from my_disk_file
+        where pid in
+        <foreach collection="list" item="id" index="index" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </select>
     <select id="findRoot" resultType="cn.reghao.tnb.content.app.disk.model.po.DiskFile">
         select *
         from my_disk_file