Browse Source

选择用户性能优化

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

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

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

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

@ -1718,7 +1718,7 @@ watch(
// ------------------------------------------------
const rangedUserTrees1= ref([]);
const treeUrl = '/javasys/lowCode/transfer/getOrgAndManTree'
const orgAndManTree = ref()
function getOrgAndManTree() {
@ -1731,21 +1731,205 @@ function getTree1() {
getOrgAndManTree().then(({ 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 rangedUsers: any[] = [];
const rangedUsers :any= [];
const tables: any[] = [];
function getAsfs() {
setTimeout(() => {
/* setTimeout(() => { */
if(props.formData.list&&props.formData.list.length>0){
//alert(1)
let dataList = ref({});
dataList.value = props.formData.list;
if (dataList && Array.isArray(dataList.value) && dataList.value.length > 0) {
for (let i = 0; i < dataList.value.length; i++) {
if (dataList.value[i].type == "associatedForms") {
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(){
console.log("checkAndGetTree")
if(rangedUsers.length>0){
getTree1();
}else{
@ -1844,14 +2035,15 @@ function checkAndGetTree(){
onMounted(() => {
//alert(1)
getAsfs();
// console.log("--->",props.formData)
getInitModel();
nextTick(() => {
appendRemoveStyle(true);
});
showOrHide("kong");
getAsfs();
checkAndGetTree();
});
onUnmounted(() => {
@ -2301,7 +2493,7 @@ const webPage = computed({
:node-key="nodeKey"
:purview="purview"
@optionsValue3Get2="optionsValue3Get2"
:org-and-man-tree="orgAndManTree"
:org-and-man-tree="rangedUserTrees1"
/>
<slot></slot>

Loading…
Cancel
Save