namespace Admin.NET.Core.Service; /// /// 系统数据资源服务 /// [ApiDescriptionSettings(Name = "系统数据资源", Order = 189)] public class SysDataResourceService : IDynamicApiController, ITransient { private readonly SqlSugarRepository _sysDataResourceRep; public SysDataResourceService(SqlSugarRepository sysDataResourceRep) { _sysDataResourceRep = sysDataResourceRep; } /// /// 获取数据资源树结构列表 /// /// [HttpGet("/sysDataResource/tree")] public async Task> GetDataResourceTree([FromQuery] DataResourcesTreeInput input) { //通过根节点值来获取当前节点下的树结构数据 var rootValue = !string.IsNullOrEmpty(input.RootValue?.Trim()); SysDataResource rootDataTree = null; if (rootValue) { rootDataTree = await _sysDataResourceRep.AsQueryable() .Where(u => u.Status == StatusEnum.Enable) .Where(u => u.Value == input.RootValue && u.Pid == 0) .FirstAsync(); var childName = !string.IsNullOrEmpty(input.ChildName?.Trim()); //获取根节点下对应的子节点名称id if (childName && rootDataTree != null) { rootDataTree = await _sysDataResourceRep.AsQueryable() .Where(u => u.Status == StatusEnum.Enable) .Where(u => u.Code.Contains(rootDataTree.Code)) .Where(u => u.Name == input.ChildName) .FirstAsync(); } } if (rootDataTree == null) return null; var idList = rootDataTree.Id > 0 ? await GetChildIdListWithSelfById(rootDataTree.Id) : new List(); var iSugarQueryable = _sysDataResourceRep.AsQueryable() .WhereIF(idList.Count > 0, u => idList.Contains(u.Id)) .Where(u => u.Status == StatusEnum.Enable) .OrderBy(u => u.Order); // 非超级管理员限制 var tree = await iSugarQueryable.ToTreeAsync(u => u.Children, u => u.Pid, rootDataTree.Id > 0 ? rootDataTree.Id : 0); //如果包含自己,则添加自己信息 if (input.IsContainSelf) { rootDataTree.Children = new List(); rootDataTree.Children.AddRange(tree); return new List { rootDataTree }; } return tree; } /// /// 获取数据资源列表 /// /// [HttpGet("/sysDataResource/list")] public async Task> GetDataResourceList([FromQuery] DataResourceInput input) { var idList = input.Id > 0 ? await GetChildIdListWithSelfById(input.Id) : new List(); var iSugarQueryable = _sysDataResourceRep.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("/sysDataResource/add")] public async Task AddDataResource(AddDataResourceInput input) { var isExist = await _sysDataResourceRep.IsAnyAsync(u => u.Code == input.Code && u.Name == input.Name); if (isExist) throw Oops.Oh(ErrorCodeEnum.D1602); var newCode = ""; // 生成编码Code和排序(每级2位编码) var sysDataResource = await _sysDataResourceRep.AsQueryable().OrderByDescending(o => o.Code) .FirstAsync(u => u.Pid == input.Pid); if (sysDataResource != null) { newCode = sysDataResource.Code[0..^3] + string.Format("{0:d3}", int.Parse(sysDataResource.Code[^3..]) + 1); } else { //如果没有根节点,默认为1001 if (input.Pid == 0) { newCode = "1001"; } else { sysDataResource = await _sysDataResourceRep.GetFirstAsync(u => u.Id == input.Pid); newCode = sysDataResource.Code + "01"; } } var newDataResource = input.Adapt(); newDataResource.Code = newCode; newDataResource.Order = int.Parse(newCode[^3..]); newDataResource = await _sysDataResourceRep.AsInsertable(newDataResource).ExecuteReturnEntityAsync(); return newDataResource.Id; } /// /// 更新数据资源 /// /// /// [HttpPost("/sysDataResource/update")] [UnitOfWork] public async Task UpdateDataResource(UpdateDataResourceInput input) { if (input.Pid != 0) { var pDataResource = await _sysDataResourceRep.GetFirstAsync(u => u.Id == input.Pid); _ = pDataResource ?? throw Oops.Oh(ErrorCodeEnum.D1600); } if (input.Id == input.Pid) throw Oops.Oh(ErrorCodeEnum.D1601); var sysDataResource = await _sysDataResourceRep.GetFirstAsync(u => u.Id == input.Id); var isExist = await _sysDataResourceRep.IsAnyAsync(u => (u.Name == input.Name && u.Code == input.Code) && u.Id != sysDataResource.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); await _sysDataResourceRep.AsUpdateable(input.Adapt()).IgnoreColumns(true).ExecuteCommandAsync(); } /// /// 删除数据资源 /// /// /// [HttpPost("/sysDataResource/delete")] public async Task DeleteDataResource(DeleteDataResourceInput input) { var sysDataResource = await _sysDataResourceRep.GetFirstAsync(u => u.Id == input.Id); // 获取本节点对应所有子节点id列表 var treeList = await _sysDataResourceRep.AsQueryable().ToChildListAsync(u => u.Pid, input.Id); var idList = treeList.Select(u => u.Id).ToList(); // 级联删除数据资源子节点 await _sysDataResourceRep.DeleteAsync(u => idList.Contains(u.Id)); } /// /// 根据节点Id获取子节点Id集合(包含自己) /// /// /// private async Task> GetChildIdListWithSelfById(long pid) { var treeList = await _sysDataResourceRep.AsQueryable().ToChildListAsync(u => u.Pid, pid); return treeList.Select(u => u.Id).ToList(); } }