diff --git a/frontend/src/views/TaskHall.vue b/frontend/src/views/TaskHall.vue index 3b72093..d2c0f03 100644 --- a/frontend/src/views/TaskHall.vue +++ b/frontend/src/views/TaskHall.vue @@ -2557,16 +2557,22 @@ const configStore = useConfigStore() // 标签页 const activeTab = ref('available') -// 是否为部门负责人(从localStorage获取用户信息) -const isDepartmentLeader = computed(() => { +const parseUserInfo = () => { try { const userStr = localStorage.getItem('userInfo') - if (!userStr) return false - const user = JSON.parse(userStr) - return user?.isDepartmentLeader === 1 || user?.role === 'dept_leader' || user?.role === 'admin' + if (!userStr) return {} + return JSON.parse(userStr) } catch { - return false + return {} } +} + +const currentUserInfo = ref(parseUserInfo()) + +// 是否为部门负责人 +const isDepartmentLeader = computed(() => { + const user = currentUserInfo.value || {} + return user?.isDepartmentLeader === 1 || user?.isDepartmentLeader === true || user?.role === 'dept_leader' || user?.role === 'admin' }) // 部门视角切换功能(用于管理多个部门的负责人) @@ -2600,7 +2606,7 @@ const effectiveDeptId = computed(() => { // 计算是否有导出权限(部门负责人或管理员) const canExportTaskHall = computed(() => { - const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}') + const userInfo = currentUserInfo.value || {} if (!userInfo || !userInfo.id) return false // 管理员可以导出 @@ -2624,35 +2630,42 @@ const canExportTaskHall = computed(() => { // 初始化部门视角数据 const initDeptViewData = async () => { try { - const userStr = localStorage.getItem('userInfo') - let user = userStr ? JSON.parse(userStr) : null - - // 如果用户信息中没有 managedDepartments 字段,则调用 API 刷新 - if (user && !user.managedDepartments) { - console.log('用户信息中没有 managedDepartments,刷新用户信息...') - try { - const response = await authApi.getUserInfo() - if (response.data) { - user = response.data - localStorage.setItem('userInfo', JSON.stringify(user)) - console.log('用户信息已刷新:', user) - } - } catch (e) { - console.warn('刷新用户信息失败:', e) + let user: any = parseUserInfo() + + // 每次进入任务大厅都刷新一次用户信息,避免本地缓存过期导致权限判断错误 + try { + const response = await authApi.getUserInfo() + if (response.data) { + user = response.data + localStorage.setItem('userInfo', JSON.stringify(user)) } + } catch (e) { + console.warn('刷新用户信息失败,回退本地缓存:', e) } - - if (user) { + + currentUserInfo.value = user || {} + + if (user && user.id) { userDeptId.value = user.deptId userDeptName.value = user.deptName || '我的部门' - userDeptType.value = user.deptType || 'demand' + + // 优先使用后端返回的部门类型;缺失时从部门列表回填 + let resolvedDeptType = user.deptType + if (!resolvedDeptType && Array.isArray(user.managedDepartments) && user.deptId) { + const selfDept = user.managedDepartments.find((dept: ManagedDepartment) => dept.deptId === user.deptId) + if (selfDept?.deptType) { + resolvedDeptType = selfDept.deptType + } + } + userDeptType.value = resolvedDeptType || 'demand' // 获取用户管理的部门列表 if (user.managedDepartments && Array.isArray(user.managedDepartments)) { managedDepartments.value = user.managedDepartments.filter( (dept: ManagedDepartment) => dept.deptId !== user.deptId // 排除用户自己所属的部门 ) - console.log('用户管理的部门:', managedDepartments.value) + } else { + managedDepartments.value = [] } } } catch (e) { @@ -3415,7 +3428,7 @@ const isHighScoreTask = (task: TaskOrSubTask) => { // 判断是否可以下载附件 const canDownloadAttachment = (task: TaskOrSubTask) => { // 管理员可下载 - const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}') + const userInfo = currentUserInfo.value || {} if (userInfo.isAdmin === 1 || userInfo.isAdmin === true) { return true } @@ -3438,12 +3451,27 @@ const parseAttachmentUrls = (attachmentUrl?: string) => { // 可接任务卡片:接单部门负责人可提前查看附件信息 const canViewAvailableTaskAttachmentInfo = computed(() => { - const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}') + const userInfo = currentUserInfo.value || {} const isAdmin = userInfo.isAdmin === 1 || userInfo.isAdmin === true if (isAdmin) { return true } - return isDepartmentLeader.value && effectiveDeptType.value === 'receiving' + + if (!isDepartmentLeader.value) { + return false + } + + // 当前切换部门为接单部门 + if (effectiveDeptType.value === 'receiving') { + return true + } + + // 未切换视角时,用户自身部门为接单部门 + if (currentDeptView.value === undefined && userDeptType.value === 'receiving') { + return true + } + + return false }) // 加载配置数据(从全局store加载)