fix: restore dual-role department switching

This commit is contained in:
Your Name 2026-03-30 10:29:01 +08:00
parent a727cc0622
commit 802fc7c75e
2 changed files with 54 additions and 10 deletions

View File

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

View File

@ -10,7 +10,7 @@
<div class="overview-actions">
<!-- 部门视角切换(仅当用户管理多个部门时显示) -->
<a-select
v-if="managedDepartments.length > 0"
v-if="switchableDepartments.length > 0"
v-model:value="currentDeptView"
style="width: 120px; margin-right: 8px;"
size="middle"
@ -20,7 +20,7 @@
<a-select-option :value="undefined">
{{ userDeptName }}
</a-select-option>
<a-select-option v-for="dept in managedDepartments" :key="dept.deptId" :value="dept.deptId">
<a-select-option v-for="dept in switchableDepartments" :key="dept.deptId" :value="dept.deptId">
{{ dept.deptName }}
</a-select-option>
</a-select>
@ -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<DepartmentViewOption[]>([]) // 用户可切换的其他部门身份
const managedDepartments = ref<ManagedDepartment[]>([]) // 用户管理的所有部门
const currentDeptView = ref<number | undefined>(undefined) // 当前选择的部门视角,undefined表示使用用户自己的部门
const userDeptId = ref<number | null>(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<number, DepartmentViewOption>()
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')
}