Browse Source

优化节点删除速度

cr 16 hours ago
parent
commit
52e910bad4

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java

@@ -249,7 +249,7 @@ public class ArchiveTreeContractController extends BladeController {
     @ApiOperationSupport(order = 7)
     @ApiOperation(value = "逻辑删除", notes = "传入id")
     public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String id) {
-        List<ArchiveTreeContract> archiveTrees = archiveTreeContractService.selectByParentIdOrId(id);
+//        List<ArchiveTreeContract> archiveTrees = archiveTreeContractService.selectByParentIdOrId(id);
 //		archiveTrees.forEach(archiveTree -> {
 //			if (archiveTree.getParentId() == Long.parseLong(id)) {
 //				throw new ServiceException("当前节点下存在子节点,删除失败");

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java

@@ -192,4 +192,6 @@ public interface ArchiveTreeContractMapper extends BaseMapper<ArchiveTreeContrac
                                     @Param("parentId") Long parentId);
 
     List<ArchiveTreeContract> getArchiveTreeContractListByListOrderByTreeSort(@Param("nodeIds") List<Long> nodeIds);
+
+    void callGetChildIds(@Param("params") Map<String, Object> params);
 }

+ 8 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml

@@ -1043,4 +1043,12 @@
         </foreach>
         ORDER BY case when d.tree_sort regexp '^[a-zA-Z]' then 0 when d.tree_sort regexp '^[0-9]' then 1 else 2 end, d.tree_sort
     </select>
+    <select id="callGetChildIds" statementType="CALLABLE">
+        CALL get_archive_tree_child_ids(
+            #{params.parentId, mode=IN, jdbcType=BIGINT},
+            #{params.projectId, mode=IN, jdbcType=BIGINT},
+            #{params.tenantId, mode=IN, jdbcType=VARCHAR},
+            #{params.outIds, mode=OUT, jdbcType=VARCHAR}
+            )
+    </select>
 </mapper>

+ 49 - 9
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java

@@ -18,6 +18,7 @@ package org.springblade.manager.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.mixsmart.utils.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
@@ -752,26 +753,65 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 	 * @param id
 	 * @return
 	 */
-	public  boolean deleteTree(Long id) {
+//	public  boolean deleteTree(Long id) {
+//		ArchiveTreeContract dstNode = this.getById(id);
+//		if (dstNode == null ) {
+//			return false;
+//		}
+//
+//		List<ArchiveTreeContractVO2> dstTrees = this.tree2Root(AuthUtil.getTenantId(),null,null,dstNode.getProjectId(),null);
+//		if (dstTrees == null || dstTrees.size() == 0) {
+//			return false;
+//		}
+//
+//		ArchiveTreeContractVO2 subTree = ForestNodeMergerEx.getSubTree(dstTrees.get(0),id);
+//
+//		List<Long> ids = ForestNodeMergerEx.getChildrenIds(subTree);
+//
+//		ids.add(id);
+//		this.deleteLogic(ids);
+//		return true;
+//	}
+
+	public boolean deleteTree(Long id) {
 		ArchiveTreeContract dstNode = this.getById(id);
-		if (dstNode == null ) {
+		if (dstNode == null) {
 			return false;
 		}
+		String tenantId = AuthUtil.getTenantId();
+		Long projectId = dstNode.getProjectId();
 
-		List<ArchiveTreeContractVO2> dstTrees = this.tree2Root(AuthUtil.getTenantId(),null,null,dstNode.getProjectId(),null);
-		if (dstTrees == null || dstTrees.size() == 0) {
+		// 调用优化后的listAllChildIds(CTE/存储过程均可)
+		List<Long> ids = this.listAllChildIds(id, projectId, tenantId);
+		if (CollectionUtils.isEmpty(ids)) {
 			return false;
 		}
 
-		ArchiveTreeContractVO2 subTree = ForestNodeMergerEx.getSubTree(dstTrees.get(0),id);
-
-		List<Long> ids = ForestNodeMergerEx.getChildrenIds(subTree);
-
-		ids.add(id);
 		this.deleteLogic(ids);
 		return true;
 	}
 
+	public List<Long> listAllChildIds(Long parentId, Long projectId, String tenantId) {
+		// 1. 构建存储过程入参
+		Map<String, Object> params = new HashMap<>(4);
+		params.put("parentId", parentId);
+		params.put("projectId", projectId);
+		params.put("tenantId", tenantId);
+		params.put("outIds", "");  // 初始化出参
+
+		// 2. 调用存储过程
+		baseMapper.callGetChildIds(params);
+
+		// 3. 解析出参(逗号分隔的ID字符串转Long列表)
+		String outIds = (String) params.get("outIds");
+		if (StringUtils.isEmpty(outIds)) {
+			return Collections.emptyList();
+		}
+		return Arrays.stream(outIds.split(","))
+				.map(Long::valueOf)
+				.collect(Collectors.toList());
+	}
+
 	/**
 	 * 更轻量的删除节点树,同时删除节点下的案卷和文件
 	 * @param id