feat(management): 接入文档用户权限与报表

This commit is contained in:
yelan
2026-09-01 10:13:11 +08:00
parent beeb98d18f
commit e467f03f23
12 changed files with 2361 additions and 41 deletions
@@ -2,24 +2,118 @@
import { onMounted, ref } from 'vue'
import { ElMessage } from 'element-plus'
import { getDepartments } from '@/api/management/organization'
import { getDocuments } from '@/api/management/documents'
import {
createTemplatePermission,
deleteTemplatePermission,
getTemplatePermissions,
isPermissionMockEnabled,
} from '@/api/management/document-permissions'
import { getRoles } from '@/api/management/roles'
import { getUsers } from '@/api/management/users'
import type { DocumentRecord, TemplatePermissionRecord } from '@/api/management/types'
import DepartmentPermissionTable from './components/DepartmentPermissionTable.vue'
import RolePermissionMatrix from './components/RolePermissionMatrix.vue'
import TemplatePermissionPanel from './components/TemplatePermissionPanel.vue'
import { departmentPermissionRows, permissionColumns, rolePermissionRows } from './mock'
import type { DepartmentPermissionRow, PermissionKey, RolePermissionRow } from './types'
import type {
DepartmentPermissionRow,
PermissionKey,
PermissionSubjectOption,
RolePermissionRow,
TemplatePermissionForm,
} from './types'
const loading = ref(true)
const roles = ref<RolePermissionRow[]>([])
const departments = ref<DepartmentPermissionRow[]>([])
const templates = ref<DocumentRecord[]>([])
const selectedTemplateId = ref('')
const templatePermissions = ref<TemplatePermissionRecord[]>([])
const permissionSubjects = ref<PermissionSubjectOption[]>([])
const permissionLoading = ref(false)
const permissionSaving = ref(false)
async function loadPermissions() {
loading.value = true
await Promise.resolve()
roles.value = rolePermissionRows.map((role) => ({
...role,
permissions: { ...role.permissions },
}))
departments.value = departmentPermissionRows.map((row) => ({ ...row }))
loading.value = false
try {
if (isPermissionMockEnabled) {
roles.value = rolePermissionRows.map((role) => ({
...role,
permissions: { ...role.permissions },
}))
departments.value = departmentPermissionRows.map((row) => ({ ...row }))
return
}
const [templatesResult, rolesResult, departmentsResult, usersResult] = await Promise.allSettled(
[
getDocuments({ page: 1, pageSize: 200, status: 'all' }),
getRoles(),
getDepartments(),
getUsers({ page: 1, pageSize: 200, status: 'all' }),
],
)
if (templatesResult.status === 'rejected') {
throw templatesResult.reason
}
templates.value = templatesResult.value.records
selectedTemplateId.value = templates.value[0]?.id ?? ''
permissionSubjects.value = [
...(rolesResult.status === 'fulfilled'
? rolesResult.value.map((role) => ({
type: 'ROLE' as const,
id: role.id,
label: role.name,
}))
: []),
...(departmentsResult.status === 'fulfilled'
? departmentsResult.value.map((department) => ({
type: 'DEPARTMENT' as const,
id: department.id,
label: department.name,
}))
: []),
...(usersResult.status === 'fulfilled'
? usersResult.value.records.map((user) => ({
type: 'USER' as const,
id: user.id,
label: `${user.name}${user.employeeNo ? `(${user.employeeNo})` : ''}`,
}))
: []),
]
await loadTemplatePermissions()
} catch {
templates.value = []
permissionSubjects.value = []
templatePermissions.value = []
ElMessage.error('权限配置加载失败,请稍后重试')
} finally {
loading.value = false
}
}
async function loadTemplatePermissions() {
if (!selectedTemplateId.value || isPermissionMockEnabled) {
templatePermissions.value = []
return
}
permissionLoading.value = true
try {
templatePermissions.value = await getTemplatePermissions(selectedTemplateId.value)
} catch {
templatePermissions.value = []
ElMessage.error('模板权限加载失败,请稍后重试')
} finally {
permissionLoading.value = false
}
}
function toggleRolePermission(roleId: string, permission: PermissionKey) {
@@ -37,6 +131,47 @@ function adjustDepartmentPermission(row: DepartmentPermissionRow) {
ElMessage.info(`原型演示:调整${row.department}文档权限`)
}
async function addTemplatePermission(form: TemplatePermissionForm) {
if (!selectedTemplateId.value) {
return
}
permissionSaving.value = true
try {
await createTemplatePermission(selectedTemplateId.value, form)
await loadTemplatePermissions()
ElMessage.success('模板权限已添加')
} catch {
ElMessage.error('模板权限添加失败,请稍后重试')
} finally {
permissionSaving.value = false
}
}
async function deleteTemplatePermissionRecord(permissionId: string) {
if (!selectedTemplateId.value || !window.confirm('确定删除这条模板权限吗?')) {
return
}
permissionSaving.value = true
try {
await deleteTemplatePermission(selectedTemplateId.value, permissionId)
await loadTemplatePermissions()
ElMessage.success('模板权限已删除')
} catch {
ElMessage.error('模板权限删除失败,请稍后重试')
} finally {
permissionSaving.value = false
}
}
function selectTemplate(templateId: string) {
selectedTemplateId.value = templateId
void loadTemplatePermissions()
}
onMounted(loadPermissions)
</script>
@@ -61,7 +196,7 @@ onMounted(loadPermissions)
</section>
</template>
<template v-else>
<template v-else-if="isPermissionMockEnabled">
<section class="page-card">
<div class="card-heading">
<h2>按角色授权</h2>
@@ -81,6 +216,24 @@ onMounted(loadPermissions)
<DepartmentPermissionTable :rows="departments" @adjust="adjustDepartmentPermission" />
</section>
</template>
<section v-else class="page-card">
<div class="card-heading">
<h2>模板权限</h2>
<span>按模板配置角色、科室和用户的可见/可用/可维护权限</span>
</div>
<TemplatePermissionPanel
:templates="templates"
:selected-template-id="selectedTemplateId"
:permissions="templatePermissions"
:subjects="permissionSubjects"
:loading="permissionLoading"
:saving="permissionSaving"
@update:selected-template-id="selectTemplate"
@add="addTemplatePermission"
@delete="deleteTemplatePermissionRecord"
/>
</section>
</section>
</template>