Browse Source

选择用户,由下拉多选改为树多选,可过滤

lwx_v12
liwenxuan 1 month ago
parent
commit
ec1a3c05c3
  1. 374
      src/components/lowCode/assistant/rangedUserTree.vue
  2. 2
      src/components/lowCode/newFormItem.vue

374
src/components/lowCode/assistant/rangedUserTree.vue

@ -0,0 +1,374 @@
<script lang='ts' setup>
import { criteriaForPeopleList } from '@/api/hr/org/type'
import SvgIcon from '@/components/svgIcon/index.vue'
import { useAttrs,computed, onMounted, nextTick,ref,watch,onBeforeMount} from 'vue'
import request from '@/utils/axios/index'
const attrs = useAttrs()
const props = withDefaults(
defineProps<{
modelValue?: string
disabled?: boolean
types?:number
control?:any
}>(),
{}
)
interface User {
id: number
name: string
number: string
key: string
icon: string
department: string
role: string
label: string
value: string
}
const emits = defineEmits<{
(e: 'update:modelValue', value: string): void
}>()
const value = ref([])
const loading = ref(true)
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 })
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(() => {
getManConts()
getTree()
setTimeout(()=>{
value.value = parseStringToArray(props.modelValue)
},500 )
})
const url = "/javasys/lowCode/manCont/getManContsByKeys"
//console.log(attrs.value)
const keys = computed(()=>{
if(attrs.queryBy == 'role'){
return attrs.roleRange
}else{
return attrs.orgRange
}
})
function getManContsByKeys() {
//console.log(11111)
return request({
url: url,
method: "post",
data: {
keys: keys.value,
},
});
}
const options = ref([])
function getManConts(){
getManContsByKeys().then(({data})=>{
data.forEach((element: any) => {
element.icon = element.name+"("+element.number+")"
element.deparment = ""+element.deparment+">"+element.icon
element.label = element.deparment
element.value = element.icon
});
options.value = data
//console.log(options.value)
})
}
/**
@ 作者: 秦东
@ 时间: 2025-06-10 11:13:06
@ 功能: 输出结果
*/
const valPrint = (val:any) => {
if(Array.isArray(val)){
return val.join("、")
}
}
let resData = ref([])
const userList = computed({
get() {
return [{
id: '全选',
label: '全选',
children: [...resData.value]
}]
},
set() {
}
})
/**
* 根据列表数据过滤树形数据保留value值在列表number中匹配的节点及其祖先
* @param {Array} treeData - 树形数据
* @param {Array} listData - 列表数据
* @returns {Array} 过滤后的树形数据
*/
function filterTreeByList(treeData: string | any[], listData: any[]) {
// number
const numberSet = new Set();
listData.forEach((item: { number: unknown; }) => {
numberSet.add(item.number);
});
// 访
const visitedNodes = new Set();
//
function processNode(node: { id: any; value: unknown; children: string | any[] | null; }) {
// 使id
const nodeId = node.id;
if (visitedNodes.has(nodeId)) {
return false; // 访false
}
// 访
visitedNodes.add(nodeId);
//
const isDirectMatch = node.value && numberSet.has(node.value);
// childrennull
if (!node.children || node.children === null) {
return isDirectMatch;
}
//
const childrenToKeep = [];
//
for (let i = 0; i < node.children.length; i++) {
const child = node.children[i];
//
if (processNode(child)) {
// childrenToKeep
childrenToKeep.push(child);
}
}
// children
node.children = childrenToKeep;
//
return isDirectMatch || childrenToKeep.length > 0;
}
//
const result = [];
for (let i = 0; i < treeData.length; i++) {
//
const nodeCopy = JSON.parse(JSON.stringify(treeData[i]));
if (processNode(nodeCopy)) {
result.push(nodeCopy);
}
}
return result;
}
/**
* a 类型员工数据映射到树形结构中为匹配的节点添加 numberroledeparmentempType 属性
* @param {Array} employees - a 类型员工数组每个元素包含 number, name, role, deparment, empType, key 等字段
* @param {Array} treeData - 树形结构数据可能包含嵌套的 children
* @returns {Array} - 更新后的树形结构
*/
function enrichTreeWithEmployeeInfo(employees: any[], treeData: string | any[]) {
// value key 便
const employeeMap = new Map();
employees.forEach((emp: { number: any; }) => {
employeeMap.set(emp.number, emp); // value a number
});
//
function traverse(nodes: any[]) {
if (!Array.isArray(nodes)) return;
nodes.forEach(node => {
// value
if (node.value !== null && node.value !== undefined) {
const emp = employeeMap.get(node.value);
if (emp) {
// a
node.label = node.label + "(" + emp.number + ")";
node.number = node.label
node.role = emp.role;
node.deparment = emp.deparment;
node.empType = emp.empType;
// namekey
// node.name = emp.name;
// node.key = emp.key;
}
}
//
if (Array.isArray(node.children)) {
traverse(node.children);
}
});
}
// ""
if (treeData && treeData.length > 0) {
traverse(treeData);
}
return treeData;
}
function processTreeData(node: any) {
// id4
function hasLongIdNode(node: { id: string | any[]; children: string | any[]; }) {
// id
if (node.id && node.id.length > 4) {
return true;
}
// childrennull
if (node.children && Array.isArray(node.children) && node.children.length > 0) {
for (const child of node.children) {
if (hasLongIdNode(child)) {
return true;
}
}
}
return false;
}
//
function processNode(node: any) {
// id
if (!hasLongIdNode(node)) {
return null;
}
//
const newNode = { ...node };
//
if (newNode.children && Array.isArray(newNode.children) && newNode.children.length > 0) {
//
newNode.children = newNode.children
.map((child: any) => processNode(child))
.filter((child: null) => child !== null);
// childrennull
if (newNode.children.length === 0) {
newNode.children = null;
}
}
return newNode;
}
return processNode(node);
}
function getTree() {
getOrgAndManTree().then(({ data }) => {
let data1 = processTreeData(data)
//console.log(data1)
let data2 = filterTreeByList(data1.children, options.value)
//console.log(data2)
data1.children = data2
//console.log(resData.value)
//console.log(`穿`);
resData.value = data1.children
userList.value = [{
id: '全选',
label: '全选',
children: [...resData.value]
}]
enrichTreeWithEmployeeInfo(options.value, userList.value)
loading.value = false
})
}
const treeUrl = '/javasys/lowCode/transfer/getOrgAndManTree'
function getOrgAndManTree() {
return request({
url: treeUrl,
method: 'post',
});
}
</script>
<template>
<div></div>
<el-tree-select v-if="props.types!=3" node-key="number" v-model="value" :data="userList" multiple :render-after-expand="false"
show-checkbox clearable collapse-tags collapse-tags-tooltip :max-collapse-tags="1" filterable />
<el-text v-else class="wordColor">{{valPrint(value)}}</el-text>
</template>
<style lang='scss' scoped>
.wordColor{
color:#000000;
}
</style>

2
src/components/lowCode/newFormItem.vue

@ -41,7 +41,7 @@ import ColorPickerPage from '@/components/lowCode/assistant/colorPickerPage.vue'
import TreeSelectPage from '@/components/lowCode/assistant/treeSelectPage.vue'
import AssociatedForms from '@/components/lowCode/assistant/associatedForms.vue'
import SerialNumber from '@/components/lowCode/assistant/serialNumber.vue'
import ExpandUser from '@/components/lowCode/assistant/rangedUser.vue'
import ExpandUser from '@/components/lowCode/assistant/rangedUserTree.vue'
import OrgCentent from '@/components/lowCode/assistant/org.vue'
import FounderForm from '@/components/lowCode/assistant/founder.vue'
import FounderTime from '@/components/lowCode/assistant/founderTime.vue'

Loading…
Cancel
Save