import { useState, useEffect, FC } from '@/imports'; import { Card, Table, Button, Modal, Form, Input, Select, Checkbox, Tree, message, Space, Tag, Tooltip, Alert, Typography, Divider, Collapse, } from 'antd'; import { PlusOutlined, EditOutlined, DeleteOutlined, SaveOutlined, CloseOutlined, KeyOutlined, LockOutlined, DownOutlined, UpOutlined, LineChartOutlined } from '@ant-design/icons'; import { useRequest } from 'umi'; import { createRole as createRoleAPI, updateRole as updateRoleAPI, deleteRole as deleteRoleAPI, getAllRoles as getAllRolesAPI, getPermissionDefinitions as getPermissionsAPI, } from '@/services/roleDataSource'; const { Title, Text } = Typography; const { Option } = Select; const { TreeNode } = Tree; const { Panel } = Collapse; const RoleManagement: FC = () => { const [roles, setRoles] = useState([]); const [permissions, setPermissions] = useState([]); const [selectedRole, setSelectedRole] = useState(null); const [isModalVisible, setIsModalVisible] = useState(false); const [isDeleteModalVisible, setIsDeleteModalVisible] = useState(false); const [form] = Form.useForm(); const [confirmLoading, setConfirmLoading] = useState(false); const [deletingRole, setDeletingRole] = useState(''); // 加载角色列表 const { run: loadRoles, loading: loadingRoles } = useRequest(getAllRolesAPI, { onSuccess: (data) => { setRoles(data); }, }); // 加载权限列表 const { run: loadPermissions, loading: loadingPermissions } = useRequest(getPermissionsAPI, { onSuccess: (data) => { setPermissions(data); }, }); useEffect(() => { loadRoles(); loadPermissions(); }, []); // 打开创建/编辑角色模态框 const showModal = (role?: any) => { if (role) { setSelectedRole(role); form.setFieldsValue({ roleCode: role.code, roleName: role.name, permissions: role.permissions || [], }); } else { setSelectedRole(null); form.resetFields(); } setIsModalVisible(true); }; // 关闭模态框 const handleCancel = () => { setIsModalVisible(false); setSelectedRole(null); form.resetFields(); }; // 提交角色表单 const handleSubmit = async () => { try { const values = await form.validateFields(); setConfirmLoading(true); if (selectedRole) { // 更新角色 await updateRoleAPI(values.roleCode, values.roleName, values.permissions); message.success('Role updated successfully'); } else { // 创建角色 await createRoleAPI(values.roleCode, values.roleName, values.permissions); message.success('Role created successfully'); } setIsModalVisible(false); form.resetFields(); loadRoles(); } catch (error) { message.error('Failed to save role'); } finally { setConfirmLoading(false); } }; // 打开删除确认模态框 const showDeleteConfirm = (roleCode: string) => { setDeletingRole(roleCode); setIsDeleteModalVisible(true); }; // 确认删除角色 const handleDelete = async () => { try { setConfirmLoading(true); await deleteRoleAPI(deletingRole); message.success('Role deleted successfully'); setIsDeleteModalVisible(false); loadRoles(); } catch (error) { message.error('Failed to delete role'); } finally { setConfirmLoading(false); } }; // 构建权限树 const buildPermissionTree = () => { const modules = new Map(); // 按模块分组权限 permissions.forEach(permission => { if (!modules.has(permission.module)) { modules.set(permission.module, []); } modules.get(permission.module)?.push(permission); }); return Array.from(modules.entries()).map(([module, perms]) => ( {perms.map(perm => ( {perm.name} {perm.action} } /> ))} )); }; // 检查角色是否为系统预设角色 const isSystemRole = (roleCode: string) => { const systemRoles = ['ADMIN', 'MANAGER', 'OPERATOR', 'FINANCE', 'SOURCING', 'LOGISTICS', 'ANALYST']; return systemRoles.includes(roleCode); }; // 计算权限继承关系 const calculatePermissionInheritance = (role: any) => { const inheritedPermissions = new Set(); const roleHierarchy = { 'ADMIN': [], 'MANAGER': ['OPERATOR'], 'OPERATOR': [], 'FINANCE': [], 'SOURCING': [], 'LOGISTICS': [], 'ANALYST': [], }; // 递归计算继承的权限 const calculateInheritance = (roleCode: string) => { const childRoles = roleHierarchy[roleCode as keyof typeof roleHierarchy] || []; childRoles.forEach(childRoleCode => { const childRole = roles.find(r => r.code === childRoleCode); if (childRole) { childRole.permissions?.forEach((perm: string) => { inheritedPermissions.add(perm); }); calculateInheritance(childRoleCode); } }); }; calculateInheritance(role.code); return Array.from(inheritedPermissions); }; const columns = [ { title: 'Role Code', dataIndex: 'code', key: 'code', render: (code: string) => ( {code} {isSystemRole(code) && System} ), }, { title: 'Role Name', dataIndex: 'name', key: 'name', }, { title: 'Permissions', dataIndex: 'permissions', key: 'permissions', render: (permissions: string[]) => ( {permissions?.length || 0} permissions ), }, { title: 'Actions', key: 'actions', render: (_: any, record: any) => ( ), }, ]; return (
Role Management } extra={ } > (
Assigned Permissions } key="permissions" > {record.permissions?.map((perm: string) => { const permInfo = permissions.find(p => p.id === perm); return ( {permInfo?.name || perm} ); })} Permission Inheritance } key="inheritance" >
Role Hierarchy:
{calculatePermissionInheritance(record).length > 0 ? ( {calculatePermissionInheritance(record).map((perm: string) => { const permInfo = permissions.find(p => p.id === perm); return ( {permInfo?.name || perm} ); })} ) : ( No inherited permissions )}
), }} /> {/* Create/Edit Role Modal */}
{/* Delete Role Modal */} setIsDeleteModalVisible(false)} confirmLoading={confirmLoading} okText="Delete" cancelText="Cancel" okType="danger" >

Are you sure you want to delete the role {deletingRole}?

All users assigned to this role will lose these permissions.

); }; export default RoleManagement;