fix: 完善文档权限接口接入
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user