fix: 完善文档权限接口接入

This commit is contained in:
xy
2026-09-03 12:33:16 +08:00
parent 48e5293509
commit 925d8c9202
4 changed files with 193 additions and 39 deletions
@@ -2,7 +2,7 @@
import { computed, onMounted, ref } from 'vue'
import { ElMessage } from 'element-plus'
import { getDepartments } from '@/api/management/organization'
import { getAllDepartments } from '@/api/management/organization'
import { getDocuments } from '@/api/management/documents'
import {
createTemplatePermission,
@@ -11,7 +11,7 @@ import {
isPermissionMockEnabled,
} from '@/api/management/document-permissions'
import { getUsers } from '@/api/management/users'
import { getRoleSummaries } from '@/api/management/roles'
import { getRoleSummaries, getRoles } from '@/api/management/roles'
import type {
DepartmentRecord,
DocumentRecord,
@@ -54,6 +54,7 @@ const templatePermissions = ref<TemplatePermissionRecord[]>([])
const permissionLoading = ref(false)
const permissionSaving = ref(false)
const permissionError = ref(false)
const permissionPreviewUserId = ref('')
let permissionRequestId = 0
const selectedTemplate = computed(() =>
@@ -94,14 +95,14 @@ function resolvePermission(
const hasInheritedDeny = records.some((record) => record.inherited && record.effect === 'DENY')
const hasInheritedAllow = records.some((record) => record.inherited && record.effect === 'ALLOW')
if (hasDirectDeny) {
return { enabled: false, state: 'direct-deny' }
}
if (hasInheritedDeny) {
return { enabled: false, state: 'inherited-deny' }
}
if (hasDirectDeny) {
return { enabled: false, state: 'direct-deny' }
}
if (hasDirectAllow) {
return { enabled: true, state: 'direct-allow' }
}
@@ -132,7 +133,8 @@ function syncPermissionRows() {
name: role.name,
color: role.color ?? ['#6b5bd2', '#0e6e8c', '#0f9d6c', '#d9821f'][index % 4],
description: role.description,
userCount: role.userCount ?? 0,
userCount:
role.userCount ?? userRecords.value.filter((user) => user.roleIds?.includes(role.id)).length,
...buildPermissionMaps('ROLE', role.id),
}))
@@ -143,6 +145,41 @@ function syncPermissionRows() {
}))
}
async function getAllTemplatesForPermission() {
const firstPage = await getDocuments({ page: 1, pageSize: 200, status: 'all' })
const pageCount = Math.ceil(firstPage.total / firstPage.pageSize)
if (pageCount <= 1) {
return firstPage.records
}
const remainingPages = await Promise.all(
Array.from({ length: pageCount - 1 }, (_, index) =>
getDocuments({ page: index + 2, pageSize: firstPage.pageSize, status: 'all' }),
),
)
return [firstPage, ...remainingPages].flatMap((page) => page.records)
}
async function getRolesForPermission(): Promise<{
records: RoleRecord[]
usedFallback: boolean
}> {
try {
return { records: await getRoleSummaries(), usedFallback: false }
} catch (summaryError) {
try {
return {
records: await getRoles({ page: 1, pageSize: 200 }),
usedFallback: true,
}
} catch {
throw summaryError
}
}
}
async function getAllUsersForPermission() {
const firstPage = await getUsers({ page: 1, pageSize: 200, status: 'all' })
const pageCount = Math.ceil(firstPage.total / firstPage.pageSize)
@@ -178,9 +215,9 @@ async function loadPermissions() {
const [templatesResult, rolesResult, departmentsResult, usersResult] = await Promise.allSettled(
[
getDocuments({ page: 1, pageSize: 200, status: 'all' }),
getRoleSummaries(),
getDepartments(),
getAllTemplatesForPermission(),
getRolesForPermission(),
getAllDepartments(),
getAllUsersForPermission(),
],
)
@@ -189,8 +226,8 @@ async function loadPermissions() {
throw templatesResult.reason
}
templates.value = templatesResult.value.records
roleRecords.value = rolesResult.status === 'fulfilled' ? rolesResult.value : []
templates.value = templatesResult.value
roleRecords.value = rolesResult.status === 'fulfilled' ? rolesResult.value.records : []
departmentRecords.value =
departmentsResult.status === 'fulfilled' ? departmentsResult.value : []
userRecords.value = usersResult.status === 'fulfilled' ? usersResult.value : []
@@ -202,9 +239,17 @@ async function loadPermissions() {
usersResult.status === 'rejected'
) {
ElMessage.warning('角色、科室或用户列表加载不完整,部分授权对象暂不可配置')
} else if (rolesResult.value.usedFallback) {
ElMessage.warning('角色人数统计接口暂不可用,已回退到角色列表,人数仅按当前用户列表估算')
}
selectedTemplateId.value = templates.value[0]?.id ?? ''
if (!userRecords.value.some((user) => user.id === permissionPreviewUserId.value)) {
permissionPreviewUserId.value = ''
}
if (!templates.value.some((template) => template.id === selectedTemplateId.value)) {
selectedTemplateId.value = templates.value[0]?.id ?? ''
}
await loadTemplatePermissions()
} catch {
roleRecords.value = []
@@ -228,6 +273,7 @@ async function loadTemplatePermissions() {
if (!templateId || isPermissionMockEnabled) {
templatePermissions.value = []
permissionError.value = false
permissionLoading.value = false
return
}
@@ -235,7 +281,10 @@ async function loadTemplatePermissions() {
permissionError.value = false
try {
const records = await getTemplatePermissions(templateId)
const records = await getTemplatePermissions(
templateId,
permissionPreviewUserId.value || undefined,
)
if (requestId !== permissionRequestId || templateId !== selectedTemplateId.value) {
return
@@ -349,7 +398,7 @@ async function setSubjectPermission(
subjectId: string,
permission: PermissionKey,
) {
if (!selectedTemplateId.value || permissionSaving.value) {
if (!selectedTemplateId.value || permissionSaving.value || permissionError.value) {
return
}
@@ -381,7 +430,7 @@ async function setSubjectPermission(
}
async function addTemplatePermission(form: TemplatePermissionForm) {
if (!selectedTemplateId.value || permissionSaving.value) {
if (!selectedTemplateId.value || permissionSaving.value || permissionError.value) {
return
}
@@ -399,7 +448,7 @@ async function addTemplatePermission(form: TemplatePermissionForm) {
}
async function removeTemplatePermission(permissionId: string) {
if (!selectedTemplateId.value || permissionSaving.value) {
if (!selectedTemplateId.value || permissionSaving.value || permissionError.value) {
return
}
@@ -426,6 +475,11 @@ function handlePanelTemplateChange(templateId: string) {
void loadTemplatePermissions()
}
function handlePermissionPreviewUserChange(userId: string) {
permissionPreviewUserId.value = userId
void loadTemplatePermissions()
}
function retryTemplatePermissions() {
void loadTemplatePermissions()
}
@@ -541,9 +595,13 @@ onMounted(loadPermissions)
:subjects="templateSubjects"
:loading="permissionLoading"
:saving="permissionSaving"
:error="permissionError"
:preview-user-id="permissionPreviewUserId"
@update:selected-template-id="handlePanelTemplateChange"
@update:preview-user-id="handlePermissionPreviewUserChange"
@add="addTemplatePermission"
@delete="removeTemplatePermission"
@retry="retryTemplatePermissions"
/>
</section>
</template>