SysDistrictService.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. using Furion.DependencyInjection;
  2. using Furion.DynamicApiController;
  3. using Furion.FriendlyException;
  4. using Mapster;
  5. using Microsoft.AspNetCore.Mvc;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Threading.Tasks;
  9. namespace Admin.NET.Core.Service
  10. {
  11. /// <summary>
  12. /// 系统行政区域服务
  13. /// </summary>
  14. [ApiDescriptionSettings(Name = "行政区域", Order = 201)]
  15. public class SysDistrictService : IDynamicApiController, ITransient
  16. {
  17. private readonly SqlSugarRepository<SysDistrict> _districtRep;
  18. public SysDistrictService(SqlSugarRepository<SysDistrict> districtRep,
  19. ISysCacheService sysCacheService)
  20. {
  21. _districtRep = districtRep;
  22. }
  23. /// <summary>
  24. /// 获取行政区域列表
  25. /// </summary>
  26. /// <returns></returns>
  27. [HttpGet("/sysDistrict/list")]
  28. public async Task<List<SysDistrict>> GetDistrictList([FromQuery] DistrictInput input)
  29. {
  30. var idList = input.Id > 0 ? await GetChildIdListWithSelfById(input.Id) : new List<long>();
  31. var iSugarQueryable = _districtRep.AsQueryable().OrderBy(u => u.Order)
  32. .WhereIF(idList.Count > 0, u => idList.Contains(u.Id)); // 非超级管理员限制
  33. if (!string.IsNullOrWhiteSpace(input.Name) || !string.IsNullOrWhiteSpace(input.Code) || !string.IsNullOrWhiteSpace(input.Value) || input.Id > 0)
  34. {
  35. return await iSugarQueryable
  36. .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name))
  37. .WhereIF(!string.IsNullOrWhiteSpace(input.Value), u => u.Value.Contains(input.Value))
  38. .WhereIF(!string.IsNullOrWhiteSpace(input.Code), u => u.Code.Contains(input.Code))
  39. .ToListAsync();
  40. }
  41. return await iSugarQueryable.ToTreeAsync(u => u.Children, u => u.Pid, input.Id > 0 ? input.Id : 0);
  42. }
  43. /// <summary>
  44. /// 增加行政区域
  45. /// </summary>
  46. /// <param name="input"></param>
  47. /// <returns></returns>
  48. [HttpPost("/sysDistrict/add")]
  49. public async Task<long> AddDistrict(AddDistrictInput input)
  50. {
  51. var isExist = await _districtRep.IsAnyAsync(u => u.Code == input.Code && u.Name == input.Name);
  52. if (isExist)
  53. throw Oops.Oh(ErrorCodeEnum.D1602);
  54. var sysDistrict = input.Adapt<SysDistrict>();
  55. var newDistrict = await _districtRep.AsInsertable(sysDistrict).ExecuteReturnEntityAsync();
  56. return newDistrict.Id;
  57. }
  58. /// <summary>
  59. /// 更新行政区域
  60. /// </summary>
  61. /// <param name="input"></param>
  62. /// <returns></returns>
  63. [HttpPost("/sysDistrict/update")]
  64. [SqlSugarUnitOfWork]
  65. public async Task UpdateDistrict(UpdateDistrictInput input)
  66. {
  67. if (input.Pid != 0)
  68. {
  69. var pDistrict = await _districtRep.GetFirstAsync(u => u.Id == input.Pid);
  70. _ = pDistrict ?? throw Oops.Oh(ErrorCodeEnum.D1600);
  71. }
  72. if (input.Id == input.Pid)
  73. throw Oops.Oh(ErrorCodeEnum.D1601);
  74. var sysDistrict = await _districtRep.GetFirstAsync(u => u.Id == input.Id);
  75. var isExist = await _districtRep.IsAnyAsync(u => (u.Name == input.Name && u.Code == input.Code) && u.Id != sysDistrict.Id);
  76. if (isExist)
  77. throw Oops.Oh(ErrorCodeEnum.D1602);
  78. // 父Id不能为自己的子节点
  79. var childIdList = await GetChildIdListWithSelfById(input.Id);
  80. if (childIdList.Contains(input.Pid))
  81. throw Oops.Oh(ErrorCodeEnum.D1601);
  82. var district = input.Adapt<SysDistrict>();
  83. await _districtRep.AsUpdateable(district).IgnoreColumns(true).ExecuteCommandAsync();
  84. }
  85. /// <summary>
  86. /// 删除行政区域
  87. /// </summary>
  88. /// <param name="input"></param>
  89. /// <returns></returns>
  90. [HttpPost("/sysDistrict/delete")]
  91. public async Task DeleteDistrict(DeleteDistrictInput input)
  92. {
  93. // 获取本节点对应所有子节点id列表
  94. var treeList = await _districtRep.AsQueryable().ToChildListAsync(u => u.Pid, input.Id);
  95. var idList = treeList.Select(u => u.Id).ToList();
  96. // 级联删除行政区域子节点
  97. await _districtRep.DeleteAsync(u => idList.Contains(u.Id));
  98. }
  99. /// <summary>
  100. /// 根据节点Id获取子节点Id集合(包含自己)
  101. /// </summary>
  102. /// <param name="pid"></param>
  103. /// <returns></returns>
  104. [NonAction]
  105. public async Task<List<long>> GetChildIdListWithSelfById(long pid)
  106. {
  107. var treeList = await _districtRep.AsQueryable().ToChildListAsync(u => u.Pid, pid);
  108. return treeList.Select(u => u.Id).ToList();
  109. }
  110. }
  111. }