Эх сурвалжийг харах

Merge branch 'test-merge' of http://219.151.181.73:3000/zhuwei/bladex into test-merge

lvy 3 өдөр өмнө
parent
commit
d1fdac3cfb

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

@@ -258,8 +258,18 @@ public class ArchiveTreeContractController extends BladeController {
 //		});
 //
 //		return R.status(archiveTreeContractService.deleteLogic(Func.toLongList(id)));
-
-        return R.status(archiveTreeContractService.deleteTree(Long.parseLong(id)));
+        // 1. 查询节点基础信息(获取projectId)
+        ArchiveTreeContract dstNode = archiveTreeContractService.getById(id);
+        if (dstNode == null) {
+            return R.fail(200, "未查询到对应节点信息");
+        }else {
+            boolean b = archiveTreeContractService.removeById(id);
+            if(b){
+                //异步批量更新所有子节点为逻辑删除
+                archiveTreeContractService.deleteByAncestors(Long.parseLong(id), dstNode.getProjectId());
+            }
+            return R.status(b);
+        }
     }
 
 

+ 1 - 7
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java

@@ -22,14 +22,12 @@ import org.apache.ibatis.annotations.Param;
 import org.springblade.archive.dto.JiLinQueryDto;
 import org.springblade.archive.entity.ArchiveExpertConclusion;
 import org.springblade.business.entity.ArchiveFile;
-import org.springblade.business.entity.InformationQuery;
 import org.springblade.business.entity.TrialDetectionData;
 import org.springblade.business.entity.TrialSelfInspectionRecord;
 import org.springblade.business.vo.TrialSelfInspectionRecordFileVO;
 import org.springblade.manager.dto.ArchiveTreeContractDTO;
 import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.manager.entity.TrialClassificationConfiguration;
-import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.vo.*;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -193,11 +191,7 @@ public interface ArchiveTreeContractMapper extends BaseMapper<ArchiveTreeContrac
 
     List<ArchiveTreeContract> getArchiveTreeContractListByListOrderByTreeSort(@Param("nodeIds") List<Long> nodeIds);
 
-    void callGetChildIds(@Param("params") Map<String, Object> params);
-
-    List<Long> listAllChildIdsByCte(@Param("parentId") Long parentId, @Param("projectId") Long projectId, @Param("tenantId") String tenantId);
-
     Integer checkNodeExists(@Param("parentId") Long parentId, @Param("projectId") Long projectId, @Param("tenantId") String tenantId);
 
-    List<Long> listDirectChildIds(@Param("parentId") Long parentId, @Param("projectId") Long projectId, @Param("tenantId") String tenantId);
+    void deleteByAncestors(@Param("parentId") Long parentId, @Param("projectId") Long projectId);
 }

+ 9 - 38
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml

@@ -947,6 +947,15 @@
         </set>
         where is_deleted = 0 and project_id = #{node.projectId} and FIND_IN_SET(#{node.id},ancestors) > 0
     </update>
+    <update id="deleteByAncestors">
+        UPDATE m_archive_tree_contract
+        SET is_deleted = 1
+        WHERE is_deleted = 0
+          AND project_id = #{projectId}
+          AND (
+          CONCAT(',', ancestors, ',') LIKE CONCAT('%,', #{parentId}, ',%')
+            )
+    </update>
 
     <resultMap id="getArchiveTreeContractDtoMap" type="org.springblade.manager.dto.ArchiveTreeContractDTO">
         <id column="id" property="id"/>
@@ -1043,44 +1052,6 @@
         </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>
-    <select id="listAllChildIdsByCte" resultType="java.lang.Long">
-        WITH RECURSIVE child_nodes AS (
-            -- 初始节点:用MyBatis参数占位符,避免硬编码
-            SELECT id FROM m_archive_tree_contract
-            WHERE id = #{parentId}
-              AND is_deleted = 0
-              AND project_id = #{projectId}
-              AND tenant_id = #{tenantId}
-            UNION ALL
-            -- 递归子节点:关联CTE结果
-            SELECT t.id FROM m_archive_tree_contract t
-                                 INNER JOIN child_nodes cn ON t.parent_id = cn.id
-            WHERE t.is_deleted = 0
-              AND t.project_id = #{projectId}
-              AND t.tenant_id = #{tenantId}
-        )
-        SELECT id FROM child_nodes;
-    </select>
-    <!-- 查询单个节点的直接子节点(非递归,仅一级) -->
-    <select id="listDirectChildIds" resultType="java.lang.Long">
-        SELECT id
-        FROM m_archive_tree_contract
-        WHERE parent_id = #{parentId}
-        AND is_deleted = 0
-        AND project_id = #{projectId}
-        <if test="tenantId != null and tenantId != ''">
-            AND tenant_id = #{tenantId}
-        </if>
-    </select>
-
     <!-- 校验节点是否存在(可选,优化性能) -->
     <select id="checkNodeExists" resultType="java.lang.Integer">
         SELECT COUNT(1)

+ 3 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeContractService.java

@@ -97,7 +97,7 @@ public interface IArchiveTreeContractService extends BaseService<ArchiveTreeCont
 
     boolean UpdateByArchiveTree(ArchiveTree archiveTree);
 
-    boolean deleteTree(Long id);
+    Boolean deleteTree(Long id);
 
     void fillDefaultArchiveAutoInfo(List<ArchiveTreeContractVO2> tree, Long projectId,Long contractId);
 
@@ -149,4 +149,6 @@ public interface IArchiveTreeContractService extends BaseService<ArchiveTreeCont
     boolean deleteTreeEx(Long id);
 
     List<ArchiveTreeContract> getArchiveTreeContractListByListOrderByTreeSort(List<Long> nodeIds);
+
+    void deleteByAncestors(Long id, Long projectId);
 }

+ 14 - 63
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java

@@ -49,6 +49,7 @@ import org.springblade.manager.vo.*;
 import org.springblade.manager.mapper.ArchiveTreeContractMapper;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springframework.beans.BeanUtils;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springframework.transaction.annotation.Transactional;
@@ -753,77 +754,21 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 	 * @param id
 	 * @return
 	 */
-//	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) {
+	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();
-
-		// 调用纯Java递归方法,替代CTE/存储过程
-		List<Long> ids = listAllChildIds(id, projectId, tenantId);
-		if (CollectionUtils.isEmpty(ids)) {
+		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 List<Long> listAllChildIds(Long parentId, Long projectId, String tenantId) {
-		// 1. 先校验节点是否存在,避免无效递归
-		Integer exists = baseMapper.checkNodeExists(parentId, projectId, tenantId);
-		if (exists == null || exists == 0) {
-			return Collections.emptyList();
-		}
-
-		// 2. 递归收集所有子节点ID(含自身)
-		List<Long> allChildIds = new ArrayList<>();
-		collectAllChildIds(parentId, projectId, tenantId, allChildIds);
-		return allChildIds;
-	}
-
-	private void collectAllChildIds(Long currentId, Long projectId, String tenantId, List<Long> allChildIds) {
-		// 防止循环引用(如父节点引用子节点)导致死循环
-		if (allChildIds.contains(currentId)) {
-			return;
-		}
-		// 添加当前节点ID
-		allChildIds.add(currentId);
-
-		// 查询当前节点的直接子节点
-		List<Long> directChildIds = baseMapper.listDirectChildIds(currentId, projectId, tenantId);
-		if (CollectionUtils.isEmpty(directChildIds)) {
-			return; // 无直接子节点,递归终止
-		}
-
-		// 递归查询子节点的子节点
-		for (Long childId : directChildIds) {
-			collectAllChildIds(childId, projectId, tenantId, allChildIds);
-		}
-	}
-
 	/**
 	 * 更轻量的删除节点树,同时删除节点下的案卷和文件
 	 * @param id
@@ -857,6 +802,12 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		return baseMapper.getArchiveTreeContractListByListOrderByTreeSort(nodeIds);
 	}
 
+	@Override
+	@Async
+	public void deleteByAncestors(Long id, Long projectId) {
+		baseMapper.deleteByAncestors(id, projectId);
+	}
+
 
 	/**
 	 * 批量更新