SysRoleService.cs 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. using Furion.DependencyInjection;
  2. using Furion.DynamicApiController;
  3. using Furion.FriendlyException;
  4. using Mapster;
  5. using Microsoft.AspNetCore.Mvc;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Threading.Tasks;
  10. namespace Admin.NET.Core.Service
  11. {
  12. /// <summary>
  13. /// 系统角色服务
  14. /// </summary>
  15. [ApiDescriptionSettings(Name = "系统角色", Order = 198)]
  16. public class SysRoleService : IDynamicApiController, ITransient
  17. {
  18. private readonly SqlSugarRepository<SysRole> _sysRoleRep;
  19. private readonly IUserManager _userManager;
  20. private readonly ISysCacheService _sysCacheService;
  21. private readonly SysRoleOrgService _sysRoleOrgService;
  22. private readonly SysRoleMenuService _sysRoleMenuService;
  23. private readonly SysOrgService _sysOrgService;
  24. private readonly SysUserRoleService _sysUserRoleService;
  25. public SysRoleService(SqlSugarRepository<SysRole> sysRoleRep,
  26. IUserManager userManager,
  27. ISysCacheService sysCacheService,
  28. SysRoleOrgService sysRoleOrgService,
  29. SysRoleMenuService sysRoleMenuService,
  30. SysOrgService sysOrgService,
  31. SysUserRoleService sysUserRoleService)
  32. {
  33. _sysRoleRep = sysRoleRep;
  34. _userManager = userManager;
  35. _sysCacheService = sysCacheService;
  36. _sysRoleOrgService = sysRoleOrgService;
  37. _sysRoleMenuService = sysRoleMenuService;
  38. _sysOrgService = sysOrgService;
  39. _sysUserRoleService = sysUserRoleService;
  40. }
  41. /// <summary>
  42. /// 获取角色分页列表
  43. /// </summary>
  44. /// <param name="input"></param>
  45. /// <returns></returns>
  46. [HttpGet("/sysRole/pageList")]
  47. public async Task<SqlSugarPagedList<SysRole>> GetRolePageList([FromQuery] PageRoleInput input)
  48. {
  49. return await _sysRoleRep.AsQueryable()
  50. .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name))
  51. .WhereIF(input.Status > 0, u => u.Status == (StatusEnum)input.Status)
  52. .OrderBy(u => u.Order).ToPagedListAsync(input.Page, input.PageSize);
  53. }
  54. /// <summary>
  55. /// 获取角色列表
  56. /// </summary>
  57. /// <returns></returns>
  58. [HttpGet("/sysRole/list")]
  59. public async Task<List<RoleOutput>> GetRoleList()
  60. {
  61. // 若非超级管理员则只取拥有角色Id集合
  62. var roleIdList = _userManager.SuperAdmin ? new List<long>() :
  63. await _sysUserRoleService.GetUserRoleIdList(_userManager.UserId);
  64. return await _sysRoleRep.AsQueryable()
  65. .WhereIF(roleIdList.Count > 0, u => roleIdList.Contains(u.Id))
  66. .OrderBy(u => u.Order).Select<RoleOutput>().ToListAsync();
  67. }
  68. /// <summary>
  69. /// 增加角色
  70. /// </summary>
  71. /// <param name="input"></param>
  72. /// <returns></returns>
  73. [HttpPost("/sysRole/add")]
  74. public async Task AddRole(AddRoleInput input)
  75. {
  76. var isExist = await _sysRoleRep.IsAnyAsync(u => u.Code == input.Code || u.Name == input.Name);
  77. if (isExist)
  78. throw Oops.Oh(ErrorCodeEnum.D1006);
  79. var role = input.Adapt<SysRole>();
  80. await _sysRoleRep.InsertAsync(role);
  81. }
  82. /// <summary>
  83. /// 更新角色
  84. /// </summary>
  85. /// <param name="input"></param>
  86. /// <returns></returns>
  87. [HttpPost("/sysRole/update")]
  88. public async Task UpdateRole(UpdateRoleInput input)
  89. {
  90. var adminRole = await _sysRoleRep.GetFirstAsync(u => u.Id == input.Id);
  91. if (adminRole.Code == CommonConst.SysAdminRoleCode)
  92. throw Oops.Oh(ErrorCodeEnum.D1020);
  93. var isExist = await _sysRoleRep.IsAnyAsync(u => (u.Name == input.Name || u.Code == input.Code) && u.Id != input.Id);
  94. if (isExist)
  95. throw Oops.Oh(ErrorCodeEnum.D1006);
  96. var role = input.Adapt<SysRole>();
  97. await _sysRoleRep.AsUpdateable(role).IgnoreColumns(true).IgnoreColumns(u => new { u.DataScope }).ExecuteCommandAsync();
  98. }
  99. /// <summary>
  100. /// 删除角色
  101. /// </summary>
  102. /// <param name="input"></param>
  103. /// <returns></returns>
  104. [HttpPost("/sysRole/delete")]
  105. [SqlSugarUnitOfWork]
  106. public async Task DeleteRole(DeleteRoleInput input)
  107. {
  108. var sysRole = await _sysRoleRep.GetFirstAsync(u => u.Id == input.Id);
  109. if (sysRole.Code == CommonConst.SysAdminRoleCode)
  110. throw Oops.Oh(ErrorCodeEnum.D1019);
  111. await _sysRoleRep.DeleteAsync(sysRole);
  112. // 级联删除角色机构数据
  113. await _sysRoleOrgService.DeleteRoleOrgByRoleId(sysRole.Id);
  114. // 级联删除用户角色数据
  115. await _sysUserRoleService.DeleteUserRoleByRoleId(sysRole.Id);
  116. // 级联删除角色菜单数据
  117. await _sysRoleMenuService.DeleteRoleMenuByRoleId(sysRole.Id);
  118. }
  119. /// <summary>
  120. /// 授权角色菜单
  121. /// </summary>
  122. /// <param name="input"></param>
  123. /// <returns></returns>
  124. [HttpPost("/sysRole/grantMenu")]
  125. public async Task GrantRoleMenu(RoleMenuInput input)
  126. {
  127. await _sysRoleMenuService.GrantRoleMenu(input);
  128. }
  129. /// <summary>
  130. /// 授权角色数据范围
  131. /// </summary>
  132. /// <param name="input"></param>
  133. /// <returns></returns>
  134. [HttpPost("/sysRole/grantData")]
  135. public async Task GrantRoleDataScope(RoleOrgInput input)
  136. {
  137. // 删除所有用户机构缓存
  138. await _sysCacheService.DelByPatternAsync(CacheConst.KeyOrgIdList);
  139. var role = await _sysRoleRep.GetFirstAsync(u => u.Id == input.Id);
  140. var dataScope = input.DataScope;
  141. if (!_userManager.SuperAdmin)
  142. {
  143. // 非超级管理员没有全部数据范围权限
  144. if (dataScope == (int)DataScopeEnum.All)
  145. throw Oops.Oh(ErrorCodeEnum.D1016);
  146. // 若数据范围自定义,则判断授权数据范围是否有权限
  147. if (dataScope == (int)DataScopeEnum.Define)
  148. {
  149. var grantOrgIdList = input.OrgIdList;
  150. if (grantOrgIdList.Count > 0)
  151. {
  152. var orgIdList = await _sysOrgService.GetUserOrgIdList();
  153. if (orgIdList.Count < 1)
  154. throw Oops.Oh(ErrorCodeEnum.D1016);
  155. else if (!grantOrgIdList.All(u => orgIdList.Any(c => c == u)))
  156. throw Oops.Oh(ErrorCodeEnum.D1016);
  157. }
  158. }
  159. }
  160. role.DataScope = (DataScopeEnum)dataScope;
  161. await _sysRoleRep.AsUpdateable(role).UpdateColumns(u => new { u.DataScope }).ExecuteCommandAsync();
  162. await _sysRoleOrgService.GrantRoleOrg(input);
  163. }
  164. /// <summary>
  165. /// 根据角色Id获取菜单树(前端区分父子节点)
  166. /// </summary>
  167. /// <param name="input"></param>
  168. /// <returns></returns>
  169. [HttpGet("/sysRole/ownMenu")]
  170. public async Task<List<SysMenu>> GetRoleOwnMenu([FromQuery] RoleInput input)
  171. {
  172. return await _sysRoleMenuService.GetRoleMenu(new List<long> { input.Id });
  173. }
  174. /// <summary>
  175. /// 根据角色Id获取机构Id集合
  176. /// </summary>
  177. /// <param name="input"></param>
  178. /// <returns></returns>
  179. [HttpGet("/sysRole/ownOrg")]
  180. public async Task<List<long>> GetRoleOwnOrg([FromQuery] RoleInput input)
  181. {
  182. return await _sysRoleOrgService.GetRoleOrgIdList(new List<long> { input.Id });
  183. }
  184. /// <summary>
  185. /// 设置角色状态
  186. /// </summary>
  187. /// <param name="input"></param>
  188. /// <returns></returns>
  189. [HttpPost("/sysRole/setStatus")]
  190. public async Task<int> SetRoleStatus(RoleInput input)
  191. {
  192. if (!Enum.IsDefined(typeof(StatusEnum), input.Status))
  193. throw Oops.Oh(ErrorCodeEnum.D3005);
  194. return await _sysRoleRep.AsUpdateable()
  195. .SetColumns(u => u.Status == (StatusEnum)input.Status)
  196. .Where(u => u.Id == input.Id)
  197. .ExecuteCommandAsync();
  198. }
  199. }
  200. }