From 802fc7c75edc83f1941eeadaeaf82145f20f1ed8 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 30 Mar 2026 10:29:01 +0800 Subject: [PATCH] fix: restore dual-role department switching --- frontend/src/views/CreateTask.vue | 3 +- frontend/src/views/TaskHall.vue | 61 ++++++++++++++++++++++++++----- 2 files changed, 54 insertions(+), 10 deletions(-) diff --git a/frontend/src/views/CreateTask.vue b/frontend/src/views/CreateTask.vue index 9b950f5..0e74993 100644 --- a/frontend/src/views/CreateTask.vue +++ b/frontend/src/views/CreateTask.vue @@ -2640,7 +2640,8 @@ onMounted(async () => { try { await authStore.fetchUserInfo() console.log('用户信息已刷新:', authStore.userInfo) - initializePublishingDept() + const preferredDeptId = route.query.publisherDeptId ? Number(route.query.publisherDeptId) : undefined + initializePublishingDept(preferredDeptId) } catch (error) { console.error('刷新用户信息失败:', error) } diff --git a/frontend/src/views/TaskHall.vue b/frontend/src/views/TaskHall.vue index 32bfba9..3fd5587 100644 --- a/frontend/src/views/TaskHall.vue +++ b/frontend/src/views/TaskHall.vue @@ -10,7 +10,7 @@
{{ userDeptName }} - + {{ dept.deptName }} @@ -2591,13 +2591,16 @@ const isDepartmentLeader = computed(() => { return user?.isDepartmentLeader === 1 || user?.isDepartmentLeader === true || user?.role === 'dept_leader' || user?.role === 'admin' }) -// 部门视角切换功能(用于管理多个部门的负责人) -interface ManagedDepartment { +// 部门视角/身份切换 +interface DepartmentViewOption { deptId: number deptName: string - deptType: 'demand' | 'receiving' + deptType: 'demand' | 'receiving' | 'primary_demand' } +type ManagedDepartment = DepartmentViewOption + +const switchableDepartments = ref([]) // 用户可切换的其他部门身份 const managedDepartments = ref([]) // 用户管理的所有部门 const currentDeptView = ref(undefined) // 当前选择的部门视角,undefined表示使用用户自己的部门 const userDeptId = ref(null) @@ -2611,7 +2614,7 @@ const effectiveDeptType = computed(() => { if (currentDeptView.value === undefined) { return userDeptType.value } - const selectedDept = managedDepartments.value.find(d => d.deptId === currentDeptView.value) + const selectedDept = switchableDepartments.value.find(d => d.deptId === currentDeptView.value) return selectedDept?.deptType || userDeptType.value }) @@ -2667,22 +2670,49 @@ const initDeptViewData = async () => { // 优先使用后端返回的部门类型;缺失时从部门列表回填 let resolvedDeptType = user.deptType - if (!resolvedDeptType && Array.isArray(user.managedDepartments) && user.deptId) { - const selfDept = user.managedDepartments.find((dept: ManagedDepartment) => dept.deptId === user.deptId) + if (!resolvedDeptType && Array.isArray(user.departments) && user.deptId) { + const selfDept = user.departments.find((dept: ManagedDepartment) => dept.deptId === user.deptId) if (selfDept?.deptType) { resolvedDeptType = selfDept.deptType } } userDeptType.value = resolvedDeptType || 'demand' + + const switchableMap = new Map() + + if (Array.isArray(user.departments)) { + user.departments.forEach((dept: ManagedDepartment) => { + if (!dept?.deptId || dept.deptId === user.deptId || !dept.deptType) return + switchableMap.set(dept.deptId, { + deptId: dept.deptId, + deptName: dept.deptName, + deptType: dept.deptType + }) + }) + } // 获取用户管理的部门列表 if (user.managedDepartments && Array.isArray(user.managedDepartments)) { managedDepartments.value = user.managedDepartments.filter( (dept: ManagedDepartment) => dept.deptId !== user.deptId // 排除用户自己所属的部门 ) + managedDepartments.value.forEach((dept: ManagedDepartment) => { + if (!dept?.deptId) return + switchableMap.set(dept.deptId, { + deptId: dept.deptId, + deptName: dept.deptName, + deptType: dept.deptType + }) + }) } else { managedDepartments.value = [] } + + switchableDepartments.value = Array.from(switchableMap.values()) + + if (currentDeptView.value !== undefined && !switchableMap.has(currentDeptView.value)) { + currentDeptView.value = undefined + } } } catch (e) { console.error('初始化部门视角数据失败:', e) @@ -2823,7 +2853,13 @@ const draftsTotal = ref(0) const showDraftTab = computed(() => { const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}') // 需求部门、一级需求部门用户或管理员可以看到草稿箱 - return userDeptType.value === 'demand' || userDeptType.value === 'primary_demand' || userInfo.isAdmin === 1 || userInfo.isAdmin === true + return effectiveDeptType.value === 'demand' || effectiveDeptType.value === 'primary_demand' || userInfo.isAdmin === 1 || userInfo.isAdmin === true +}) + +watch(showDraftTab, (visible) => { + if (!visible && activeTab.value === 'drafts') { + activeTab.value = 'available' + } }) // 进行中任务状态 @@ -4791,6 +4827,13 @@ const handleMonthChange = () => { // 发起任务 const handleCreateTask = () => { + if (currentDeptView.value !== undefined && (effectiveDeptType.value === 'demand' || effectiveDeptType.value === 'primary_demand')) { + router.push({ + path: '/tasks/create', + query: { publisherDeptId: String(currentDeptView.value) } + }) + return + } router.push('/tasks/create') }