using System.Linq; using System.Threading.Tasks; using ZhonTai.Admin.Core.Dto; using ZhonTai.Admin.Domain.Role; using ZhonTai.Admin.Domain.RolePermission; using ZhonTai.Admin.Services.Role.Dto; using ZhonTai.Admin.Domain.Role.Dto; using ZhonTai.DynamicApi; using ZhonTai.DynamicApi.Attributes; using Microsoft.AspNetCore.Mvc; using ZhonTai.Admin.Core.Consts; using ZhonTai.Admin.Core.Attributes; using ZhonTai.Admin.Domain.UserRole; using ZhonTai.Admin.Domain.User; using ZhonTai.Admin.Domain; using ZhonTai.Admin.Domain.Org; using ZhonTai.Admin.Domain.RoleOrg; using System.Collections.Generic; namespace ZhonTai.Admin.Services.Role; /// /// 角色服务 /// [DynamicApi(Area = AdminConsts.AreaName)] public class RoleService : BaseService, IRoleService, IDynamicApi { private IRoleRepository _roleRepository => LazyGetRequiredService(); private IUserRepository _userRepository => LazyGetRequiredService(); private IUserRoleRepository _userRoleRepository => LazyGetRequiredService(); private IRolePermissionRepository _rolePermissionRepository => LazyGetRequiredService(); private IRoleOrgRepository _roleOrgRepository => LazyGetRequiredService(); public RoleService() { } /// /// 查询角色 /// /// /// public async Task GetAsync(long id) { var roleEntity = await _roleRepository.Select .WhereDynamic(id) .IncludeMany(a => a.Orgs.Select(b => new OrgEntity { Id = b.Id })) .ToOneAsync(a => new RoleGetOutput { Orgs = a.Orgs }); var output = Mapper.Map(roleEntity); return output; } /// /// 查询角色列表 /// /// /// public async Task> GetListAsync([FromQuery]RoleGetListInput input) { var list = await _roleRepository.Select .WhereIf(input.Name.NotNull(), a => a.Name.Contains(input.Name)) .OrderBy(a => new {a.ParentId, a.Sort}) .ToListAsync(); return list; } /// /// 查询角色列表 /// /// /// [HttpPost] public async Task> GetPageAsync(PageInput input) { var key = input.Filter?.Name; var list = await _roleRepository.Select .WhereDynamicFilter(input.DynamicFilter) .WhereIf(key.NotNull(), a => a.Name.Contains(key)) .Count(out var total) .OrderByDescending(true, c => c.Id) .Page(input.CurrentPage, input.PageSize) .ToListAsync(); var data = new PageOutput() { List = list, Total = total }; return data; } /// /// 查询角色用户列表 /// /// /// public async Task> GetRoleUserListAsync([FromQuery] UserGetRoleUserListInput input) { var list = await _userRepository.Select.From() .InnerJoin(a => a.t2.UserId == a.t1.Id) .Where(a => a.t2.RoleId == input.RoleId) .WhereIf(input.Name.NotNull(), a => a.t1.Name.Contains(input.Name)) .OrderByDescending(a => a.t1.Id) .ToListAsync(); return list; } /// /// 新增角色用户 /// /// /// public async Task AddRoleUserAsync(RoleAddRoleUserListInput input) { var roleId = input.RoleId; var userIds = await _userRoleRepository.Select.Where(a => a.RoleId == roleId).ToListAsync(a => a.UserId); var insertUserIds = input.UserIds.Except(userIds); if (insertUserIds != null && insertUserIds.Any()) { var userRoleList = insertUserIds.Select(userId => new UserRoleEntity { UserId = userId, RoleId = roleId }).ToList(); await _userRoleRepository.InsertAsync(userRoleList); } var clearUserIds = userIds.Concat(input.UserIds).Distinct(); foreach (var userId in clearUserIds) { await Cache.DelAsync(CacheKeys.DataPermission + userId); } } /// /// 移除角色用户 /// /// /// [HttpPost] public async Task RemoveRoleUserAsync(RoleAddRoleUserListInput input) { var userIds = input.UserIds; if (userIds != null && userIds.Any()) { await _userRoleRepository.Where(a => a.RoleId == input.RoleId && input.UserIds.Contains(a.UserId)).ToDelete().ExecuteAffrowsAsync(); } foreach (var userId in userIds) { await Cache.DelAsync(CacheKeys.DataPermission + userId); } } private async Task AddRoleOrgAsync(long roleId, long[] orgIds) { if (orgIds != null && orgIds.Any()) { var roleOrgs = orgIds.Select(orgId => new RoleOrgEntity { RoleId = roleId, OrgId = orgId }).ToList(); await _roleOrgRepository.InsertAsync(roleOrgs); } } /// /// 添加 /// /// /// public async Task AddAsync(RoleAddInput input) { if (await _roleRepository.Select.AnyAsync(a => a.ParentId == input.ParentId && a.Name == input.Name)) { throw ResultOutput.Exception($"此{(input.Type == RoleType.Group ? "分组" : "角色")}已存在"); } if (input.Code.NotNull() && await _roleRepository.Select.AnyAsync(a => a.ParentId == input.ParentId && a.Code == input.Code)) { throw ResultOutput.Exception($"此{(input.Type == RoleType.Group ? "分组" : "角色")}编码已存在"); } var entity = Mapper.Map(input); if (entity.Sort == 0) { var sort = await _roleRepository.Select.Where(a => a.ParentId == input.ParentId).MaxAsync(a => a.Sort); entity.Sort = sort + 1; } await _roleRepository.InsertAsync(entity); if (input.DataScope == DataScope.Custom) { await AddRoleOrgAsync(entity.Id, input.OrgIds); } return entity.Id; } /// /// 修改 /// /// /// public async Task UpdateAsync(RoleUpdateInput input) { var entity = await _roleRepository.GetAsync(input.Id); if (!(entity?.Id > 0)) { throw ResultOutput.Exception("角色不存在"); } if (await _roleRepository.Select.AnyAsync(a => a.ParentId == input.ParentId && a.Id != input.Id && a.Name == input.Name)) { throw ResultOutput.Exception($"此{(input.Type == RoleType.Group ? "分组" : "角色")}已存在"); } if (input.Code.NotNull() && await _roleRepository.Select.AnyAsync(a => a.ParentId == input.ParentId && a.Id != input.Id && a.Code == input.Code)) { throw ResultOutput.Exception($"此{(input.Type == RoleType.Group ? "分组" : "角色")}编码已存在"); } Mapper.Map(input, entity); await _roleRepository.UpdateAsync(entity); await _roleOrgRepository.DeleteAsync(a => a.RoleId == entity.Id); if (input.DataScope == DataScope.Custom) { await AddRoleOrgAsync(entity.Id, input.OrgIds); } var userIds = await _userRoleRepository.Select.Where(a => a.RoleId == entity.Id).ToListAsync(a => a.UserId); foreach (var userId in userIds) { await Cache.DelAsync(CacheKeys.DataPermission + userId); } } /// /// 彻底删除 /// /// /// [AdminTransaction] public virtual async Task DeleteAsync(long id) { var roleIdList = await _roleRepository.GetChildIdListAsync(id); var userIds = await _userRoleRepository.Select.Where(a => roleIdList.Contains(a.RoleId)).ToListAsync(a => a.UserId); //删除用户角色 await _userRoleRepository.DeleteAsync(a => a.UserId == id); //删除角色权限 await _rolePermissionRepository.DeleteAsync(a => roleIdList.Contains(a.RoleId)); //删除角色 await _roleRepository.DeleteAsync(a => roleIdList.Contains(a.Id)); foreach (var userId in userIds) { await Cache.DelAsync(CacheKeys.DataPermission + userId); } } /// /// 批量彻底删除 /// /// /// [AdminTransaction] public virtual async Task BatchDeleteAsync(long[] ids) { var roleIdList = await _roleRepository.GetChildIdListAsync(ids); var userIds = await _userRoleRepository.Select.Where(a => roleIdList.Contains(a.RoleId)).ToListAsync(a => a.UserId); //删除用户角色 await _userRoleRepository.DeleteAsync(a => roleIdList.Contains(a.RoleId)); //删除角色权限 await _rolePermissionRepository.DeleteAsync(a => roleIdList.Contains(a.RoleId)); //删除角色 await _roleRepository.Where(a => roleIdList.Contains(a.Id)).AsTreeCte().ToDelete().ExecuteAffrowsAsync(); foreach (var userId in userIds) { await Cache.DelAsync(CacheKeys.DataPermission + userId); } } /// /// 删除 /// /// /// [AdminTransaction] public virtual async Task SoftDeleteAsync(long id) { var roleIdList = await _roleRepository.GetChildIdListAsync(id); var userIds = await _userRoleRepository.Select.Where(a => roleIdList.Contains(a.RoleId)).ToListAsync(a => a.UserId); await _userRoleRepository.DeleteAsync(a => roleIdList.Contains(a.RoleId)); await _rolePermissionRepository.DeleteAsync(a => roleIdList.Contains(a.RoleId)); await _roleRepository.SoftDeleteRecursiveAsync(a => roleIdList.Contains(a.Id)); foreach (var userId in userIds) { await Cache.DelAsync(CacheKeys.DataPermission + userId); } } /// /// 批量删除 /// /// /// [AdminTransaction] public virtual async Task BatchSoftDeleteAsync(long[] ids) { var roleIdList = await _roleRepository.GetChildIdListAsync(ids); var userIds = await _userRoleRepository.Select.Where(a => ids.Contains(a.RoleId)).ToListAsync(a => a.UserId); await _userRoleRepository.DeleteAsync(a => roleIdList.Contains(a.RoleId)); await _rolePermissionRepository.DeleteAsync(a => roleIdList.Contains(a.RoleId)); await _roleRepository.SoftDeleteRecursiveAsync(a => roleIdList.Contains(a.Id)); foreach (var userId in userIds) { await Cache.DelAsync(CacheKeys.DataPermission + userId); } } }