OrganizationAppService.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  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. namespace BaseService.BaseData.OrganizationManagement
  15. {
  16. [Authorize(BaseServicePermissions.Organization.Default)]
  17. public class OrganizationAppService : ApplicationService, IOrganizationAppService
  18. {
  19. private readonly IRepository<Organization, Guid> _repository;
  20. public OrganizationAppService(IRepository<Organization, Guid> repository)
  21. {
  22. _repository = repository;
  23. }
  24. [Authorize(BaseServicePermissions.Organization.Create)]
  25. public async Task<OrganizationDto> Create(CreateOrUpdateOrganizationDto input)
  26. {
  27. var exist = await _repository.FirstOrDefaultAsync(_ => _.Name == input.Name);
  28. if (exist != null) throw new BusinessException("名称:" + input.Name + "机构已存在");
  29. var organization = new Organization(GuidGenerator.Create(),
  30. CurrentTenant.Id,
  31. input.CategoryId,
  32. input.Pid,
  33. input.Name,
  34. "",
  35. input.Sort,
  36. true,
  37. input.Enabled
  38. );
  39. var parent = await _repository.FirstOrDefaultAsync(_ => _.Id == input.Pid);
  40. await ChangeOrganizationModel(organization, parent);
  41. await _repository.InsertAsync(organization);
  42. return ObjectMapper.Map<Organization, OrganizationDto>(organization);
  43. }
  44. [Authorize(BaseServicePermissions.Organization.Delete)]
  45. public async Task Delete(List<Guid> ids)
  46. {
  47. foreach (var id in ids)
  48. {
  49. var org = await _repository.GetAsync(id);
  50. await _repository.DeleteAsync(_ => _.CascadeId.Contains(org.CascadeId));
  51. }
  52. }
  53. public async Task<OrganizationDto> Get(Guid id)
  54. {
  55. var result = await _repository.GetAsync(id);
  56. return ObjectMapper.Map<Organization, OrganizationDto>(result);
  57. }
  58. public async Task<PagedResultDto<OrganizationDto>> GetAll(GetOrganizationInputDto input)
  59. {
  60. var query = (await _repository.GetQueryableAsync())
  61. .WhereIf(!string.IsNullOrWhiteSpace(input.Filter), _ => _.Name.Contains(input.Filter))
  62. .WhereIf(input.CategoryId.HasValue, _ => _.CategoryId == input.CategoryId);
  63. if (input.Id.HasValue)
  64. {
  65. var org = await _repository.GetAsync(input.Id.Value);
  66. query = query.Where(_ => _.CascadeId.Contains(org.CascadeId));
  67. }
  68. var items = await query.OrderBy(input.Sorting ?? "Sort")
  69. .Skip(input.SkipCount)
  70. .Take(input.MaxResultCount)
  71. .ToListAsync();
  72. var totalCount = await query.CountAsync();
  73. var dtos = ObjectMapper.Map<List<Organization>, List<OrganizationDto>>(items);
  74. return new PagedResultDto<OrganizationDto>(totalCount, dtos);
  75. }
  76. public async Task<ListResultDto<OrganizationDto>> LoadAll(Guid? id, string filter)
  77. {
  78. var queryable = await _repository.GetQueryableAsync();
  79. var items = new List<Organization>();
  80. if (!string.IsNullOrWhiteSpace(filter))
  81. {
  82. items = await queryable.Where(_ => _.Name.Contains(filter)).OrderBy(_ => _.Sort).ToListAsync();
  83. }
  84. else
  85. {
  86. var query = id.HasValue ? queryable.Where(_ => _.Pid == id) :
  87. queryable.Where(_ => _.Pid == null);
  88. items = await query.OrderBy(_ => _.Sort).ToListAsync();
  89. }
  90. var dtos = ObjectMapper.Map<List<Organization>, List<OrganizationDto>>(items);
  91. return new ListResultDto<OrganizationDto>(dtos);
  92. }
  93. public async Task<ListResultDto<OrganizationDto>> LoadAllNodes()
  94. {
  95. var items = await _repository.GetListAsync();
  96. var dtos = ObjectMapper.Map<List<Organization>, List<OrganizationDto>>(items);
  97. return new ListResultDto<OrganizationDto>(dtos);
  98. }
  99. [Authorize(BaseServicePermissions.Organization.Update)]
  100. public async Task<OrganizationDto> Update(Guid id, CreateOrUpdateOrganizationDto input)
  101. {
  102. if (input.Pid == id) throw new BusinessException("机构上级不能为当前机构!");
  103. var organization = await _repository.FirstOrDefaultAsync(_ => _.Id == id);
  104. if (organization.Pid != input.Pid)
  105. {
  106. var parent = await _repository.FirstOrDefaultAsync(_ => _.Id == input.Pid);
  107. var orgs = await (await _repository.GetQueryableAsync()).Where(_ => _.CascadeId.Contains(organization.CascadeId) && _.Id != organization.Id)
  108. .OrderBy(_ => _.CascadeId).ToListAsync();
  109. organization.Pid = input.Pid;
  110. await ChangeOrganizationModel(organization, parent);
  111. foreach (var org in orgs)
  112. {
  113. if (org.Pid == organization.Id)
  114. {
  115. await ChangeOrganizationModel(org, organization, false);
  116. }
  117. else
  118. {
  119. var orgParent = orgs.FirstOrDefault(_ => _.Id == org.Pid);
  120. await ChangeOrganizationModel(org, orgParent, false);
  121. }
  122. }
  123. }
  124. organization.Name = input.Name;
  125. organization.Sort = input.Sort;
  126. organization.Enabled = input.Enabled;
  127. return ObjectMapper.Map<Organization, OrganizationDto>(organization);
  128. }
  129. private async Task ChangeOrganizationModel(Organization org, Organization parent, bool checkLevel = true)
  130. {
  131. var cascadeId = org.CascadeId == null ? 1 : int.Parse(org.CascadeId.TrimEnd('.').Split('.').Last());
  132. if (checkLevel)
  133. {
  134. if (parent != null && parent.Leaf) parent.Leaf = false;
  135. var lastLevel = (await _repository.GetQueryableAsync()).Where(_ => _.Pid == org.Pid && _.Id != org.Id)
  136. .OrderByDescending(_ => _.CascadeId)
  137. .FirstOrDefault();
  138. cascadeId = lastLevel == null ? 1 : int.Parse(lastLevel.CascadeId.TrimEnd('.').Split('.').Last()) + 1;
  139. }
  140. if (org.Pid.HasValue)
  141. {
  142. if (parent == null) throw new BusinessException("上级机构查询错误!");
  143. //TODO:限制层级数
  144. org.CascadeId = parent.CascadeId + cascadeId.ToString("000") + ".";
  145. org.FullName = parent.FullName + "/" + org.Name;
  146. }
  147. else
  148. {
  149. //TODO:限制层级数
  150. org.CascadeId = ".0." + cascadeId.ToString("000") + ".";
  151. org.FullName = org.Name;
  152. }
  153. }
  154. }
  155. }