using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using Mapster; using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Admin.NET.Core.Service { /// /// 系统行政区域服务 /// [ApiDescriptionSettings(Name = "行政区域", Order = 201)] public class SysDistrictService : IDynamicApiController, ITransient { private readonly SqlSugarRepository _districtRep; public SysDistrictService(SqlSugarRepository districtRep, ISysCacheService sysCacheService) { _districtRep = districtRep; } /// /// 获取行政区域列表 /// /// [HttpGet("/sysDistrict/list")] public async Task> GetDistrictList([FromQuery] DistrictInput input) { var idList = input.Id > 0 ? await GetChildIdListWithSelfById(input.Id) : new List(); var iSugarQueryable = _districtRep.AsQueryable().OrderBy(u => u.Order) .WhereIF(idList.Count > 0, u => idList.Contains(u.Id)); // 非超级管理员限制 if (!string.IsNullOrWhiteSpace(input.Name) || !string.IsNullOrWhiteSpace(input.Code) || !string.IsNullOrWhiteSpace(input.Value) || input.Id > 0) { return await iSugarQueryable .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name)) .WhereIF(!string.IsNullOrWhiteSpace(input.Value), u => u.Value.Contains(input.Value)) .WhereIF(!string.IsNullOrWhiteSpace(input.Code), u => u.Code.Contains(input.Code)) .ToListAsync(); } return await iSugarQueryable.ToTreeAsync(u => u.Children, u => u.Pid, input.Id > 0 ? input.Id : 0); } /// /// 增加行政区域 /// /// /// [HttpPost("/sysDistrict/add")] public async Task AddDistrict(AddDistrictInput input) { var isExist = await _districtRep.IsAnyAsync(u => u.Code == input.Code && u.Name == input.Name); if (isExist) throw Oops.Oh(ErrorCodeEnum.D1602); var sysDistrict = input.Adapt(); var newDistrict = await _districtRep.AsInsertable(sysDistrict).ExecuteReturnEntityAsync(); return newDistrict.Id; } /// /// 更新行政区域 /// /// /// [HttpPost("/sysDistrict/update")] [SqlSugarUnitOfWork] public async Task UpdateDistrict(UpdateDistrictInput input) { if (input.Pid != 0) { var pDistrict = await _districtRep.GetFirstAsync(u => u.Id == input.Pid); _ = pDistrict ?? throw Oops.Oh(ErrorCodeEnum.D1600); } if (input.Id == input.Pid) throw Oops.Oh(ErrorCodeEnum.D1601); var sysDistrict = await _districtRep.GetFirstAsync(u => u.Id == input.Id); var isExist = await _districtRep.IsAnyAsync(u => (u.Name == input.Name && u.Code == input.Code) && u.Id != sysDistrict.Id); if (isExist) throw Oops.Oh(ErrorCodeEnum.D1602); // 父Id不能为自己的子节点 var childIdList = await GetChildIdListWithSelfById(input.Id); if (childIdList.Contains(input.Pid)) throw Oops.Oh(ErrorCodeEnum.D1601); var district = input.Adapt(); await _districtRep.AsUpdateable(district).IgnoreColumns(true).ExecuteCommandAsync(); } /// /// 删除行政区域 /// /// /// [HttpPost("/sysDistrict/delete")] public async Task DeleteDistrict(DeleteDistrictInput input) { // 获取本节点对应所有子节点id列表 var treeList = await _districtRep.AsQueryable().ToChildListAsync(u => u.Pid, input.Id); var idList = treeList.Select(u => u.Id).ToList(); // 级联删除行政区域子节点 await _districtRep.DeleteAsync(u => idList.Contains(u.Id)); } /// /// 根据节点Id获取子节点Id集合(包含自己) /// /// /// [NonAction] public async Task> GetChildIdListWithSelfById(long pid) { var treeList = await _districtRep.AsQueryable().ToChildListAsync(u => u.Pid, pid); return treeList.Select(u => u.Id).ToList(); } } }