diff --git a/src/components/SimpleProcessDesignerV2/src/nodes/UserTaskNode.vue b/src/components/SimpleProcessDesignerV2/src/nodes/UserTaskNode.vue index 4adae5e4b..24d05f2a0 100644 --- a/src/components/SimpleProcessDesignerV2/src/nodes/UserTaskNode.vue +++ b/src/components/SimpleProcessDesignerV2/src/nodes/UserTaskNode.vue @@ -165,53 +165,57 @@ const nodeClick = () => { const deleteNode = () => { emits('update:flowNode', currentNode.value.childNode) } -// 查找可以驳回用户节点 -const findReturnTaskNodes = ( - matchNodeList: SimpleFlowNode[] // 匹配的节点 -) => { - // 从父节点查找所有用户任务节点 +// 优化后的查找可驳回用户节点函数 +const findReturnTaskNodes = (matchNodeList: SimpleFlowNode[]) => { + // 创建 Set 用于去重,提前初始化以避免重复操作 + const uniqueNodes = new Set() + const currentNodeId = currentNode.value.id + + // 从父节点查找用户任务节点 emits('find:parentNode', matchNodeList, NodeType.USER_TASK_NODE) - // 递归查找当前节点的子节点 - findChildUserTaskNodes(currentNode.value, matchNodeList) - - // 过滤掉当前节点和重复节点 - const currentNodeId = currentNode.value.id - // 使用 Map 来去重,以节点 id 为 key - const uniqueNodes = new Map() + // 先将父节点中的有效节点添加到 Set matchNodeList.forEach(node => { if (node.id !== currentNodeId) { - uniqueNodes.set(node.id, node) + uniqueNodes.add(node) } }) - - // 清空原数组并添加去重后的节点 + + // 查找子节点并直接添加到 Set + findChildUserTaskNodes(currentNode.value, uniqueNodes, currentNodeId) + + // 直接用 Set 的值更新数组 matchNodeList.length = 0 - matchNodeList.push(...Array.from(uniqueNodes.values())) + matchNodeList.push(...uniqueNodes) } -// 递归查找子节点中的用户任务节点 -const findChildUserTaskNodes = (node: SimpleFlowNode, matchNodeList: SimpleFlowNode[]) => { +// 优化后的子节点查找函数 +const findChildUserTaskNodes = ( + node: SimpleFlowNode, + uniqueNodes: Set, + currentNodeId: string +) => { if (!node) return - - // 检查子节点 + + // 处理直接子节点 if (node.childNode) { - if (node.childNode.type === NodeType.USER_TASK_NODE) { - matchNodeList.push(node.childNode) + if (node.childNode.type === NodeType.USER_TASK_NODE && node.childNode.id !== currentNodeId) { + uniqueNodes.add(node.childNode) } - findChildUserTaskNodes(node.childNode, matchNodeList) + findChildUserTaskNodes(node.childNode, uniqueNodes, currentNodeId) } - - // 检查条件分支节点 + + // 处理条件分支节点 if (node.type === NodeType.CONDITION_BRANCH_NODE && node.conditionNodes) { - node.conditionNodes.forEach(conditionNode => { + for (const conditionNode of node.conditionNodes) { if (conditionNode.childNode) { - if (conditionNode.childNode.type === NodeType.USER_TASK_NODE) { - matchNodeList.push(conditionNode.childNode) + if (conditionNode.childNode.type === NodeType.USER_TASK_NODE && + conditionNode.childNode.id !== currentNodeId) { + uniqueNodes.add(conditionNode.childNode) } - findChildUserTaskNodes(conditionNode.childNode, matchNodeList) + findChildUserTaskNodes(conditionNode.childNode, uniqueNodes, currentNodeId) } - }) + } } }