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);
}
}
}