SystemDomainService.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. using Hotline.SeedData;
  2. using Hotline.Share.Dtos.Org;
  3. using MapsterMapper;
  4. using Microsoft.AspNetCore.Http;
  5. using XF.Domain.Dependency;
  6. using XF.Domain.Exceptions;
  7. using XF.Domain.Extensions;
  8. using XF.Domain.Repository;
  9. namespace Hotline.Settings;
  10. public class SystemDomainService : ISystemDomainService, IScopeDependency
  11. {
  12. private readonly ISystemOrganizeRepository _organizeRepository;
  13. private readonly IRepository<SystemDicData> _sysDicDataRepository;
  14. private readonly IMapper _mapper;
  15. public SystemDomainService(
  16. ISystemOrganizeRepository organizeRepository,
  17. IRepository<SystemDicData> sysDicDataRepository,
  18. IMapper mapper)
  19. {
  20. _organizeRepository = organizeRepository;
  21. _sysDicDataRepository = sysDicDataRepository;
  22. _mapper = mapper;
  23. }
  24. public async Task<IEnumerable<KeyValuePair<int, string>>> QueryOrgLevelOptionsAsync(
  25. CancellationToken cancellationToken)
  26. {
  27. var max = await _organizeRepository.Queryable()
  28. .MaxAsync(d => d.Level);
  29. var rsp = new List<KeyValuePair<int, string>>();
  30. for (int i = 1; i <= max; i++)
  31. {
  32. rsp.Add(new KeyValuePair<int, string>(i, $"{i.ToChinese()}级部门"));
  33. }
  34. return rsp;
  35. }
  36. public async Task<IEnumerable<KeyValuePair<string, string>>> QueryOrgLevelStringOptionsAsync(
  37. CancellationToken cancellationToken)
  38. {
  39. var rsp = await QueryOrgLevelOptionsAsync(cancellationToken);
  40. return rsp.Select(d => new KeyValuePair<string, string>(d.Key.ToString(), d.Value));
  41. }
  42. public async Task<IReadOnlyList<SystemDicData>> GetSysDicDataByCodeAsync(string code,
  43. CancellationToken cancellationToken = default)
  44. {
  45. return await _sysDicDataRepository.Queryable().Where(x => x.DicTypeCode == code)
  46. .ToTreeAsync(x => x.Children, x => x.ParentId, "");
  47. }
  48. /// <summary>
  49. /// 生成新的部门编码
  50. /// </summary>
  51. /// <param name="parentId"></param>
  52. /// <param name="cancellationToken"></param>
  53. /// <returns></returns>
  54. public async Task<string> GenerateNewOrgCodeAsync(string? parentId, CancellationToken cancellationToken)
  55. {
  56. if (string.IsNullOrEmpty(parentId))
  57. {
  58. //一级部门
  59. var maxCode = await _organizeRepository.Queryable()
  60. .Where(d => d.Level == 1)
  61. .MaxAsync(d => d.Id, cancellationToken);
  62. if (!int.TryParse(maxCode.GetLastOrgId(), out var max))
  63. throw new UserFriendlyException("无效部门编码");
  64. return (max + 1).ToString("000");
  65. }
  66. else
  67. {
  68. var parentOrg = await _organizeRepository.GetAsync(parentId, cancellationToken);
  69. if (parentOrg == null)
  70. throw new UserFriendlyException("无效上级部门编码");
  71. var maxCode = await _organizeRepository.Queryable()
  72. .Where(d => d.ParentId == parentId)
  73. .MaxAsync(d => d.Id, cancellationToken);
  74. if (string.IsNullOrEmpty(maxCode))
  75. return $"{parentOrg.Id}001";
  76. if (!int.TryParse(maxCode.GetLastOrgId(), out var max))
  77. throw new UserFriendlyException("无效部门编码");
  78. return $"{parentOrg.Id}{(max + 1):000}";
  79. }
  80. }
  81. /// <summary>
  82. /// 部门名称是否重复
  83. /// </summary>
  84. /// <param name="orgname"></param>
  85. /// <returns></returns>
  86. public async Task<int> IsNameRepeat(string orgname, CancellationToken cancellationToken)
  87. {
  88. return await _organizeRepository.CountAsync(x => x.Name == orgname, cancellationToken);
  89. }
  90. /// <summary>
  91. /// 部门简称是否重复
  92. /// </summary>
  93. /// <param name="orgShrotName"></param>
  94. /// <param name="cancellationToken"></param>
  95. /// <returns></returns>
  96. public async Task<int> IsShrotNameRepeat(string orgShrotName, CancellationToken cancellationToken)
  97. {
  98. return await _organizeRepository.CountAsync(x => x.ShortName == orgShrotName, cancellationToken);
  99. }
  100. /// <summary>
  101. /// 新增部门
  102. /// </summary>
  103. public async Task AddOrgAsync(AddOrgDto dto, CancellationToken cancellationToken)
  104. {
  105. var org = _mapper.Map<SystemOrganize>(dto);
  106. if (string.IsNullOrEmpty(dto.ParentId))
  107. {
  108. //一级部门
  109. var maxCode = await _organizeRepository.Queryable(includeDeleted:true)
  110. .Where(d => d.Level == 1)
  111. .MaxAsync(d => d.Id, cancellationToken);
  112. if (string.IsNullOrEmpty(maxCode))
  113. {
  114. org.Id = "001";
  115. }
  116. else
  117. {
  118. if (!int.TryParse(maxCode.GetLastOrgId(), out var max))
  119. throw new UserFriendlyException("无效部门编码");
  120. org.Id = $"{OrgSeedData.CenterId}{(max + 1):000}";
  121. }
  122. org.IsCenter = false;
  123. org.Level = 1;
  124. }
  125. else
  126. {
  127. if (dto.ParentId.IsCenter())
  128. throw new UserFriendlyException("暂不支持中心创建下级部门");
  129. var parentOrg = await _organizeRepository.GetAsync(dto.ParentId, cancellationToken);
  130. if (parentOrg == null)
  131. throw new UserFriendlyException("无效上级部门编码");
  132. var maxCode = await _organizeRepository.Queryable(includeDeleted:true)
  133. .Where(d => d.ParentId == dto.ParentId)
  134. .MaxAsync(d => d.Id, cancellationToken);
  135. if (string.IsNullOrEmpty(maxCode))
  136. {
  137. org.Id = $"{parentOrg.Id}001";
  138. }
  139. else
  140. {
  141. if (!int.TryParse(maxCode.GetLastOrgId(), out var max))
  142. throw new UserFriendlyException("无效部门编码");
  143. org.Id = $"{parentOrg.Id}{(max + 1):000}";
  144. }
  145. org.IsCenter = parentOrg.IsCenter;
  146. org.Level = parentOrg.Level + 1;
  147. }
  148. await _organizeRepository.AddAsync(org, cancellationToken);
  149. }
  150. }