import type { Role } from "@/store/permissionSettingsStore"; import type { ManagedUser } from "@/types/ManagedUser"; type ManagedUserRole = NonNullable[number]; function buildRoleCode(role: Role): string { return role.moduleCode && !role.code.includes(":") ? `${role.moduleCode}:${role.code}` : role.code; } function findRole(role: ManagedUserRole, roleList: Role[]): Role | undefined { if (typeof role === "string") { return roleList.find(roleItem => buildRoleCode(roleItem) === role); } return roleList.find(roleItem => roleItem.id === role.id || buildRoleCode(roleItem) === buildRoleCode(role as Role)); } export function getManagedUserRoleList(user: ManagedUser): ManagedUserRole[] { if (user.user?.roleEntityList?.length) { return user.user.roleEntityList; } return user.roleList || user.user?.roleList || []; } export function getRoleDisplayName(role: ManagedUserRole | undefined, roleList: Role[]): string { if (!role) { return "未配置角色"; } const fullRole = findRole(role, roleList); if (fullRole) { return fullRole.name || fullRole.code || "未配置角色"; } return typeof role === "string" ? role : role.name || role.code || "未配置角色"; } export function buildEffectiveRoleCodeSet(user: ManagedUser, roleList: Role[] = []): Set { const roleCodeSet = new Set(); const visitedRoleIds = new Set(); function addRole(role: ManagedUserRole | Role): void { const roleId = typeof role === "string" ? roleList.find(item => buildRoleCode(item) === role || item.code === role)?.id : role.id || roleList.find(item => buildRoleCode(item) === buildRoleCode(role as Role))?.id; if (roleId && visitedRoleIds.has(roleId)) { return; } if (roleId) { visitedRoleIds.add(roleId); } if (typeof role === "string") { roleCodeSet.add(role); const separatorIndex = role.indexOf(":"); if (-1 < separatorIndex) { roleCodeSet.add(role.slice(separatorIndex + 1)); } } else { roleCodeSet.add(role.code); roleCodeSet.add(buildRoleCode(role as Role)); } const fullRole = roleId ? roleList.find(item => item.id === roleId) : undefined; for (const childRoleId of fullRole?.childRoleIdList || []) { const childRole = roleList.find(item => item.id === childRoleId); if (childRole) { addRole(childRole); } } } for (const role of getManagedUserRoleList(user)) { addRole(role); } for (const roleCode of user.user?.roleList || []) { addRole(roleCode); } return roleCodeSet; }