// Admin.NET 项目的版æƒã€å•†æ ‡ã€ä¸“利和其他相关æƒåˆ©å‡å—ç›¸åº”æ³•å¾‹æ³•è§„çš„ä¿æŠ¤ã€‚ä½¿ç”¨æœ¬é¡¹ç›®åº”éµå®ˆç›¸å…³æ³•律法规和许å¯è¯çš„è¦æ±‚。 // // 本项目主è¦éµå¾ª MIT 许å¯è¯å’Œ Apache 许å¯è¯ï¼ˆç‰ˆæœ¬ 2.0)进行分å‘和使用。许å¯è¯ä½äºŽæºä»£ç æ ‘æ ¹ç›®å½•ä¸çš„ LICENSE-MIT å’Œ LICENSE-APACHE 文件。 // // ä¸å¾—利用本项目从事å±å®³å›½å®¶å®‰å…¨ã€æ‰°ä¹±ç¤¾ä¼šç§©åºã€ä¾µçŠ¯ä»–äººåˆæ³•æƒç›Šç‰æ³•å¾‹æ³•è§„ç¦æ¢çš„æ´»åЍï¼ä»»ä½•基于本项目二次开å‘è€Œäº§ç”Ÿçš„ä¸€åˆ‡æ³•å¾‹çº çº·å’Œè´£ä»»ï¼Œæˆ‘ä»¬ä¸æ‰¿æ‹…ä»»ä½•è´£ä»»ï¼ namespace Admin.NET.Core.Service; /// <summary> /// 系统角色æœåŠ¡ 🧩 /// </summary> [ApiDescriptionSettings(Order = 480)] public class SysRoleService : IDynamicApiController, ITransient { private readonly UserManager _userManager; private readonly SqlSugarRepository<SysRole> _sysRoleRep; private readonly SysRoleOrgService _sysRoleOrgService; private readonly SysRoleMenuService _sysRoleMenuService; private readonly SysOrgService _sysOrgService; private readonly SysUserRoleService _sysUserRoleService; public SysRoleService(UserManager userManager, SqlSugarRepository<SysRole> sysRoleRep, SysRoleOrgService sysRoleOrgService, SysRoleMenuService sysRoleMenuService, SysOrgService sysOrgService, SysUserRoleService sysUserRoleService) { _userManager = userManager; _sysRoleRep = sysRoleRep; _sysRoleOrgService = sysRoleOrgService; _sysRoleMenuService = sysRoleMenuService; _sysOrgService = sysOrgService; _sysUserRoleService = sysUserRoleService; } /// <summary> /// 获å–角色分页列表 🔖 /// </summary> /// <param name="input"></param> /// <returns></returns> [DisplayName("获å–角色分页列表")] public async Task<SqlSugarPagedList<SysRole>> Page(PageRoleInput input) { return await _sysRoleRep.AsQueryable() .WhereIF(!_userManager.SuperAdmin, u => u.TenantId == _userManager.TenantId) // è‹¥éžè¶…管,则åªèƒ½æ“作本租户的角色 .WhereIF(!_userManager.SuperAdmin && !_userManager.SysAdmin, 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 => new { u.OrderNo, u.Id }) .ToPagedListAsync(input.Page, input.PageSize); } /// <summary> /// 获å–角色列表 🔖 /// </summary> /// <returns></returns> [DisplayName("获å–角色列表")] public async Task<List<RoleOutput>> GetList() { // 当å‰ç”¨æˆ·å·²æ‹¥æœ‰çš„è§’è‰²é›†åˆ var roleIdList = _userManager.SuperAdmin ? new List<long>() : await _sysUserRoleService.GetUserRoleIdList(_userManager.UserId); return await _sysRoleRep.AsQueryable() .WhereIF(!_userManager.SuperAdmin, u => u.TenantId == _userManager.TenantId) // è‹¥éžè¶…管,则åªèƒ½æ“作本租户的角色 .WhereIF(!_userManager.SuperAdmin && !_userManager.SysAdmin, u => u.CreateUserId == _userManager.UserId || roleIdList.Contains(u.Id)) // è‹¥éžè¶…管且éžç³»ç»Ÿç®¡ç†å‘˜ï¼Œåˆ™åªæ˜¾ç¤ºè‡ªå·±åˆ›å»ºå’Œå·²æ‹¥æœ‰çš„角色 .OrderBy(u => new { u.OrderNo, u.Id }).Select<RoleOutput>().ToListAsync(); } /// <summary> /// å¢žåŠ è§’è‰² 🔖 /// </summary> /// <param name="input"></param> /// <returns></returns> [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<SysRole>()).ExecuteReturnEntityAsync(); input.Id = newRole.Id; await UpdateRoleMenu(input); } /// <summary> /// 更新角色èœå•æƒé™ /// </summary> /// <param name="input"></param> /// <returns></returns> private async Task UpdateRoleMenu(AddRoleInput input) { if (input.MenuIdList == null || input.MenuIdList.Count < 1) return; // 将父节点为0çš„èœå•排除,防æ¢å‰ç«¯å…¨é€‰å¼‚常 var pMenuIds = await _sysRoleRep.ChangeRepository<SqlSugarRepository<SysMenu>>().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() }); } /// <summary> /// 更新角色 🔖 /// </summary> /// <param name="input"></param> /// <returns></returns> [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<SysRole>()).IgnoreColumns(true) .IgnoreColumns(u => new { u.DataScope }).ExecuteCommandAsync(); await UpdateRoleMenu(input); } /// <summary> /// åˆ é™¤è§’è‰² 🔖 /// </summary> /// <param name="input"></param> /// <returns></returns> [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); } /// <summary> /// 授æƒè§’色èœå• 🔖 /// </summary> /// <param name="input"></param> /// <returns></returns> [UnitOfWork] [DisplayName("授æƒè§’色èœå•")] public async Task GrantMenu(RoleMenuInput input) { await _sysRoleMenuService.GrantRoleMenu(input); } /// <summary> /// 授æƒè§’色数æ®èŒƒå›´ 🔖 /// </summary> /// <param name="input"></param> /// <returns></returns> [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); } /// <summary> /// æ ¹æ®è§’色Id获å–èœå•Idé›†åˆ ðŸ”– /// </summary> /// <param name="input"></param> /// <returns></returns> [DisplayName("æ ¹æ®è§’色Id获å–èœå•Id集åˆ")] public async Task<List<long>> GetOwnMenuList([FromQuery] RoleInput input) { return await _sysRoleMenuService.GetRoleMenuIdList(new List<long> { input.Id }); } /// <summary> /// æ ¹æ®è§’色IdèŽ·å–æœºæž„Idé›†åˆ ðŸ”– /// </summary> /// <param name="input"></param> /// <returns></returns> [DisplayName("æ ¹æ®è§’色IdèŽ·å–æœºæž„Id集åˆ")] public async Task<List<long>> GetOwnOrgList([FromQuery] RoleInput input) { return await _sysRoleOrgService.GetRoleOrgIdList(new List<long> { input.Id }); } /// <summary> /// è®¾ç½®è§’è‰²çŠ¶æ€ ðŸ”– /// </summary> /// <param name="input"></param> /// <returns></returns> [DisplayName("设置角色状æ€")] public async Task<int> 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(); } }