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 | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 100 insertions(+), 16 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 ada036c..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;
@@ -63,9 +64,14 @@
@Override
@Transactional(rollbackFor = Exception.class) // 事务保证级联删除
public boolean deleteDirectory(String id) {
- if (id == null) {
+ if (id == null || id.isEmpty()) {
log.error("删除目录失败:ID为空");
return false;
+ }
+ // ====================== 关键:不允许删除默认文件夹 ======================
+ if ("default_directory_00000001".equals(id)) {
+ log.error("删除目录失败:默认文件夹不允许删除");
+ throw new RuntimeException("默认文件夹不允许删除");
}
// 1. 删除目录下所有标记
annotationMapper.deleteByMap(Map.of("directory_id", id));
@@ -75,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);
@@ -116,7 +201,6 @@
return annotationDTO;
}).collect(Collectors.toList());
- // 6. 设置目录下的标注列表
directoryDTO.setAnnotations(annotationDTOList);
return directoryDTO;
}).collect(Collectors.toList());
--
Gitblit v1.9.3