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')
}