diff --git a/src/components/DesignForm/formControlPropertiNew.vue b/src/components/DesignForm/formControlPropertiNew.vue index 33e6f9d..bf00691 100644 --- a/src/components/DesignForm/formControlPropertiNew.vue +++ b/src/components/DesignForm/formControlPropertiNew.vue @@ -2135,7 +2135,7 @@ watch( i--; // 如果不减,将漏掉一个元素 } } - console.log(resDataForGlxxszExceptself1); + //console.log(resDataForGlxxszExceptself1); if ( getAssociatedFormsCurrentFieldTreeData && getAssociatedFormsCurrentFieldTreeData.treeAttrs && diff --git a/src/components/DesignForm/public/expand/rangedUserTree.vue b/src/components/DesignForm/public/expand/rangedUserTree.vue index 1b5e4bf..9da571f 100644 --- a/src/components/DesignForm/public/expand/rangedUserTree.vue +++ b/src/components/DesignForm/public/expand/rangedUserTree.vue @@ -24,6 +24,8 @@ const emits = defineEmits<{ const value = ref([]) const treeData = ref([]) // 存储懒加载的数据 const isDataLoaded = ref(false) // 标记数据是否已加载 +const loading = ref(false) // 是否正在加载 +const treeSelectRef = ref() // 树选择器引用 watch(value, (newValue) => { if (newValue.length > 0) { @@ -64,27 +66,34 @@ onBeforeMount(() => { const loadFullData = async () => { if (isDataLoaded.value) return treeData.value; + loading.value = true; + try { - const result = checkorgAndManTree1(); + // 模拟数据加载过程 + await new Promise(resolve => setTimeout(resolve, 800)); + + const result = await checkorgAndManTree1(); treeData.value = result; isDataLoaded.value = true; return result; } catch (error) { console.error('加载组织数据失败:', error); return []; + } finally { + loading.value = false; } } // 点击树选择器时的处理 const handleTreeSelectClick = async () => { - if (!isDataLoaded.value) { + if (!isDataLoaded.value && !loading.value) { await loadFullData(); } } // 下拉框显示状态变化时的处理 const handleVisibleChange = async (visible: boolean) => { - if (visible && !isDataLoaded.value) { + if (visible && !isDataLoaded.value && !loading.value) { await loadFullData(); } } @@ -94,27 +103,29 @@ const resData = computed(() => { }) function checkorgAndManTree1() { - let result = [] - let i = 0 - props.orgAndManTree.forEach((element: any) => { - if (element.hasOwnProperty('tree') && hasNodesInTree(element.tree)) { - i++ - } - }); - - if (i == props.orgAndManTree.length) { - props.orgAndManTree.forEach((item: any) => { - if (props.data.name == item.name) { - //console.log(item.tree) - result = item.tree + return new Promise((resolve) => { + const check = () => { + let result = [] + let i = 0 + props.orgAndManTree.forEach((element: any) => { + if (element.hasOwnProperty('tree') && hasNodesInTree(element.tree)) { + i++ + } + }); + if (i == props.orgAndManTree.length) { + props.orgAndManTree.forEach((item: any) => { + if (props.data.name == item.name) { + console.log(item.tree) + result = item.tree + } + }); + resolve(result) + } else { + setTimeout(check, 100) } - }); - return result - } else { - setTimeout(() => { - checkorgAndManTree1() - }, 100) - } + } + check() + }) } /** @@ -148,24 +159,77 @@ function hasNodesInTree(tree) { - + diff --git a/src/components/DesignForm/public/form/form.vue b/src/components/DesignForm/public/form/form.vue index f8cd77a..919cd11 100644 --- a/src/components/DesignForm/public/form/form.vue +++ b/src/components/DesignForm/public/form/form.vue @@ -1732,17 +1732,18 @@ function getTree1() { orgAndManTree.value = data }).finally(()=>{ - console.log(rangedUsers) + //console.log(rangedUsers) // 使用示例 const configArray = rangedUsers; const groupedNames = groupExpandUserConfigs(configArray); - console.log(groupedNames); + //console.log(groupedNames); groupedNames.forEach((element:any) => { let keys = element.keys let arr = [] arr.push(modifyTreeData(orgAndManTree.value,keys)) element.tree = arr + console.log(arr) rangedUsers.forEach((item:any) => { let i = 0 @@ -1759,17 +1760,26 @@ function getTree1() { rangedUserTrees1.value = rangedUsers }) } - - - - - - function modifyTreeData(treeData, idList) { - console.log("modifyTreeDataMinimal 执行了"); - + //console.log("modifyTreeDataMinimal 执行了"); + let gkFlag = true const idArray = Array.isArray(idList) ? idList : [idList]; - if (idArray.length === 0 || !treeData) { + + // 当 gkFlag 为 true 且 idList 为空时,查找特定节点作为新的 treeData + if (gkFlag && idArray.length === 0) { + const targetNode = findTargetNode(treeData); + if (targetNode) { + // 使用找到的节点作为新的 treeData + treeData = targetNode; + } + } + + // 当 idList 为空时,使用相同的处理逻辑,但保持所有节点 + if (idArray.length === 0) { + return processTreeWithAllNodes(treeData); + } + + if (!treeData) { return Array.isArray(treeData) ? [] : null; } @@ -1786,13 +1796,16 @@ function modifyTreeData(treeData, idList) { const node = stack.pop(); if (!node?.id) continue; - nodeMap.set(node.id, node); - - if (node.children) { - for (const child of node.children) { - if (child?.id) { - parentMap.set(child.id, node.id); - stack.push(child); + // 如果节点ID已存在,跳过重复节点 + if (!nodeMap.has(node.id)) { + nodeMap.set(node.id, node); + + if (node.children) { + for (const child of node.children) { + if (child?.id) { + parentMap.set(child.id, node.id); + stack.push(child); + } } } } @@ -1831,6 +1844,29 @@ function modifyTreeData(treeData, idList) { return Array.isArray(treeData) ? result : result[0] || null; } +// 辅助函数:查找特定条件的节点 +function findTargetNode(treeData) { + if (!treeData) return null; + + const stack = Array.isArray(treeData) ? [...treeData] : [treeData]; + + while (stack.length > 0) { + const node = stack.pop(); + + // 检查节点是否符合条件 + if (node.id === "309" && node.label === "山东恒信高科能源有限公司") { + return node; + } + + // 继续遍历子节点 + if (node.children && node.children.length > 0) { + stack.push(...node.children); + } + } + + return null; +} + // 辅助函数:递归构建节点树 function buildNodeTree(node, keepIds, idArray, processedIds) { const newNode = { @@ -1848,9 +1884,11 @@ function buildNodeTree(node, keepIds, idArray, processedIds) { // 处理子节点 if (node.children && node.children.length > 0) { const children = []; + const childProcessedIds = new Set(); // 用于子节点的去重 + for (const child of node.children) { - if (child?.id && keepIds.has(child.id) && !processedIds.has(child.id)) { - processedIds.add(child.id); + if (child?.id && keepIds.has(child.id) && !childProcessedIds.has(child.id)) { + childProcessedIds.add(child.id); children.push(buildNodeTree(child, keepIds, idArray, processedIds)); } } @@ -1862,8 +1900,84 @@ function buildNodeTree(node, keepIds, idArray, processedIds) { return newNode; } +// 当 idList 为空时处理树数据,使用与不为空时相同的格式化逻辑 +function processTreeWithAllNodes(treeData) { + if (!treeData) { + return Array.isArray(treeData) ? [] : null; + } + + const roots = Array.isArray(treeData) ? treeData : [treeData]; + + // 构建结果树 - 使用与不为空时相同的逻辑,但应用到所有节点 + const result = []; + const processedIds = new Set(); + + // 处理所有根节点 + for (const root of roots) { + if (!root?.id || processedIds.has(root.id)) { + continue; + } + + processedIds.add(root.id); + // 使用相同的格式化逻辑,但应用到所有节点,并过滤没有用户的组织节点 + const formattedNode = formatAllNodes(root, processedIds); + if (formattedNode) { + result.push(formattedNode); + } + } + + // 清理临时数据 + processedIds.clear(); + + return Array.isArray(treeData) ? result : result[0] || null; +} - +// 递归格式化所有节点,保持与非空时相同的格式,并过滤没有用户的组织节点 +function formatAllNodes(node, processedIds) { + // 判断是否为组织节点(ID长度小于5) + const isOrganization = node.id && node.id.length < 5; + + // 处理子节点 + let children = []; + const childProcessedIds = new Set(); + + if (node.children && node.children.length > 0) { + for (const child of node.children) { + if (child?.id && !childProcessedIds.has(child.id)) { + childProcessedIds.add(child.id); + const formattedChild = formatAllNodes(child, processedIds); + if (formattedChild) { + children.push(formattedChild); + } + } + } + } + + // 如果是组织节点且没有用户子节点,则过滤掉 + if (isOrganization && children.length === 0) { + return null; + } + + // 对所有节点应用相同的格式化逻辑 + const newNode = { + id: node.id, + label: node.label, + value: node.value + }; + + // 对所有节点应用相同的标签格式化 + if (node.value !== null && node.value !== undefined) { + newNode.label = `${node.label}(${node.value})`; + newNode.number = newNode.label; + } + + // 如果有子节点,添加子节点 + if (children.length > 0) { + newNode.children = children; + } + + return newNode; +} function groupExpandUserConfigs(configs) { // 用于存储分组结果的Map @@ -2023,7 +2137,7 @@ const resetFields = () => { function checkAndGetTree(){ - console.log("checkAndGetTree") + //console.log("checkAndGetTree") if(rangedUsers.length>0){ getTree1(); }else{