|
|
|
|
<!--
|
|
|
|
|
@ 作者: 秦东
|
|
|
|
|
@ 时间: 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>
|