fix: restore dual-role department switching
This commit is contained in:
parent
a727cc0622
commit
802fc7c75e
@ -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)
|
||||
}
|
||||
|
||||
@ -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')
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user