using System; using System.Collections.Generic; using System.Linq; using System.Linq.Dynamic.Core; using System.Threading.Tasks; using BaseService.BaseData.BranchManagement.Dto; using BaseService.Permissions; using BaseService.RelationData.Dto; 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.Caching; using Volo.Abp.Domain.Repositories; using Volo.Abp.Identity; using Win.Sfs.Shared.CacheBase; namespace BaseService.BaseData.BranchManagement { [Route("api/base/branch")] [Authorize(BaseServicePermissions.Branch.Default)] public class BranchAppService : ApplicationService, IBranchAppService { private readonly IRepository _repository; private readonly IRepository _repositoryBranchRole; public IIdentityRoleRepository RoleRepository { get; } private readonly IDistributedCache _cache; public BranchAppService(IRepository repository, IRepository repositoryBranchRole, IDistributedCache cache, IIdentityRoleRepository roleRepository) { _repository = repository; _repositoryBranchRole = repositoryBranchRole; RoleRepository = roleRepository; _cache = cache; } [HttpPost] [Authorize(BaseServicePermissions.Branch.Create)] public virtual async Task CreateAsync(CreateOrUpdateBranchDto input) { var exist = await _repository.FirstOrDefaultAsync(_ => _.Name == input.Name).ConfigureAwait(false); if (exist != null) { throw new BusinessException("名称:" + input.Name + "机构已存在"); } var branch = new Branch(GuidGenerator.Create(), CurrentTenant.Id, input.CategoryId, input.Pid, input.Name, "", input.Sort, true, input.Enabled ); var parent = await _repository.FirstOrDefaultAsync(_ => _.Id == input.Pid).ConfigureAwait(false); ChangeOrganizationModel(branch, parent); await _repository.InsertAsync(branch).ConfigureAwait(false); //create cache await _cache.SetAsync(branch.Id.ToString(), branch, CacheStrategyConst.FIVE_MINUTES).ConfigureAwait(false); return ObjectMapper.Map(branch); } [HttpPost] [Route("delete")] [Authorize(BaseServicePermissions.Branch.Delete)] public virtual async Task DeleteAsync(List ids) { foreach (var id in ids) { var branch = await _repository.GetAsync(id).ConfigureAwait(false); await _repository.DeleteAsync(_ => _.CascadeId.Contains(branch.CascadeId)).ConfigureAwait(false); await _cache.DeleteAsync(id.ToString()).ConfigureAwait(false); await _repository.DeleteAsync(_ => _.Id == id).ConfigureAwait(false); } } [HttpGet] [Route("{id}")] [AllowAnonymous] public virtual async Task GetAsync(Guid id) { var result = await GetFromCacheAsync(id).ConfigureAwait(false); return ObjectMapper.Map(result); } protected virtual async Task GetFromCacheAsync(Guid id) { var result = await _cache.GetOrAddAsync( id.ToString(), async () => await GetFromRepository(id).ConfigureAwait(false), CacheStrategyConst.FIVE_MINUTES).ConfigureAwait(false); return result; } private async Task GetFromRepository(Guid id) { return await _repository.GetAsync(id).ConfigureAwait(false); } [HttpGet] [Route("paged")] public virtual async Task> GetPagedListAsync(GetBranchInputDto input) { var query = _repository .WhereIf(!string.IsNullOrWhiteSpace(input.Filter), _ => _.Name.Contains(input.Filter)) .WhereIf(input.CategoryId.HasValue, _ => _.CategoryId == input.CategoryId); if (input.Id.HasValue) { var org = await _repository.GetAsync(input.Id.Value).ConfigureAwait(false); query = query.Where(_ => _.CascadeId.Contains(org.CascadeId)); } var items = await query.OrderBy(input.Sorting ?? "Sort") .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); //var query = _repository // .WhereIf(!string.IsNullOrWhiteSpace(input.Filter), _ => _.Name.Contains(input.Filter)) // .WhereIf(input.CategoryId.HasValue, _ => _.CategoryId == input.CategoryId); //var items = await query.OrderBy(input.Sorting ?? "Sort") // .Skip(input.SkipCount) // .Take(input.MaxResultCount) // .ToListAsync(); //var totalCount = await query.CountAsync(); //var dtos = ObjectMapper.Map, List>(items); //return new PagedResultDto(totalCount, dtos); } [HttpGet] [Route("all")] public virtual async Task> GetAllAsync(Guid? id, string filter) { var items = new List(); if (!string.IsNullOrWhiteSpace(filter)) { items = await _repository.Where(_ => _.Name.Contains(filter)).ToListAsync().ConfigureAwait(false); } else { var query = id.HasValue ? _repository.Where(_ => _.Pid == id) : _repository.Where(_ => _.Pid == null); items = await query.ToListAsync().ConfigureAwait(false); } var dtos = ObjectMapper.Map, List>(items); return new ListResultDto(dtos); } [HttpGet] [Route("children")] public virtual async Task> GetChildrenAsync() { var items = await _repository.GetListAsync().ConfigureAwait(false); var dtos = ObjectMapper.Map, List>(items); return new ListResultDto(dtos); } [HttpPut] [Route("{id}")] [Authorize(BaseServicePermissions.Branch.Update)] public virtual async Task UpdateAsync(Guid id, CreateOrUpdateBranchDto input) { if (input.Pid == id) { throw new BusinessException("机构上级不能为当前机构!"); } var branch = await _repository.FirstOrDefaultAsync(_ => _.Id == id).ConfigureAwait(false); if (branch.Pid != input.Pid) { var parent = await _repository.FirstOrDefaultAsync(_ => _.Id == input.Pid).ConfigureAwait(false); var orgs = await _repository.Where(_ => _.CascadeId.Contains(branch.CascadeId) && _.Id != branch.Id) .OrderBy(_ => _.CascadeId).ToListAsync().ConfigureAwait(false); branch.Pid = input.Pid; ChangeOrganizationModel(branch, parent); foreach (var org in orgs) { if (org.Pid == branch.Id) { ChangeOrganizationModel(org, branch, false); } else { var orgParent = orgs.FirstOrDefault(_ => _.Id == org.Pid); ChangeOrganizationModel(org, orgParent, false); } } } branch.Name = input.Name; branch.Sort = input.Sort; branch.Enabled = input.Enabled; await _cache.SetAsync(id.ToString(), branch, CacheStrategyConst.FIVE_MINUTES).ConfigureAwait(false); return ObjectMapper.Map(branch); } private void ChangeOrganizationModel(Branch org, Branch parent, bool checkLevel = true) { var cascadeId = org.CascadeId == null ? 1 : int.Parse(org.CascadeId.TrimEnd('.').Split('.').Last()); if (checkLevel) { if (parent != null && parent.Leaf) { parent.Leaf = false; } var lastLevel = _repository.Where(_ => _.Pid == org.Pid && _.Id != org.Id) .OrderByDescending(_ => _.CascadeId) .FirstOrDefault(); cascadeId = lastLevel == null ? 1 : int.Parse(lastLevel.CascadeId.TrimEnd('.').Split('.').Last()) + 1; } if (org.Pid.HasValue) { if (parent == null) { throw new BusinessException("上级机构查询错误!"); } org.CascadeId = parent.CascadeId + cascadeId + "."; org.FullName = parent.FullName + "/" + org.Name; } else { org.CascadeId = ".0." + cascadeId + "."; org.FullName = org.Name; } } /// /// 根据分支ID,查找中间表branch-role /// /// /// [HttpGet] [Route("{branchId}/roles")] public virtual async Task> GetRolesAsync(Guid branchId) { var dtos = new List(); var getRoleIds = await GetRolesByBranchIdAsync(branchId).ConfigureAwait(false); var roles = await RoleRepository.GetListAsync().ConfigureAwait(false); if (getRoleIds != null) { foreach (var role in getRoleIds) { dtos.Add(new BranchRoleDto() { RoleId = role.RoleId, RoleName = roles.FirstOrDefault(p => p.Id == role.RoleId)?.Name }); } } return new ListResultDto(dtos); } protected virtual async Task> GetRolesByBranchIdAsync(Guid branchId) { var userBranch = await _repositoryBranchRole.GetAsync(_ => _.BranchId == branchId).ConfigureAwait(false); var roles = userBranch.Roles.ToList(); return roles; } /// /// 用于角色管理:分支和角色互动 /// /// /// /// [HttpGet] [Route("paged-roles/{branchId}")] public virtual async Task> GetPagedRolesAsync(Guid branchId, PagedAndSortedResultRequestDto input) { var listRoles = new List(); var getRoleIds = GetUserRolesAsync(branchId); if (getRoleIds == null) { throw new BusinessException("未找到分支和角色的关联信息!"); } else { var list = await RoleRepository.GetListAsync(input.Sorting, input.MaxResultCount, input.SkipCount).ConfigureAwait(false); foreach (var roleid in getRoleIds) { var filterRole = list.FirstOrDefault(_ => _.Id == roleid.RoleId); listRoles.Add(filterRole); } } var totalCount = listRoles.Count; return new PagedResultDto( totalCount, ObjectMapper.Map, List>(listRoles) ); } protected virtual List GetUserRolesAsync(Guid branchId) { var dtos = new List(); var isInRole = _repositoryBranchRole.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; } } }