// 大名科技(天津)有限公司版权所有 电话:18020030720 QQ:515096995 // // 此源代码遵循位于源代码树根目录中的 LICENSE 文件的许可证 namespace Admin.NET.Core.Service; /// /// 系统角色服务 /// [ApiDescriptionSettings(Order = 480)] public class SysRoleService : IDynamicApiController, ITransient { private readonly UserManager _userManager; private readonly SqlSugarRepository _sysRoleRep; private readonly SysRoleOrgService _sysRoleOrgService; private readonly SysRoleMenuService _sysRoleMenuService; private readonly SysOrgService _sysOrgService; private readonly SysUserRoleService _sysUserRoleService; public SysRoleService(UserManager userManager, SqlSugarRepository sysRoleRep, SysRoleOrgService sysRoleOrgService, SysRoleMenuService sysRoleMenuService, SysOrgService sysOrgService, SysUserRoleService sysUserRoleService) { _userManager = userManager; _sysRoleRep = sysRoleRep; _sysRoleOrgService = sysRoleOrgService; _sysRoleMenuService = sysRoleMenuService; _sysOrgService = sysOrgService; _sysUserRoleService = sysUserRoleService; } /// /// 获取角色分页列表 /// /// /// [DisplayName("获取角色分页列表")] public async Task> Page(PageRoleInput input) { return await _sysRoleRep.AsQueryable() .WhereIF(!_userManager.SuperAdmin, u => u.CreateUserId == _userManager.UserId) // 若非超管,则只能操作自己创建的角色 .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name)) .WhereIF(!string.IsNullOrWhiteSpace(input.Code), u => u.Code.Contains(input.Code)) .OrderBy(u => u.OrderNo) .ToPagedListAsync(input.Page, input.PageSize); } /// /// 获取角色列表 /// /// [DisplayName("获取角色列表")] public async Task> GetList() { // 当前用户已拥有的角色集合 var roleIdList = _userManager.SuperAdmin ? null : await _sysUserRoleService.GetUserRoleIdList(_userManager.UserId); return await _sysRoleRep.AsQueryable() .WhereIF(roleIdList != null, u => u.CreateUserId == _userManager.UserId || roleIdList.Contains(u.Id)) // 若非超管,则只显示自己创建和已拥有的角色 .OrderBy(u => u.OrderNo).Select().ToListAsync(); } /// /// 增加角色 /// /// /// [ApiDescriptionSettings(Name = "Add"), HttpPost] [DisplayName("增加角色")] public async Task AddRole(AddRoleInput input) { if (await _sysRoleRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code)) throw Oops.Oh(ErrorCodeEnum.D1006); var newRole = await _sysRoleRep.AsInsertable(input.Adapt()).ExecuteReturnEntityAsync(); input.Id = newRole.Id; await UpdateRoleMenu(input); } /// /// 更新角色菜单权限 /// /// /// private async Task UpdateRoleMenu(AddRoleInput input) { if (input.MenuIdList == null || input.MenuIdList.Count < 1) return; // 将父节点为0的菜单排除,防止前端全选异常 var pMenuIds = await _sysRoleRep.ChangeRepository>().AsQueryable().Where(u => input.MenuIdList.Contains(u.Id) && u.Pid == 0).ToListAsync(u => u.Id); var menuIds = input.MenuIdList.Except(pMenuIds); // 差集 await GrantMenu(new RoleMenuInput() { Id = input.Id, MenuIdList = menuIds.ToList() }); } /// /// 更新角色 /// /// /// [ApiDescriptionSettings(Name = "Update"), HttpPost] [DisplayName("更新角色")] public async Task UpdateRole(UpdateRoleInput input) { if (await _sysRoleRep.IsAnyAsync(u => u.Name == input.Name && u.Code == input.Code && u.Id != input.Id)) throw Oops.Oh(ErrorCodeEnum.D1006); await _sysRoleRep.AsUpdateable(input.Adapt()).IgnoreColumns(true) .IgnoreColumns(u => new { u.DataScope }).ExecuteCommandAsync(); await UpdateRoleMenu(input); } /// /// 删除角色 /// /// /// [UnitOfWork] [ApiDescriptionSettings(Name = "Delete"), HttpPost] [DisplayName("删除角色")] public async Task DeleteRole(DeleteRoleInput input) { // 禁止删除系统管理员角色 var sysRole = await _sysRoleRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); if (sysRole.Code == CommonConst.SysAdminRole) throw Oops.Oh(ErrorCodeEnum.D1019); // 若角色有用户则禁止删除 var userIds = await _sysUserRoleService.GetUserIdList(input.Id); if (userIds != null && userIds.Count > 0) throw Oops.Oh(ErrorCodeEnum.D1025); await _sysRoleRep.DeleteAsync(sysRole); // 级联删除角色机构数据 await _sysRoleOrgService.DeleteRoleOrgByRoleId(sysRole.Id); // 级联删除用户角色数据 await _sysUserRoleService.DeleteUserRoleByRoleId(sysRole.Id); // 级联删除角色菜单数据 await _sysRoleMenuService.DeleteRoleMenuByRoleId(sysRole.Id); } /// /// 删除角色 1112 /// /// /// [UnitOfWork] [ApiDescriptionSettings(Name = "aelete"), HttpPost] [DisplayName("删除角色222")] public async Task DeleteRole2(DeleteRoleInput input) { // 禁止删除系统管理员角色 var sysRole = await _sysRoleRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); if (sysRole.Code == CommonConst.SysAdminRole) throw Oops.Oh(ErrorCodeEnum.D1019); // 若角色有用户则禁止删除 var userIds = await _sysUserRoleService.GetUserIdList(input.Id); if (userIds != null && userIds.Count > 0) throw Oops.Oh(ErrorCodeEnum.D1025); await _sysRoleRep.DeleteAsync(sysRole); // 级联删除角色机构数据 await _sysRoleOrgService.DeleteRoleOrgByRoleId(sysRole.Id); // 级联删除用户角色数据 await _sysUserRoleService.DeleteUserRoleByRoleId(sysRole.Id); // 级联删除角色菜单数据 await _sysRoleMenuService.DeleteRoleMenuByRoleId(sysRole.Id); } /// /// 授权角色菜单 /// /// /// [UnitOfWork] [DisplayName("授权角色菜单")] public async Task GrantMenu(RoleMenuInput input) { await _sysRoleMenuService.GrantRoleMenu(input); } /// /// 授权角色数据范围 /// /// /// [UnitOfWork] [DisplayName("授权角色数据范围")] public async Task GrantDataScope(RoleOrgInput input) { // 删除与该角色相关的用户机构缓存 var userIdList = await _sysUserRoleService.GetUserIdList(input.Id); foreach (var userId in userIdList) { SqlSugarFilter.DeleteUserOrgCache(userId, _sysRoleRep.Context.CurrentConnectionConfig.ConfigId.ToString()); } var role = await _sysRoleRep.GetFirstAsync(u => u.Id == input.Id); var dataScope = input.DataScope; if (!_userManager.SuperAdmin) { // 非超级管理员没有全部数据范围权限 if (dataScope == (int)DataScopeEnum.All) throw Oops.Oh(ErrorCodeEnum.D1016); // 若数据范围自定义,则判断授权数据范围是否有权限 if (dataScope == (int)DataScopeEnum.Define) { var grantOrgIdList = input.OrgIdList; if (grantOrgIdList.Count > 0) { var orgIdList = await _sysOrgService.GetUserOrgIdList(); if (orgIdList.Count < 1) throw Oops.Oh(ErrorCodeEnum.D1016); else if (!grantOrgIdList.All(u => orgIdList.Any(c => c == u))) throw Oops.Oh(ErrorCodeEnum.D1016); } } } role.DataScope = (DataScopeEnum)dataScope; await _sysRoleRep.AsUpdateable(role).UpdateColumns(u => new { u.DataScope }).ExecuteCommandAsync(); await _sysRoleOrgService.GrantRoleOrg(input); } /// /// 根据角色Id获取菜单Id集合 /// /// /// [DisplayName("根据角色Id获取菜单Id集合")] public async Task> GetOwnMenuList([FromQuery] RoleInput input) { return await _sysRoleMenuService.GetRoleMenuIdList(new List { input.Id }); } /// /// 根据角色Id获取机构Id集合 /// /// /// [DisplayName("根据角色Id获取机构Id集合")] public async Task> GetOwnOrgList([FromQuery] RoleInput input) { return await _sysRoleOrgService.GetRoleOrgIdList(new List { input.Id }); } /// /// 设置角色状态 /// /// /// [DisplayName("设置角色状态")] public async Task SetStatus(RoleInput input) { if (!Enum.IsDefined(typeof(StatusEnum), input.Status)) throw Oops.Oh(ErrorCodeEnum.D3005); return await _sysRoleRep.AsUpdateable() .SetColumns(u => u.Status == input.Status) .Where(u => u.Id == input.Id) .ExecuteCommandAsync(); } }