数通互联化工云平台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

199 lines
4.7 KiB

<!--
@ 作者: 秦东
@ 时间: 2024-09-12 14:41:53
@ 备注: 获取行政组织数据
-->
<script lang='ts' setup>
import { getgovcont } from '@/api/hr/org/index'
import { orgInfo } from "@/api/hr/org/type";
import { getOrgTreeList } from "@/api/hr/org/index";
const props = defineProps({
orgid:{
type: String,
default:""
}
})
const orgName = ref("")
/* const orgName = computed(()=>{
return str.value
}) */
//let str = ref("")
//选择行政组织
const pickOrgVal = (val:any) => {
if(val != "" && val != null){
if(hasComma(val)){
const interval = setInterval(() => {
// 检查ref对象的值是否为false
if (!orgTreeLoading.value) {
clearInterval(interval);
let str= ''
str = replaceOrgIdWithName(val,orgTreeList.value)
orgName.value = str
}
}, 200);
}else{
getgovcont({id:val*1,idstr:val})
.then(({data}) =>{
// console.log("选择行政组织-3->",data,data.name)
orgName.value = data.name
})
.finally(()=>{})
}
}
}
function removeLastChar(str: string | any[]) {
// 检查输入是否为字符串
if (typeof str !== 'string') {
throw new Error('输入必须是字符串类型');
}
// 处理空字符串情况
if (str.length === 0) {
return str; // 空字符串返回自身
}
// 截取从开始到倒数第二个字符的部分
return str.slice(0, -1);
}
function hasComma(str: any) {
// 检查输入是否为字符串类型
if (typeof str !== 'string') {
return false
}
// 使用indexOf检查是否包含逗号
// 如果存在逗号,返回true;否则返回false
return str.indexOf(',') !== -1;
}
function commaStringToNumberArray(str: string) {
// 检查输入是否为字符串
if (typeof str !== 'string') {
throw new Error('输入必须是字符串');
}
// 处理空字符串的情况
if (str.trim() === '') {
return [];
}
// 按逗号分割字符串,处理可能的空格,并转换为数字
return str.split(',').map(item => {
// 去除前后空格
const trimmed = item.trim();
// 转换为数字
const number = Number(trimmed);
// 检查是否为有效数字
if (isNaN(number)) {
throw new Error(`无法将 "${trimmed}" 转换为有效数字`);
}
return number;
});
}
const orgTreeLoading = ref(true); //加载行政组织树
onBeforeMount(() => {
//pickOrgVal(props.orgid)
getOrgTreeList({ orgid: 309 })
.then(({ data }) => {
// console.log("行政组织树对照值", data);
orgTreeList.value = data;
})
.finally(() => {
orgTreeLoading.value = false;
});
})
/**
* 2. 核心方法:输入ID逗号字符串,返回名称逗号字符串
* @param {string} idStr - 逗号分隔的ID字符串(如 "102,103")
* @returns {string} 逗号分隔的名称字符串(如 "企管部,IT")
*/
function replaceOrgIdWithName(idStr: string,orgTreeData: any) {
// 边界处理:输入为空或非字符串时返回空
if (!idStr || typeof idStr !== "string") {
return "";
}
// 步骤1:构建ID→名称的映射表(高效查找)
const idToNameMap = {};
// 递归遍历所有树形节点,收集ID和名称
function traverseNodes(nodes: any[]) {
// 防止节点为空(如child: null)
if (!nodes || !nodes.length) return;
nodes.forEach((node: { id: string | number; name: any; child: any; }) => {
// 存储当前节点的ID和名称(ID用数字作为key,匹配原始数据类型)
idToNameMap[node.id] = node.name;
// 递归遍历子节点(处理多层级结构)
traverseNodes(node.child);
});
}
// 初始化遍历(从根节点开始)
traverseNodes(orgTreeData);
// 步骤2:解析输入ID,替换为名称
const result = idStr
.split(",") // 分割为ID数组(如 "102,103" → ["102", "103"])
.map(idItem => {
const pureId = idItem.trim(); // 去除空格(兼容 "102, 103" 这类输入)
const idNum = Number(pureId); // 转为数字(匹配原始数据的ID类型)
// 找到名称则返回名称,未找到则保留原始ID(避免丢失无效ID)
return idToNameMap[idNum] || pureId;
})
.join(","); // 重新拼接为字符串
return result;
}
const orgTreeList = ref<orgInfo[]>();
//加载行政组织树
const orgTreeProps = {
children: "child",
label: "name",
}; //行政组织树对照值
onMounted(() => {
pickOrgVal(props.orgid)
});
watch(() =>props.orgid,(val:string) => {
// console.log("选择行政组织-4->",val)
pickOrgVal(val)
})
</script>
<template>
<div>{{ orgName }}</div>
</template>
<style lang='scss' scoped>
</style>