From bcd0a5be94d339d937413e5f829823b22715aa0d Mon Sep 17 00:00:00 2001
From: zhaowenyu <35589726@qq.com>
Date: Tue, 10 Mar 2026 09:27:21 +0800
Subject: [PATCH] 2026-03-09 优化 查询全部目录(含下属标注数据) 1. 默认文件夹固定置顶,其余目录按createTime降序排序 2. 目录下的标注按createTime降序排序

---
 ard-sample/src/main/java/com/ard/sample/annotation/service/impl/AnnotationDirectoryServiceImpl.java |  109 +++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 94 insertions(+), 15 deletions(-)

diff --git a/ard-sample/src/main/java/com/ard/sample/annotation/service/impl/AnnotationDirectoryServiceImpl.java b/ard-sample/src/main/java/com/ard/sample/annotation/service/impl/AnnotationDirectoryServiceImpl.java
index 577addc..6ad0f4f 100644
--- a/ard-sample/src/main/java/com/ard/sample/annotation/service/impl/AnnotationDirectoryServiceImpl.java
+++ b/ard-sample/src/main/java/com/ard/sample/annotation/service/impl/AnnotationDirectoryServiceImpl.java
@@ -16,6 +16,7 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -80,40 +81,119 @@
         return result;
     }
 
+//    /**
+//     * 查询全部目录(含下属标注数据)
+//     * 修复点:替换自定义Mapper方法为MyBatis-Plus通用查询,避免SQL映射缺失问题
+//     */
+//    @Override
+//    public List<AnnotationDirectoryDTO> listAllDirectoryWithAnnotations() {
+//        // 1. 查询所有目录
+//        List<AnnotationDirectoryEntity> directoryEntities = lambdaQuery()
+//                .orderByDesc(AnnotationDirectoryEntity::getCreateTime) // 核心:目录按创建时间降序
+//                .list();
+//        if (directoryEntities.isEmpty()) {
+//            return List.of();
+//        }
+//
+//        // 2. 批量查询所有标注,按目录ID分组(减少数据库查询次数)
+//        List<AnnotationEntity> allAnnotations = annotationService.list();
+//        Map<String, List<AnnotationEntity>> annotationMap = allAnnotations.stream()
+//                .collect(Collectors.groupingBy(AnnotationEntity::getDirectoryId));
+//
+//        // 3. 遍历目录,组装DTO(关联下属标注)
+//        return directoryEntities.stream().map(directoryEntity -> {
+//            AnnotationDirectoryDTO directoryDTO = AnnotationDirectoryDTO.builder().build();
+//            BeanUtils.copyProperties(directoryEntity, directoryDTO);
+//
+//            // 4. 获取当前目录下的标注,并按createTime降序排序
+//            List<AnnotationEntity> annotationEntities = annotationMap.getOrDefault(directoryEntity.getId(), List.of())
+//                    .stream()
+//                    .sorted((a1, a2) -> a2.getCreateTime().compareTo(a1.getCreateTime())) // 标注按创建时间降序
+//                    .collect(Collectors.toList());
+//
+//            // 5. 标注实体转DTO(反序列化坐标数据)
+//            List<AnnotationDTO> annotationDTOList = annotationEntities.stream().map(annotationEntity -> {
+//                AnnotationDTO annotationDTO = AnnotationDTO.builder().build();
+//                BeanUtils.copyProperties(annotationEntity, annotationDTO);
+//                try {
+//                    // 反序列化坐标数据
+//                    annotationDTO.setCoordinateInfo(
+//                            JsonSerializeUtil.deserialize(annotationEntity.getCoordinateInfo())
+//                    );
+//                } catch (Exception e) {
+//                    log.error("反序列化标注坐标失败,标注ID:{}", annotationEntity.getId(), e);
+//                    annotationDTO.setCoordinateInfo(null);
+//                }
+//                return annotationDTO;
+//            }).collect(Collectors.toList());
+//
+//            // 6. 设置目录下的标注列表
+//            directoryDTO.setAnnotations(annotationDTOList);
+//            return directoryDTO;
+//        }).collect(Collectors.toList());
+//    }
+
     /**
      * 查询全部目录(含下属标注数据)
-     * 修复点:替换自定义Mapper方法为MyBatis-Plus通用查询,避免SQL映射缺失问题
+     * 优化点:
+     * 1. 默认文件夹固定置顶,其余目录按createTime降序排序
+     * 2. 目录下的标注按createTime降序排序
      */
     @Override
     public List<AnnotationDirectoryDTO> listAllDirectoryWithAnnotations() {
-        // 1. 查询所有目录
-        List<AnnotationDirectoryEntity> directoryEntities = list();
-        if (directoryEntities.isEmpty()) {
+        // 1. 查询所有目录(未排序)
+        List<AnnotationDirectoryEntity> allDirectoryEntities = list();
+        if (allDirectoryEntities.isEmpty()) {
             return List.of();
         }
 
-        // 2. 批量查询所有标注,按目录ID分组(减少数据库查询次数)
+        // 2. 拆分默认目录和普通目录
+        String defaultDirId = "default_directory_00000001"; // 默认文件夹固定ID
+        AnnotationDirectoryEntity defaultDirectory = null;
+        List<AnnotationDirectoryEntity> normalDirectories = new ArrayList<>();
+
+        for (AnnotationDirectoryEntity dir : allDirectoryEntities) {
+            if (defaultDirId.equals(dir.getId())) {
+                defaultDirectory = dir; // 筛选出默认目录
+            } else {
+                normalDirectories.add(dir); // 其余为普通目录
+            }
+        }
+
+        // 3. 普通目录按createTime降序排序
+        List<AnnotationDirectoryEntity> sortedNormalDirectories = normalDirectories.stream()
+                .sorted((d1, d2) -> d2.getCreateTime().compareTo(d1.getCreateTime()))
+                .collect(Collectors.toList());
+
+        // 4. 组装最终的目录列表:默认目录(如果存在) + 排序后的普通目录
+        List<AnnotationDirectoryEntity> finalDirectoryEntities = new ArrayList<>();
+        if (defaultDirectory != null) {
+            finalDirectoryEntities.add(defaultDirectory); // 默认目录置顶
+        }
+        finalDirectoryEntities.addAll(sortedNormalDirectories);
+
+        // 5. 批量查询所有标注,按目录ID分组(减少数据库查询次数)
         List<AnnotationEntity> allAnnotations = annotationService.list();
         Map<String, List<AnnotationEntity>> annotationMap = allAnnotations.stream()
                 .collect(Collectors.groupingBy(AnnotationEntity::getDirectoryId));
 
-        // 3. 遍历目录,组装DTO(关联下属标注)
-        return directoryEntities.stream().map(directoryEntity -> {
+        // 6. 遍历组装DTO(逻辑不变,仅使用最终排序后的目录列表)
+        return finalDirectoryEntities.stream().map(directoryEntity -> {
             AnnotationDirectoryDTO directoryDTO = AnnotationDirectoryDTO.builder().build();
             BeanUtils.copyProperties(directoryEntity, directoryDTO);
 
-            // 4. 获取当前目录下的标注(从分组Map中获取,避免循环查库)
-            List<AnnotationEntity> annotationEntities = annotationMap.getOrDefault(directoryEntity.getId(), List.of());
+            // 7. 目录下的标注按createTime降序排序
+            List<AnnotationEntity> annotationEntities = annotationMap.getOrDefault(directoryEntity.getId(), List.of())
+                    .stream()
+                    .sorted((a1, a2) -> a2.getCreateTime().compareTo(a1.getCreateTime()))
+                    .collect(Collectors.toList());
 
-            // 5. 标注实体转DTO(反序列化坐标数据)
+            // 8. 标注实体转DTO(原有逻辑完全保留)
             List<AnnotationDTO> annotationDTOList = annotationEntities.stream().map(annotationEntity -> {
                 AnnotationDTO annotationDTO = AnnotationDTO.builder().build();
                 BeanUtils.copyProperties(annotationEntity, annotationDTO);
                 try {
-                    // 反序列化坐标数据
-                    annotationDTO.setCoordinateInfo(
-                            JsonSerializeUtil.deserialize(annotationEntity.getCoordinateInfo())
-                    );
+                    annotationDTO.setCoordinateInfo(JsonSerializeUtil.deserialize(annotationEntity.getCoordinateInfo()));
                 } catch (Exception e) {
                     log.error("反序列化标注坐标失败,标注ID:{}", annotationEntity.getId(), e);
                     annotationDTO.setCoordinateInfo(null);
@@ -121,7 +201,6 @@
                 return annotationDTO;
             }).collect(Collectors.toList());
 
-            // 6. 设置目录下的标注列表
             directoryDTO.setAnnotations(annotationDTOList);
             return directoryDTO;
         }).collect(Collectors.toList());

--
Gitblit v1.9.3