Browse Source

选择用户性能优化

lwx_v27
liwenxuan 4 weeks ago
parent
commit
3d77e61597
  1. 240
      src/components/DesignForm/public/expand/rangedUserTree.vue
  2. 206
      src/components/DesignForm/public/form/form.vue

240
src/components/DesignForm/public/expand/rangedUserTree.vue

@ -10,6 +10,7 @@ const props = withDefaults(
modelValue?: string modelValue?: string
disabled?: boolean disabled?: boolean
orgAndManTree?: any; orgAndManTree?: any;
data?: any;
}>(), }>(),
{} {}
) )
@ -19,239 +20,152 @@ const emits = defineEmits<{
(e: 'update:modelValue', value: string): void (e: 'update:modelValue', value: string): void
}>() }>()
const value = ref([]) const value = ref([])
const treeData = ref([]) //
const isDataLoaded = ref(false) //
watch(value, (newValue) => { watch(value, (newValue) => {
if (newValue.length > 0) { if (newValue.length > 0) {
let str = "" let str = ""
let userAry = new Array let userAry = new Array
newValue.forEach(item => { newValue.forEach(item => {
//console.log(item)
userAry.push(item) userAry.push(item)
}) })
str = userAry.join(',') str = userAry.join(',')
//console.log(str)
emits('update:modelValue', str) emits('update:modelValue', str)
// userlist.value = userAry.join(',')
//
} else { } else {
let str = "" let str = ""
//console.log(str)
emits('update:modelValue', str) emits('update:modelValue', str)
} }
}, { deep: true }) }, { deep: true })
function parseStringToArray(str: string) { function parseStringToArray(str: string) {
try { try {
// JSON
const result = JSON.parse(str); const result = JSON.parse(str);
//
if (Array.isArray(result)) { if (Array.isArray(result)) {
return result; return result;
} else { } else {
//console.error("");
return []; return [];
} }
} catch (error) { } catch (error) {
//console.error("", error.message);
return []; return [];
} }
} }
onBeforeMount(() => { onBeforeMount(() => {
checkorgAndManTree()
setTimeout(() => { setTimeout(() => {
value.value = parseStringToArray(props.modelValue) value.value = parseStringToArray(props.modelValue)
}, 500) }, 500)
}) })
//
const loadFullData = async () => {
if (isDataLoaded.value) return treeData.value;
try {
const keys = computed(()=>{ const result = checkorgAndManTree1();
if(attrs.queryBy == 'role'){ treeData.value = result;
return attrs.roleRange isDataLoaded.value = true;
}else{ return result;
return attrs.orgRange } catch (error) {
} console.error('加载组织数据失败:', error);
}) return [];
const resData = ref()
const checkorgAndManTree = (()=>{
if(props.orgAndManTree&&props.orgAndManTree.children&&props.orgAndManTree.children.length>0){
//alert(1)
let arr = []
arr.push(modifyTreeData(props.orgAndManTree,keys.value))
resData.value = arr
}else{
setTimeout(()=>{
checkorgAndManTree()
},100)
} }
})
onUnmounted(()=>{
alert(1)
})
function modifyTreeData(treeData, idList) {
console.log("modifyTreeData 执行了")
//
const newTreeData = JSON.parse(JSON.stringify(treeData));
// idList
const idArray = Array.isArray(idList) ? idList : [idList];
if (idArray.length === 0) return Array.isArray(newTreeData) ? [] : null;
// 1. ididid
const nodeMap = new Map(); // id
const parentMap = new Map(); // id id
const multiParentIds = new Set(); // id
function collectNodes(node, parentId) {
if (!node || typeof node !== 'object' || !node.id) return; //
//
if (!nodeMap.has(node.id)) {
nodeMap.set(node.id, node);
} }
// //
if (parentMap.has(node.id)) { const handleTreeSelectClick = async () => {
// if (!isDataLoaded.value) {
if (parentMap.get(node.id) !== parentId) { await loadFullData();
multiParentIds.add(node.id);
} }
} else {
parentMap.set(node.id, parentId); //
} }
// idid //
if (node.children && Array.isArray(node.children)) { const handleVisibleChange = async (visible: boolean) => {
node.children.forEach(child => collectNodes(child, node.id)); if (visible && !isDataLoaded.value) {
await loadFullData();
} }
} }
// const resData = computed(() => {
if (Array.isArray(newTreeData)) { return treeData.value;
newTreeData.forEach(root => collectNodes(root, null)); // idnull })
} else {
collectNodes(newTreeData, null);
}
//
if (multiParentIds.size > 0) {
console.warn(`以下节点存在多个父节点,可能导致重复:${Array.from(multiParentIds).join(', ')}`);
}
// 2. ID+parentMap function checkorgAndManTree1() {
const keepIds = new Set(); let result = []
idArray.forEach(targetId => { let i = 0
let currentId = targetId; props.orgAndManTree.forEach((element: any) => {
// parentIdnull if (element.hasOwnProperty('tree') && hasNodesInTree(element.tree)) {
while (currentId !== null && nodeMap.has(currentId)) { i++
keepIds.add(currentId);
currentId = parentMap.get(currentId); //
} }
}); });
// 3. keepIdsparentId if (i == props.orgAndManTree.length) {
function filterTree(node) { props.orgAndManTree.forEach((item: any) => {
if (!node || typeof node !== 'object' || !keepIds.has(node.id)) { if (props.data.name == item.name) {
return null; console.log(item.tree)
} result = item.tree
//
const filteredNode = { ...node };
// keepIdsparentIdid
if (filteredNode.children && Array.isArray(filteredNode.children)) {
//
const validChildren = new Map(); // id
filteredNode.children.forEach(child => {
// keepIdsidid
if (child && typeof child === 'object' && child.id &&
keepIds.has(child.id) && parentMap.get(child.id) === filteredNode.id) {
const filteredChild = filterTree(child);
if (filteredChild) {
validChildren.set(filteredChild.id, filteredChild); // id
}
} }
}); });
return result
// null
filteredNode.children = Array.from(validChildren.values());
if (filteredNode.children.length === 0) {
filteredNode.children = null;
}
} else { } else {
filteredNode.children = null; setTimeout(() => {
checkorgAndManTree1()
}, 100)
}
} }
return filteredNode; /**
* 判断树形结构是否存在节点
*/
function hasNodesInTree(tree) {
if (!Array.isArray(tree)) {
return false;
} }
// function checkNode(node) {
let filteredTree; if (node == null) {
if (Array.isArray(newTreeData)) { return false;
// keepIdsnull
filteredTree = newTreeData
.map(root => {
if (root && keepIds.has(root.id) && parentMap.get(root.id) === null) {
return filterTree(root);
} }
return null; return true;
})
.filter(Boolean);
} else {
filteredTree = (keepIds.has(newTreeData.id) && parentMap.get(newTreeData.id) === null)
? filterTree(newTreeData)
: null;
} }
// 4. labelnumber for (const node of tree) {
function modifyLabels(node) { if (checkNode(node)) {
if (!node || typeof node !== 'object') return; return true;
if (idArray.includes(node.id)) {
const newLabel = `${node.label}(${node.value || ''})`;
node.label = newLabel;
node.number = newLabel;
} }
if (Array.isArray(node?.children) && hasNodesInTree(node.children)) {
if (node.children && Array.isArray(node.children)) { return true;
node.children.forEach(child => modifyLabels(child));
} }
} }
// return false;
if (Array.isArray(filteredTree)) {
filteredTree.forEach(root => modifyLabels(root));
} else {
modifyLabels(filteredTree);
} }
return filteredTree;
}
</script> </script>
<template> <template>
<div style="width:100%"> <div style="width:100%">
<el-tree-select node-key="number" v-model="value" :data="resData" multiple :render-after-expand="false" <el-tree-select
show-checkbox clearable collapse-tags collapse-tags-tooltip :max-collapse-tags="4" filterable /> node-key="number"
v-model="value"
:data="resData"
multiple
:render-after-expand="false"
show-checkbox
clearable
collapse-tags
collapse-tags-tooltip
:max-collapse-tags="4"
filterable
@click="handleTreeSelectClick"
@visible-change="handleVisibleChange"
:disabled="props.disabled"
:popper-append-to-body="false"
/>
</div> </div>
</template> </template>
<style lang='scss' scoped></style> <style lang='scss' scoped></style>

206
src/components/DesignForm/public/form/form.vue

@ -1718,7 +1718,7 @@ watch(
// ------------------------------------------------ // ------------------------------------------------
const rangedUserTrees1= ref([]);
const treeUrl = '/javasys/lowCode/transfer/getOrgAndManTree' const treeUrl = '/javasys/lowCode/transfer/getOrgAndManTree'
const orgAndManTree = ref() const orgAndManTree = ref()
function getOrgAndManTree() { function getOrgAndManTree() {
@ -1731,21 +1731,205 @@ function getTree1() {
getOrgAndManTree().then(({ data }) => { getOrgAndManTree().then(({ data }) => {
orgAndManTree.value = data orgAndManTree.value = data
}).finally(()=>{
console.log(rangedUsers)
// 使
const configArray = rangedUsers;
const groupedNames = groupExpandUserConfigs(configArray);
console.log(groupedNames);
groupedNames.forEach((element:any) => {
let keys = element.keys
let arr = []
arr.push(modifyTreeData(orgAndManTree.value,keys))
element.tree = arr
rangedUsers.forEach((item:any) => {
let i = 0
element.groupArray.forEach((el:any) => {
if(item.name==el){
i++
}
});
if(i>0){
item.tree = element.tree
}
});
});
rangedUserTrees1.value = rangedUsers
}) })
} }
function modifyTreeData(treeData, idList) {
console.log("modifyTreeDataMinimal 执行了");
const idArray = Array.isArray(idList) ? idList : [idList];
if (idArray.length === 0 || !treeData) {
return Array.isArray(treeData) ? [] : null;
}
const roots = Array.isArray(treeData) ? treeData : [treeData];
//
const nodeMap = new Map();
const parentMap = new Map();
// 使
const stack = [...roots];
while (stack.length > 0) {
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);
}
}
}
}
//
const keepIds = new Set();
for (const id of idArray) {
let currentId = id;
while (currentId && nodeMap.has(currentId)) {
keepIds.add(currentId);
currentId = parentMap.get(currentId);
}
}
// -
const result = [];
const processedIds = new Set(); // ID
//
for (const root of roots) {
if (!root?.id || !keepIds.has(root.id) || processedIds.has(root.id)) {
continue;
}
processedIds.add(root.id);
result.push(buildNodeTree(root, keepIds, idArray, processedIds));
}
//
nodeMap.clear();
parentMap.clear();
keepIds.clear();
processedIds.clear();
return Array.isArray(treeData) ? result : result[0] || null;
}
//
function buildNodeTree(node, keepIds, idArray, processedIds) {
const newNode = {
id: node.id,
label: node.label,
value: node.value
};
//
if (idArray.includes(node.id)) {
newNode.label = `${node.label}(${node.value || ''})`;
newNode.number = newNode.label;
}
//
if (node.children && node.children.length > 0) {
const children = [];
for (const child of node.children) {
if (child?.id && keepIds.has(child.id) && !processedIds.has(child.id)) {
processedIds.add(child.id);
children.push(buildNodeTree(child, keepIds, idArray, processedIds));
}
}
if (children.length > 0) {
newNode.children = children;
}
}
return newNode;
}
function groupExpandUserConfigs(configs) {
// Map
// keyvaluenameskeys
const groupMap = new Map();
configs.forEach(config => {
// queryBy使
let range, rangeType;
if (config.control.queryBy === 'org') {
range = config.control.orgRange;
rangeType = 'orgRange';
} else {
range = config.control.roleRange;
rangeType = 'roleRange';
}
// key
const sortedRange = [...range].sort().join(',');
// key
if (!groupMap.has(sortedRange)) {
groupMap.set(sortedRange, {
names: [],
keys: range, // keys
rangeType: rangeType
});
}
// name
groupMap.get(sortedRange).names.push(config.name);
});
// Map
const result = [];
for (const groupInfo of groupMap.values()) {
result.push({
groupArray: groupInfo.names,
keys: groupInfo.keys,
rangeType: groupInfo.rangeType //
});
}
return result;
}
const asfs: any[] = []; const asfs: any[] = [];
const rangedUsers: any[] = []; const rangedUsers :any= [];
const tables: any[] = []; const tables: any[] = [];
function getAsfs() { function getAsfs() {
setTimeout(() => { /* setTimeout(() => { */
if(props.formData.list&&props.formData.list.length>0){
//alert(1)
let dataList = ref({}); let dataList = ref({});
dataList.value = props.formData.list; dataList.value = props.formData.list;
if (dataList && Array.isArray(dataList.value) && dataList.value.length > 0) { if (dataList && Array.isArray(dataList.value) && dataList.value.length > 0) {
for (let i = 0; i < dataList.value.length; i++) { for (let i = 0; i < dataList.value.length; i++) {
if (dataList.value[i].type == "associatedForms") { if (dataList.value[i].type == "associatedForms") {
asfs.push(dataList.value[i]); asfs.push(dataList.value[i]);
@ -1818,8 +2002,14 @@ function getAsfs() {
} }
} }
} }
checkAndGetTree()
} }
}, 500); }else{
setTimeout(()=>{
getAsfs()
},100)
}
/* }, 500); */
} }
// //
@ -1830,6 +2020,7 @@ const resetFields = () => {
function checkAndGetTree(){ function checkAndGetTree(){
console.log("checkAndGetTree")
if(rangedUsers.length>0){ if(rangedUsers.length>0){
getTree1(); getTree1();
}else{ }else{
@ -1844,14 +2035,15 @@ function checkAndGetTree(){
onMounted(() => { onMounted(() => {
//alert(1)
getAsfs();
// console.log("--->",props.formData) // console.log("--->",props.formData)
getInitModel(); getInitModel();
nextTick(() => { nextTick(() => {
appendRemoveStyle(true); appendRemoveStyle(true);
}); });
showOrHide("kong"); showOrHide("kong");
getAsfs();
checkAndGetTree();
}); });
onUnmounted(() => { onUnmounted(() => {
@ -2301,7 +2493,7 @@ const webPage = computed({
:node-key="nodeKey" :node-key="nodeKey"
:purview="purview" :purview="purview"
@optionsValue3Get2="optionsValue3Get2" @optionsValue3Get2="optionsValue3Get2"
:org-and-man-tree="orgAndManTree" :org-and-man-tree="rangedUserTrees1"
/> />
<slot></slot> <slot></slot>

Loading…
Cancel
Save