using Microsoft.AspNetCore.Authorization; using Sanhe.Abp.Identity.Dto; using System; using System.Collections.Generic; using System.Threading.Tasks; using Volo.Abp.Application.Dtos; using Volo.Abp.Identity; using Volo.Abp.ObjectExtending; namespace Sanhe.Abp.Identity { [Authorize(IdentityPermissions.OrganizationUnits.Default)] public class OrganizationUnitAppService : IdentityAppServiceBase, IOrganizationUnitAppService { protected OrganizationUnitManager OrganizationUnitManager { get; } protected IOrganizationUnitRepository OrganizationUnitRepository { get; } protected IdentityUserManager UserManager { get; } protected IIdentityRoleRepository RoleRepository { get; } protected IIdentityUserRepository UserRepository { get; } public OrganizationUnitAppService( IdentityUserManager userManager, IIdentityRoleRepository roleRepository, IIdentityUserRepository userRepository, OrganizationUnitManager organizationUnitManager, IOrganizationUnitRepository organizationUnitRepository) { UserManager = userManager; RoleRepository = roleRepository; UserRepository = userRepository; OrganizationUnitManager = organizationUnitManager; OrganizationUnitRepository = organizationUnitRepository; ObjectMapperContext = typeof(AbpIdentityApplicationModule); } [Authorize(IdentityPermissions.OrganizationUnits.Create)] public virtual async Task CreateAsync(OrganizationUnitCreateDto input) { var organizationUnit = new OrganizationUnit( GuidGenerator.Create(), input.DisplayName, input.ParentId, CurrentTenant.Id) { CreationTime = Clock.Now }; input.MapExtraPropertiesTo(organizationUnit); await OrganizationUnitManager.CreateAsync(organizationUnit); await CurrentUnitOfWork.SaveChangesAsync(); return ObjectMapper.Map(organizationUnit); } [Authorize(IdentityPermissions.OrganizationUnits.Delete)] public virtual async Task DeleteAsync(Guid id) { var organizationUnit = await OrganizationUnitRepository.FindAsync(id); if (organizationUnit == null) { return; } await OrganizationUnitManager.DeleteAsync(id); } public virtual async Task> GetRootAsync() { var rootorganizationUnits = await OrganizationUnitManager.FindChildrenAsync(null, recursive: false); return new ListResultDto( ObjectMapper.Map, List>(rootorganizationUnits)); } public virtual async Task> FindChildrenAsync(OrganizationUnitGetChildrenDto input) { var organizationUnitChildren = await OrganizationUnitManager.FindChildrenAsync(input.Id, input.Recursive); return new ListResultDto( ObjectMapper.Map, List>(organizationUnitChildren)); } public virtual async Task GetAsync(Guid id) { var organizationUnit = await OrganizationUnitRepository.FindAsync(id); return ObjectMapper.Map(organizationUnit); } public virtual async Task GetLastChildOrNullAsync(Guid? parentId) { var organizationUnitLastChildren = await OrganizationUnitManager.GetLastChildOrNullAsync(parentId); return ObjectMapper.Map(organizationUnitLastChildren); } public virtual async Task> GetAllListAsync() { var organizationUnits = await OrganizationUnitRepository.GetListAsync(false); return new ListResultDto( ObjectMapper.Map, List>(organizationUnits)); } public virtual async Task> GetListAsync(OrganizationUnitGetByPagedDto input) { var organizationUnitCount = await OrganizationUnitRepository.GetCountAsync(); var organizationUnits = await OrganizationUnitRepository .GetListAsync(input.Sorting, input.MaxResultCount, input.SkipCount, false); return new PagedResultDto(organizationUnitCount, ObjectMapper.Map, List>(organizationUnits)); } [Authorize(IdentityPermissions.OrganizationUnits.ManageRoles)] public virtual async Task> GetRoleNamesAsync(Guid id) { var inOrignizationUnitRoleNames = await UserRepository.GetRoleNamesInOrganizationUnitAsync(id); return new ListResultDto(inOrignizationUnitRoleNames); } [Authorize(IdentityPermissions.OrganizationUnits.ManageRoles)] public virtual async Task> GetUnaddedRolesAsync(Guid id, OrganizationUnitGetUnaddedRoleByPagedDto input) { var organizationUnit = await OrganizationUnitRepository.GetAsync(id); var organizationUnitRoleCount = await OrganizationUnitRepository .GetUnaddedRolesCountAsync(organizationUnit, input.Filter); var organizationUnitRoles = await OrganizationUnitRepository .GetUnaddedRolesAsync(organizationUnit, input.Sorting, input.MaxResultCount, input.SkipCount, input.Filter); return new PagedResultDto(organizationUnitRoleCount, ObjectMapper.Map, List>(organizationUnitRoles)); } [Authorize(IdentityPermissions.OrganizationUnits.ManageRoles)] public virtual async Task> GetRolesAsync(Guid id, PagedAndSortedResultRequestDto input) { var organizationUnit = await OrganizationUnitRepository.GetAsync(id); var organizationUnitRoleCount = await OrganizationUnitRepository .GetRolesCountAsync(organizationUnit); var organizationUnitRoles = await OrganizationUnitRepository .GetRolesAsync(organizationUnit, input.Sorting, input.MaxResultCount, input.SkipCount); return new PagedResultDto(organizationUnitRoleCount, ObjectMapper.Map, List>(organizationUnitRoles)); } [Authorize(IdentityPermissions.OrganizationUnits.ManageUsers)] public virtual async Task> GetUnaddedUsersAsync(Guid id, OrganizationUnitGetUnaddedUserByPagedDto input) { var organizationUnit = await OrganizationUnitRepository.GetAsync(id); var organizationUnitUserCount = await OrganizationUnitRepository .GetUnaddedUsersCountAsync(organizationUnit, input.Filter); var organizationUnitUsers = await OrganizationUnitRepository .GetUnaddedUsersAsync(organizationUnit, input.Sorting, input.MaxResultCount, input.SkipCount, input.Filter); return new PagedResultDto(organizationUnitUserCount, ObjectMapper.Map, List>(organizationUnitUsers)); } [Authorize(IdentityPermissions.OrganizationUnits.ManageUsers)] public virtual async Task> GetUsersAsync(Guid id, GetIdentityUsersInput input) { var organizationUnit = await OrganizationUnitRepository.GetAsync(id); var organizationUnitUserCount = await OrganizationUnitRepository .GetMembersCountAsync(organizationUnit, input.Filter); var organizationUnitUsers = await OrganizationUnitRepository .GetMembersAsync(organizationUnit, input.Sorting, input.MaxResultCount, input.SkipCount, input.Filter); return new PagedResultDto(organizationUnitUserCount, ObjectMapper.Map, List>(organizationUnitUsers)); } [Authorize(IdentityPermissions.OrganizationUnits.Update)] public virtual async Task MoveAsync(Guid id, OrganizationUnitMoveDto input) { await OrganizationUnitManager.MoveAsync(id, input.ParentId); } [Authorize(IdentityPermissions.OrganizationUnits.Update)] public virtual async Task UpdateAsync(Guid id, OrganizationUnitUpdateDto input) { var organizationUnit = await OrganizationUnitRepository.GetAsync(id); organizationUnit.DisplayName = input.DisplayName; input.MapExtraPropertiesTo(organizationUnit); await OrganizationUnitManager.UpdateAsync(organizationUnit); await CurrentUnitOfWork.SaveChangesAsync(); return ObjectMapper.Map(organizationUnit); } [Authorize(IdentityPermissions.OrganizationUnits.ManageUsers)] public virtual async Task AddUsersAsync(Guid id, OrganizationUnitAddUserDto input) { var organizationUnit = await OrganizationUnitRepository.GetAsync(id); var users = await UserRepository.GetListByIdListAsync(input.UserIds, includeDetails: true); // 调用内部方法设置用户组织机构 foreach (var user in users) { await UserManager.AddToOrganizationUnitAsync(user, organizationUnit); } await CurrentUnitOfWork.SaveChangesAsync(); } [Authorize(IdentityPermissions.OrganizationUnits.ManageRoles)] public virtual async Task AddRolesAsync(Guid id, OrganizationUnitAddRoleDto input) { var organizationUnit = await OrganizationUnitRepository.GetAsync(id); var roles = await RoleRepository.GetListByIdListAsync(input.RoleIds, includeDetails: true); foreach (var role in roles) { await OrganizationUnitManager.AddRoleToOrganizationUnitAsync(role, organizationUnit); } await CurrentUnitOfWork.SaveChangesAsync(); } } }