2025-03-06 11:50:32 +08:00
|
|
|
<template>
|
|
|
|
<div>
|
|
|
|
<div>
|
|
|
|
<el-transfer v-model="selectedProjects" :data="allProjects" filterable :titles="['项目列表', '已关联项目']" @change="handleTransferChange" />
|
|
|
|
</div>
|
|
|
|
<div style="text-align: right; margin-top: 20px">
|
|
|
|
<el-button type="primary" @click="$emit('close')">关闭</el-button>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script lang="ts" setup>
|
2025-03-13 15:07:20 +08:00
|
|
|
import { defineProps, onMounted, ref, watch } from 'vue';
|
2025-03-06 11:50:32 +08:00
|
|
|
import { listProject } from '@/api/project/project';
|
2025-03-13 15:07:20 +08:00
|
|
|
import { addNewProjectRelevancy, listUserProjects, removeNewProjectRelevancy } from '@/api/project/projectRelevancy';
|
|
|
|
import { ProjectRelevancyVO } from '@/api/project/projectRelevancy/types';
|
2025-03-06 11:50:32 +08:00
|
|
|
|
|
|
|
// **从父组件接收 `userId`**
|
2025-03-13 15:07:20 +08:00
|
|
|
const props = defineProps<{ userId: number | string }>();
|
2025-03-06 11:50:32 +08:00
|
|
|
|
|
|
|
// **所有项目列表**
|
2025-03-13 15:07:20 +08:00
|
|
|
const allProjects = ref<{ key: number | string; label: string }[]>([]);
|
2025-03-06 11:50:32 +08:00
|
|
|
|
|
|
|
// **已关联的项目 ID 列表**
|
2025-03-18 09:59:59 +08:00
|
|
|
const selectedProjects = ref<(number | string)[]>([]);
|
2025-03-06 11:50:32 +08:00
|
|
|
|
|
|
|
// **获取所有项目列表**
|
|
|
|
const getProjectList = async () => {
|
|
|
|
try {
|
|
|
|
const res = await listProject();
|
2025-03-18 09:59:59 +08:00
|
|
|
allProjects.value = res.rows.map((project) => ({
|
2025-03-06 11:50:32 +08:00
|
|
|
key: project.id,
|
|
|
|
label: project.projectName
|
|
|
|
}));
|
|
|
|
} catch (error) {
|
|
|
|
console.error('获取项目列表失败:', error);
|
|
|
|
}
|
|
|
|
};
|
2025-03-18 09:59:59 +08:00
|
|
|
const getUserProjects = async (s: string = '') => {
|
2025-03-06 11:50:32 +08:00
|
|
|
if (!props.userId) return;
|
|
|
|
try {
|
|
|
|
const res = await listUserProjects({ userId: props.userId });
|
2025-03-18 09:59:59 +08:00
|
|
|
selectedProjects.value = Array.isArray(res.rows) ? res.rows.map((item: ProjectRelevancyVO) => item.projectId) : [];s
|
2025-03-06 11:50:32 +08:00
|
|
|
} catch (error) {
|
|
|
|
console.error('获取用户关联的项目失败:', error);
|
2025-03-07 09:07:42 +08:00
|
|
|
selectedProjects.value = []; // 请求失败时清空列表
|
2025-03-06 11:50:32 +08:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
// **监听 `userId` 变化,重新加载关联数据**
|
|
|
|
watch(
|
|
|
|
() => props.userId,
|
|
|
|
async (newUserId) => {
|
|
|
|
if (newUserId) {
|
|
|
|
await getUserProjects();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{ immediate: true }
|
|
|
|
);
|
|
|
|
|
|
|
|
// **处理穿梭框变更**
|
2025-03-13 15:07:20 +08:00
|
|
|
const handleTransferChange = async (_: number[], direction: 'left' | 'right', movedKeys: number[]) => {
|
2025-03-06 11:50:32 +08:00
|
|
|
try {
|
|
|
|
if (direction === 'right') {
|
|
|
|
// **添加关联**
|
|
|
|
await addNewProjectRelevancy({
|
|
|
|
userId: props.userId,
|
|
|
|
projectIdList: movedKeys
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
// **移除关联**
|
|
|
|
await removeNewProjectRelevancy({
|
|
|
|
userId: props.userId,
|
|
|
|
projectIdList: movedKeys
|
|
|
|
});
|
|
|
|
}
|
|
|
|
} catch (error) {
|
|
|
|
console.error('更新项目关联失败:', error);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
// **初始化数据**
|
|
|
|
onMounted(async () => {
|
|
|
|
await getProjectList();
|
|
|
|
});
|
|
|
|
</script>
|