OrganizationAppService.cs 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. using BaseService.BaseData.OrganizationManagement.Dto;
  2. using BaseService.Permissions;
  3. using Microsoft.AspNetCore.Authorization;
  4. using Microsoft.EntityFrameworkCore;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Linq.Dynamic.Core;
  9. using System.Threading.Tasks;
  10. using Volo.Abp;
  11. using Volo.Abp.Application.Dtos;
  12. using Volo.Abp.Application.Services;
  13. using Volo.Abp.Domain.Repositories;
  14. using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
  15. namespace BaseService.BaseData.OrganizationManagement
  16. {
  17. [Authorize(BaseServicePermissions.Organization.Default)]
  18. public class OrganizationAppService : ApplicationService, IOrganizationAppService
  19. {
  20. private readonly IRepository<Organization, Guid> _repository;
  21. private readonly IRepository<UserOrganization> _userOrgRepository;
  22. public OrganizationAppService(IRepository<Organization, Guid> repository, IRepository<UserOrganization> userOrgRepository)
  23. {
  24. _repository = repository;
  25. _userOrgRepository = userOrgRepository;
  26. }
  27. [Authorize(BaseServicePermissions.Organization.Create)]
  28. public async Task<OrganizationDto> Create(CreateOrUpdateOrganizationDto input)
  29. {
  30. var exist = await _repository.FirstOrDefaultAsync(_ => _.Name == input.Name);
  31. if (exist != null) throw new BusinessException("名称:" + input.Name + "机构已存在");
  32. var organization = new Organization(GuidGenerator.Create(),
  33. CurrentTenant.Id,
  34. input.CategoryId,
  35. input.Pid,
  36. input.Name,
  37. "",
  38. input.Sort,
  39. true,
  40. input.Enabled
  41. );
  42. var parent = await _repository.FirstOrDefaultAsync(_ => _.Id == input.Pid);
  43. await ChangeOrganizationModel(organization, parent);
  44. await _repository.InsertAsync(organization);
  45. return ObjectMapper.Map<Organization, OrganizationDto>(organization);
  46. }
  47. [Authorize(BaseServicePermissions.Organization.Delete)]
  48. public async Task Delete(List<Guid> ids)
  49. {
  50. foreach (var id in ids)
  51. {
  52. var org = await _repository.GetAsync(id);
  53. await _repository.DeleteAsync(_ => _.CascadeId.Contains(org.CascadeId));
  54. }
  55. }
  56. public async Task<OrganizationDto> Get(Guid id)
  57. {
  58. var result = await _repository.GetAsync(id);
  59. return ObjectMapper.Map<Organization, OrganizationDto>(result);
  60. }
  61. public async Task<PagedResultDto<OrganizationDto>> GetAll(GetOrganizationInputDto input)
  62. {
  63. var query = (await _repository.GetQueryableAsync())
  64. .WhereIf(!string.IsNullOrWhiteSpace(input.Filter), _ => _.Name.Contains(input.Filter))
  65. .WhereIf(input.CategoryId.HasValue, _ => _.CategoryId == input.CategoryId);
  66. //改为linq to sql
  67. var userOrgs = await _userOrgRepository.GetListAsync(_ => _.UserId == CurrentUser.Id);
  68. var CascadeIds = (await _repository.GetListAsync(_ => userOrgs.Select(s => s.OrganizationId).Contains(_.Id))).Select(_ => _.CascadeId).ToList();
  69. foreach (var id in CascadeIds)
  70. {
  71. query = query.Where(_ => _.CascadeId.Contains(id));
  72. }
  73. if (input.Id.HasValue)
  74. {
  75. var org = await _repository.GetAsync(input.Id.Value);
  76. query = query.Where(_ => _.CascadeId.Contains(org.CascadeId));
  77. }
  78. var items = await query.OrderBy(input.Sorting ?? "Sort")
  79. .Skip(input.SkipCount)
  80. .Take(input.MaxResultCount)
  81. .ToListAsync();
  82. var totalCount = await query.CountAsync();
  83. var dtos = ObjectMapper.Map<List<Organization>, List<OrganizationDto>>(items);
  84. return new PagedResultDto<OrganizationDto>(totalCount, dtos);
  85. }
  86. public async Task<ListResultDto<OrganizationDto>> LoadAll(Guid? id, string filter)
  87. {
  88. var queryable = await _repository.GetQueryableAsync();
  89. //改为linq to sql
  90. var userOrgs = await _userOrgRepository.GetListAsync(_ => _.UserId == CurrentUser.Id);
  91. var CascadeIds = (await _repository.GetListAsync(_ => userOrgs.Select(s => s.OrganizationId).Contains(_.Id))).Select(_ => _.CascadeId).ToList();
  92. foreach (var cscade in CascadeIds)
  93. {
  94. queryable = queryable.Where(_ => _.CascadeId.Contains(cscade));
  95. }
  96. var items = new List<Organization>();
  97. if (!string.IsNullOrWhiteSpace(filter))
  98. {
  99. items = await queryable.Where(_ => _.Name.Contains(filter)).OrderBy(_ => _.Sort).ToListAsync();
  100. }
  101. else
  102. {
  103. var query = id.HasValue ? queryable.Where(_ => _.Pid == id) :
  104. queryable.Where(_ => _.Pid == null);
  105. items = await query.OrderBy(_ => _.Sort).ToListAsync();
  106. }
  107. var dtos = ObjectMapper.Map<List<Organization>, List<OrganizationDto>>(items);
  108. return new ListResultDto<OrganizationDto>(dtos);
  109. }
  110. public async Task<ListResultDto<OrganizationDto>> LoadAllNodes()
  111. {
  112. var items = await _repository.GetListAsync();
  113. var dtos = ObjectMapper.Map<List<Organization>, List<OrganizationDto>>(items);
  114. return new ListResultDto<OrganizationDto>(dtos);
  115. }
  116. [Authorize(BaseServicePermissions.Organization.Update)]
  117. public async Task<OrganizationDto> Update(Guid id, CreateOrUpdateOrganizationDto input)
  118. {
  119. if (input.Pid == id) throw new BusinessException("机构上级不能为当前机构!");
  120. var organization = await _repository.FirstOrDefaultAsync(_ => _.Id == id);
  121. if (organization.Pid != input.Pid)
  122. {
  123. var parent = await _repository.FirstOrDefaultAsync(_ => _.Id == input.Pid);
  124. var orgs = await (await _repository.GetQueryableAsync()).Where(_ => _.CascadeId.Contains(organization.CascadeId) && _.Id != organization.Id)
  125. .OrderBy(_ => _.CascadeId).ToListAsync();
  126. organization.Pid = input.Pid;
  127. await ChangeOrganizationModel(organization, parent);
  128. foreach (var org in orgs)
  129. {
  130. if (org.Pid == organization.Id)
  131. {
  132. await ChangeOrganizationModel(org, organization, false);
  133. }
  134. else
  135. {
  136. var orgParent = orgs.FirstOrDefault(_ => _.Id == org.Pid);
  137. await ChangeOrganizationModel(org, orgParent, false);
  138. }
  139. }
  140. }
  141. organization.Name = input.Name;
  142. organization.Sort = input.Sort;
  143. organization.Enabled = input.Enabled;
  144. return ObjectMapper.Map<Organization, OrganizationDto>(organization);
  145. }
  146. private async Task ChangeOrganizationModel(Organization org, Organization parent, bool checkLevel = true)
  147. {
  148. var cascadeId = org.CascadeId == null ? 1 : int.Parse(org.CascadeId.TrimEnd('.').Split('.').Last());
  149. if (checkLevel)
  150. {
  151. if (parent != null && parent.Leaf) parent.Leaf = false;
  152. var lastLevel = (await _repository.GetQueryableAsync()).Where(_ => _.Pid == org.Pid && _.Id != org.Id)
  153. .OrderByDescending(_ => _.CascadeId)
  154. .FirstOrDefault();
  155. cascadeId = lastLevel == null ? 1 : int.Parse(lastLevel.CascadeId.TrimEnd('.').Split('.').Last()) + 1;
  156. }
  157. if (org.Pid.HasValue)
  158. {
  159. if (parent == null) throw new BusinessException("上级机构查询错误!");
  160. //TODO:限制层级数
  161. org.CascadeId = parent.CascadeId + cascadeId.ToString("000") + ".";
  162. org.FullName = parent.FullName + "/" + org.Name;
  163. }
  164. else
  165. {
  166. //TODO:限制层级数
  167. org.CascadeId = ".0." + cascadeId.ToString("000") + ".";
  168. org.FullName = org.Name;
  169. }
  170. }
  171. }
  172. }