using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using BaseService.BaseData;
using BaseService.BaseData.BranchManagement;
using BaseService.BaseData.Permissions.Dto;
using BaseService.BaseData.UserBranchRoleManagement;
using BaseService.BaseData.UserBranchRoleManagement.Dto;
using BaseService.Permissions;
using BaseService.Systems.UserManagement;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Authorization;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Identity;
using Volo.Abp.PermissionManagement;
using Volo.Abp.Users;
namespace BaseService.UserManagement
{
[Route("api/base/userbranch")]
//[Authorize(BaseServicePermissions.UserBranch.Default)]
public class UserBranchAppService : ApplicationService, IUserBranchAppService
{
///
/// 角色
///
protected IIdentityRoleRepository IdentityRoleRepository { get; }
private readonly IBranchAppService _branchAppService;
private readonly IUserAppService _userAppService;
private readonly IRepository _repository;
//权限提供者类
private readonly IAbpAuthorizationPolicyProvider _abpAuthorizationPolicyProvider;
///
/// 当前用户
///
protected ICurrentUser CurrentUsers { get; }
protected IIdentityUserRepository UserRepository { get; }
///
/// 权限类
///
protected IPermissionGrantRepository PermissionGrantRepository { get; }
public UserBranchAppService(
IRepository repository,
IIdentityRoleRepository identityRoleRepository,
IAbpAuthorizationPolicyProvider abpAuthorizationPolicyProvider,
ICurrentUser currentUser,
IIdentityUserRepository userRepository,
IPermissionGrantRepository permissionGrantRepository,
IUserAppService userAppService,
IBranchAppService branchAppService)
{
_repository = repository;
IdentityRoleRepository = identityRoleRepository;
_abpAuthorizationPolicyProvider = abpAuthorizationPolicyProvider;
CurrentUsers = currentUser;
UserRepository = userRepository;
_branchAppService = branchAppService;
_userAppService = userAppService;
PermissionGrantRepository = permissionGrantRepository;
}
///
/// 添加
///
///
///
[HttpPost]
[Route("createUpdate")]
//[Authorize(BaseServicePermissions.UserBranch.Create)]
public virtual async Task CreateUpdateAsync(CreateOrUpdateUserBranchDto input)
{
var userBranch = await _repository.FirstOrDefaultAsync(_ => _.UserId == input.UserId && _.BranchId == input.BranchId).ConfigureAwait(false);
if (userBranch == null)
{
//执行添加操作
var createUserBranch = new UserBranch(GuidGenerator.Create(),
input.UserId,
input.BranchId
);
var userBranchRoles = input.Roles;
//选择了角色信息
foreach (var role in userBranchRoles)
{
createUserBranch.AddRole(role.RoleId);
}
await _repository.InsertAsync(createUserBranch).ConfigureAwait(false);
ObjectMapper.Map(createUserBranch);
}
else
{
userBranch.UserId = input.UserId;
userBranch.BranchId = input.BranchId;
//修改角色信息
var getRoleIds = userBranch.Roles.ToList();
if (getRoleIds != null)
{
for (int i = getRoleIds.Count; i > 0; i--)
{
var role = getRoleIds[i - 1];
userBranch.RemoveRole(role.RoleId);
}
var getRoles = input.Roles;
if (getRoles != null)
{
foreach (var role in getRoles)
{
userBranch.AddRole(role.RoleId);
}
}
}
if (input.Roles == null || input.Roles.Count == 0)
{
await _repository.UpdateAsync(userBranch).ConfigureAwait(false);
}
else
{
await _repository.UpdateAsync(userBranch, true).ConfigureAwait(false);
}
ObjectMapper.Map(userBranch);
}
}
//public virtual async Task CreateAsync(CreateOrUpdateUserBranchDto input)
//{
// var exist = await _repository.FirstOrDefaultAsync(_ => _.UserId == input.UserId && _.BranchId == input.BranchId);
// if (exist != null) throw new BusinessException("该资源信息已存在,不要重复添加!");
// var userBranch = new UserBranch(GuidGenerator.Create(),
// input.UserId,
// input.BranchId
// );
// await _repository.InsertAsync(userBranch);
// var userBranchRoles = input.Roles;
// //选择了角色信息
// foreach (var role in userBranchRoles)
// {
// userBranch.AddRole(role.RoleId);
// }
// return ObjectMapper.Map(userBranch);
//}
///
/// 单条删除
///
///
///
///
[HttpPost]
[Route("{userId}/{branchId}/delete")]
[Authorize(BaseServicePermissions.UserBranch.Delete)]
public virtual async Task DeleteUnitAsync(Guid userId, Guid branchId)
{
await _repository.DeleteAsync(p => p.UserId == userId && p.BranchId == branchId).ConfigureAwait(false);
}
///
/// 根据用户ID进行删除
///
///
///
[HttpPost]
[Route("{userId}/delete")]
[Authorize(BaseServicePermissions.UserBranch.Delete)]
public virtual async Task DeleteUnitAsync(Guid userId)
{
await _repository.DeleteAsync(p => p.UserId == userId).ConfigureAwait(false);
}
///
/// 批量删除
///
///
///
[HttpPost]
[Route("delete")]
[Authorize(BaseServicePermissions.UserBranch.Delete)]
public virtual async Task DeleteAsync(List ids)
{
foreach (var id in ids)
{
await _repository.DeleteAsync(_ => _.Id == id).ConfigureAwait(false);
}
}
///
/// 修改操作
///
///
///
///
[HttpPut]
[Route("{id}")]
[Authorize(BaseServicePermissions.UserBranch.Update)]
public virtual async Task UpdateAsync(Guid id, CreateOrUpdateUserBranchDto input)
{
var userBranch = await _repository.FirstOrDefaultAsync(_ => _.UserId == input.UserId && _.BranchId == input.BranchId).ConfigureAwait(false);
userBranch.UserId = input.UserId;
userBranch.BranchId = input.BranchId;
//修改角色信息
var getRoleIds = userBranch.Roles;
if (getRoleIds != null)
{
foreach (var removerole in getRoleIds)
{
userBranch.RemoveRole(removerole.RoleId);
}
var getRoles = input.Roles;
if (getRoles != null)
{
foreach (var role in getRoles)
{
userBranch.AddRole(role.RoleId);
}
}
}
return ObjectMapper.Map(userBranch);
}
///
/// 查单条数据
///
///
///
[HttpGet]
[Route("{id}")]
public virtual async Task GetAsync(Guid id)
{
var result = await _repository.GetAsync(id).ConfigureAwait(false);
return ObjectMapper.Map(result);
}
///
/// 分页查询
///
///
///
[HttpGet]
[Route("paged")]
public virtual async Task> GetPagedListAsync(GetUserBranchInput input)
{
var query = _repository
.WhereIf(input.UserId.HasValue, _ => _.UserId == input.UserId);
var items = await query
.Skip(input.SkipCount)
.Take(input.MaxResultCount)
.ToListAsync().ConfigureAwait(false);
var totalCount = await query.CountAsync().ConfigureAwait(false);
var dtos = ObjectMapper.Map, List>(items);
return new PagedResultDto(totalCount, dtos);
}
///
/// 分支列表(输入用户ID)
///
/// 用户ID
///
[HttpGet]
[Route("{userId}/branches")]
[AllowAnonymous]
public virtual async Task> GetUserBranchsAsync(Guid userId)
{
var dtos = new List();
await GetBranchList(userId, dtos).ConfigureAwait(false);
return dtos;
}
private async Task GetBranchList(Guid userId, List dtos)
{
var userBranches = _repository.Where(_ => _.UserId == userId);
foreach (var query in userBranches)
{
var branch = await _branchAppService.GetAsync(query.BranchId).ConfigureAwait(false);
dtos.Add(new UserBranchDto()
{
BranchId = query.BranchId,
BranchName = branch.Name,
});
}
}
///
/// 分支列表(当前登录用户)
///
///
[HttpGet]
[Route("current/branches")]
[AllowAnonymous]
public virtual async Task> GetCurrentUserBranchesAsync()
{
var dtos = new List();
await GetBranchList(CurrentUser.GetId(), dtos).ConfigureAwait(false);
return dtos;
}
///
/// 获取当前登录用户默认的组织
///
///
[HttpGet]
[Route("user-branch/{userId}")]
[AllowAnonymous]
public virtual async Task GetCurrentUserBranchAsync(Guid userId)
{
var dto = new UserBranchDto();
var userBranche = _repository.FirstOrDefault(_ => _.UserId == userId);
if (userBranche == null)
{
throw new BusinessException("当前登录用户不存在!");
}
var branch = await _branchAppService.GetAsync(userBranche.BranchId).ConfigureAwait(false);
dto.BranchId = branch.Id;
return dto;
}
///
/// 获取当前登录用户所在组织的所有权限信息
///
///
///
[HttpGet]
[Route("{branchId}/auth-config")]
[AllowAnonymous]
public virtual async Task GetAuthConfigAsync(Guid branchId)
{
var authConfig = new ApplicationAuthes();
var policyNames = await _abpAuthorizationPolicyProvider.GetPoliciesNamesAsync().ConfigureAwait(false);
foreach (var policyName in policyNames)
{
authConfig.Policies[policyName] = true;
}
var userId = CurrentUser.GetId();
//获取当前用户的所有权限信息
var grantedPermuissions = await GetUserGrantedPermissionsAsync(userId, branchId).ConfigureAwait(false);
if (grantedPermuissions == null || grantedPermuissions.Count == 0)
{
throw new BusinessException("当前登录用户没有任何权限信息,请找管理员进行维护!");
}
//获取当前用户所在组织的所有角色名
var userRoleName = await GetUserRoleNamesAsync(userId, branchId).ConfigureAwait(false);
if (userRoleName == null)
{
throw new BusinessException("当前登录用户没有任何组织信息,请找管理员进行维护!");
}
foreach (var roleName in userRoleName)
{
var userPermission = grantedPermuissions.Where(_ => _.ProviderKey == roleName);
foreach (var permission in userPermission)
{
//GrantedPolicies的key键不能相同
if (authConfig.GrantedPolicies.ContainsKey(permission.Name))
{
continue;
}
authConfig.GrantedPolicies.Add(permission.Name, true);
}
}
return authConfig;
}
///
/// 权限信息(单个用户)(获取权限调用)
///
///
///
protected virtual async Task> GetUserGrantedPermissionsAsync(Guid userId, Guid branchId)
{
var permissionGrants = new List();
var listRolesName = await GetUserRoleNamesAsync(userId, branchId).ConfigureAwait(false);
if (listRolesName != null)
{
foreach (var rolename in listRolesName)
{
var permissionGrantsInRole = await PermissionGrantRepository.GetListAsync(RolePermissionValueProvider.ProviderName, rolename).ConfigureAwait(false);
if (permissionGrantsInRole != null)
{
foreach (var permiss in permissionGrantsInRole)
{
permissionGrants.Add(permiss);
}
}
}
}
return permissionGrants;
}
///
/// 获取出用户所在当前组织的所有角色名称(获取权限调用)
///
///
///
protected virtual async Task> GetUserRoleNamesAsync(Guid userId, Guid branchId)
{
var userBranch = await _repository.GetAsync(_ => _.UserId == userId && _.BranchId == branchId).ConfigureAwait(false);
var userRoles = userBranch.Roles.ToList();
//var userRoles = await GetUserRolesAsync(userId, branchId);
var roles = await IdentityRoleRepository.GetListAsync().ConfigureAwait(false);
return userRoles.Select(role => roles.FirstOrDefault(p => p.Id == role.RoleId)?.Name)
.Where(roleName => !string.IsNullOrWhiteSpace(roleName)).ToList();
}
///
/// 根据用户ID、组织ID获取该用户角色信息
///
///
///
[HttpGet]
[Route("userRoles/{userId}/{branchId}")]
public virtual async Task> GetUserRolesAsync(Guid userId, Guid branchId)
{
var roleList = new List();
var isInRole = _repository.FirstOrDefault(_ => _.UserId == userId && _.BranchId == branchId);
if (isInRole != null)
{
var userBranch = await _repository.GetAsync(_ => _.UserId == userId && _.BranchId == branchId).ConfigureAwait(false);
var roles = userBranch.Roles.ToList();
foreach (var role in roles)
{
roleList.Add(new UserBranchRole() { RoleId = role.RoleId });
}
}
return roleList;
}
///
/// 根据组织ID查角色信息
///
///
///
[HttpGet]
[Route("userRoles/{branchId}")]
public virtual List GetBranchRolesAsync(Guid branchId)
{
var dtos = new List();
var isInRole = _repository.Where(_ => _.BranchId == branchId);
if (isInRole != null)
{
foreach (var userRoles in isInRole)
{
foreach (var role in userRoles.Roles)
{
dtos.Add(new UserBranchRole() { RoleId = role.RoleId });
}
}
}
return dtos;
//var roleList = new List();
//var isInRole = _repository.Where(_ => _.BranchId == branchId);
//if(isInRole!=null)
//{
// var userBranch = await _repository.GetAsync(_ => _.BranchId == branchId);
// var roles = userBranch.Roles.ToList();
// foreach (var role in roles)
// {
// roleList.Add(new UserBranchRole() { RoleId = role.RoleId });
// }
//}
//return roleList;
}
///
/// 根据用户ID查角色信息
///
///
///
[HttpGet]
[Route("{userId}/userRoles")]
public virtual List GetUserRolesAsync(Guid userId)
{
var dtos = new List();
var isInRole = _repository.Where(_ => _.UserId == userId);
if (isInRole != null)
{
foreach (var userRoles in isInRole)
{
foreach (var role in userRoles.Roles)
{
dtos.Add(new UserBranchRole() { RoleId = role.RoleId });
}
}
}
return dtos;
}
}
}