using BaseService.BaseData.OrganizationManagement.Dto; using BaseService.Permissions; using Microsoft.AspNetCore.Authorization; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Dynamic.Core; using System.Threading.Tasks; using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; using Volo.Abp.Domain.Repositories; namespace BaseService.BaseData.OrganizationManagement { [Authorize(BaseServicePermissions.Organization.Default)] public class OrganizationAppService : ApplicationService, IOrganizationAppService { private readonly IRepository _repository; private readonly IRepository _userOrgRepository; public OrganizationAppService(IRepository repository, IRepository userOrgRepository) { _repository = repository; _userOrgRepository = userOrgRepository; } [Authorize(BaseServicePermissions.Organization.Create)] public async Task Create(CreateOrUpdateOrganizationDto input) { var exist = await _repository.FirstOrDefaultAsync(_ => _.Name == input.Name); if (exist != null) throw new BusinessException("名称:" + input.Name + "机构已存在"); var organization = new Organization(GuidGenerator.Create(), CurrentTenant.Id, input.CategoryId, input.Pid, input.Name, "", input.Sort, true, input.Enabled ); var parent = await _repository.FirstOrDefaultAsync(_ => _.Id == input.Pid); await ChangeOrganizationModel(organization, parent); await _repository.InsertAsync(organization); return ObjectMapper.Map(organization); } [Authorize(BaseServicePermissions.Organization.Delete)] public async Task Delete(List ids) { foreach (var id in ids) { var org = await _repository.GetAsync(id); var parentOrg = await _repository.FirstOrDefaultAsync(_ => _.Id == org.Pid); await _repository.DeleteAsync(_ => _.CascadeId.Contains(org.CascadeId)); if (parentOrg != null) parentOrg.Leaf = true; } } public async Task Get(Guid id) { var result = await _repository.GetAsync(id); return ObjectMapper.Map(result); } /// /// 获取组织列表 /// /// /// public async Task> GetAll(GetOrganizationInputDto input) { var query = (await _repository.GetQueryableAsync()) .WhereIf(!string.IsNullOrWhiteSpace(input.Filter), _ => _.Name.Contains(input.Filter)) .WhereIf(input.CategoryId.HasValue, _ => _.CategoryId == input.CategoryId); //var userOrgs = await _userOrgRepository.GetListAsync(_ => _.UserId == CurrentUser.Id); //var CascadeIds = (await _repository.GetListAsync(_ => userOrgs.Select(s => s.OrganizationId).Contains(_.Id))).Select(_ => _.CascadeId).ToList(); //foreach (var id in CascadeIds) //{ // query = query.Where(_ => _.CascadeId.Contains(id)); //} if (input.Pid.HasValue) { var org = await _repository.GetAsync(input.Pid.Value); query = query.Where(_ => _.CascadeId.Contains(org.CascadeId)); } 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); } /// /// 懒加载组织树,无数据权限过滤 /// /// /// /// public async Task> LoadAll(Guid? id, string filter) { var queryable = await _repository.GetQueryableAsync(); //var userOrgs = await _userOrgRepository.GetListAsync(_ => _.UserId == CurrentUser.Id); //var CascadeIds = (await _repository.GetListAsync(_ => userOrgs.Select(s => s.OrganizationId).Contains(_.Id))).Select(_ => _.CascadeId).ToList(); //foreach (var cscade in CascadeIds) //{ // queryable = queryable.Where(_ => _.CascadeId.Contains(cscade)); //} var items = new List(); if (!string.IsNullOrWhiteSpace(filter)) { items = await queryable.Where(_ => _.Name.Contains(filter)).OrderBy(_ => _.Sort).ToListAsync(); } else { var query = id.HasValue ? queryable.Where(_ => _.Pid == id) : queryable.Where(_ => _.Pid == null); items = await query.OrderBy(_ => _.Sort).ToListAsync(); } var dtos = ObjectMapper.Map, List>(items); return new ListResultDto(dtos); } public async Task> LoadAllNodes() { var items = await _repository.GetListAsync(); var dtos = ObjectMapper.Map, List>(items); return new ListResultDto(dtos); } [Authorize(BaseServicePermissions.Organization.Update)] public async Task Update(Guid id, CreateOrUpdateOrganizationDto input) { if (input.Pid == id) throw new BusinessException("机构上级不能为当前机构!"); var organization = await _repository.FirstOrDefaultAsync(_ => _.Id == id); if (organization.Pid != input.Pid) { var parent = await _repository.FirstOrDefaultAsync(_ => _.Id == input.Pid); var orgs = await (await _repository.GetQueryableAsync()).Where(_ => _.CascadeId.Contains(organization.CascadeId) && _.Id != organization.Id) .OrderBy(_ => _.CascadeId).ToListAsync(); organization.Pid = input.Pid; await ChangeOrganizationModel(organization, parent); foreach (var org in orgs) { if (org.Pid == organization.Id) { await ChangeOrganizationModel(org, organization, false); } else { var orgParent = orgs.FirstOrDefault(_ => _.Id == org.Pid); await ChangeOrganizationModel(org, orgParent, false); } } } organization.Name = input.Name; organization.Sort = input.Sort; organization.Enabled = input.Enabled; return ObjectMapper.Map(organization); } private async Task ChangeOrganizationModel(Organization org, Organization 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 = (await _repository.GetQueryableAsync()).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("上级机构查询错误!"); //TODO:限制层级数 org.CascadeId = parent.CascadeId + cascadeId.ToString("000") + "."; org.FullName = parent.FullName + "/" + org.Name; } else { //TODO:限制层级数 org.CascadeId = ".0." + cascadeId.ToString("000") + "."; org.FullName = org.Name; } } } }