using langguanApi.Extensions; using langguanApi.Extensions.AutoDI; using langguanApi.Model; using langguanApi.Model.Entity; using Mapster; using Microsoft.AspNetCore.Mvc.ApiExplorer; using System.Linq.Expressions; namespace langguanApi.Service { [ServiceInjection(InjectionType.Transient)] public class MenuService : BaseService { private ILogger _logger; public MenuService(IConfiguration config, ILogger logger) : base(config, nameof(Menu)) { _logger = logger; } public async Task> GetMenusByParentId(string parentId) { Expression> exp = filter => filter.IsDelete == false && filter.ParentId == parentId; return (await base.GetListWithExp(exp)).OrderBy(x => x.Sort).ToList(); } /// /// 新增菜单 /// /// 菜单实体 /// public async Task AddMenu(AddMenuDto menu) { try { var entity = menu.Adapt(); await base.CreateAsync(entity); } catch (Exception ex) { _logger.LogError($"新增菜单出现异常,请求参数:{Newtonsoft.Json.JsonConvert.SerializeObject(menu)}," + $"请求接口:'api/Menu/AddMenu'," + $"异常信息:{ex.Message}," + $"异常位置:{ex.StackTrace}" ); return new ApiResult { code = 1, msg = "保存菜单失败", data = false }; } finally { _logger.LogInformation($"新增菜单参数:menu:{Newtonsoft.Json.JsonConvert.SerializeObject(menu)}"); } return new ApiResult { code = 0, msg = "保存菜单信息成功", data = true }; } public async Task UpdateMenu(UpdateMenuDto menu) { var entity = menu.Adapt(); await base.UpdateAsync(entity.Id, entity); return new ApiResult(); } /// /// 获取菜单树 /// /// /// public async Task Pager(reqpage input) { List dto = new List(); try { var MenuList = await GetChildList("0");//获取跟节点 if (MenuList.Any()) { foreach (var item in MenuList) { dto.Add(new MenuTreeDto() { Id = item.Id, Name = item.Name, Sort = item.Sort, ParentId = item.ParentId, ParentName = item.ParentName, Children = await GetChildList(item.Id) }); } //筛选数据 if (!string.IsNullOrEmpty(input.key)) { if (dto.Exists(p => p.Name == input.key) || dto.Exists(p => p.Children.Exists(c => c.Name == input.key)) || dto.Exists(p => p.ParentName == input.key)) { if (dto.Exists(p => p.Name == input.key)) { dto = dto.Where(p => p.Name == input.key).ToList(); } else if (dto.Exists(p => p.Children.Exists(c => c.Name == input.key))) { dto = dto.SelectMany(p => p.Children).Where(p => p.Name == input.key).ToList(); } else { dto = dto.SelectMany(p => p.Children).Where(p => p.ParentName == input.key).ToList(); } return new ApiResult() { code = 0, data = dto, msg = "获取菜单列表" }; } else { return new ApiResult() { code = 0, data = null, msg = "获取菜单列表不存在" }; } } } } catch (Exception ex) { _logger.LogError($"获取菜单列表出现异常,请求参数:{Newtonsoft.Json.JsonConvert.SerializeObject(input)}," + $"请求接口:'api/Menu/Pager'," + $"异常信息:{ex.Message}," + $"异常位置:{ex.StackTrace}" ); return new ApiResult { code = 1, msg = "获取菜单列表失败", data = false }; } finally { _logger.LogInformation($"获取菜单列表参数:menu:{Newtonsoft.Json.JsonConvert.SerializeObject(input)}"); } return new ApiResult() { code = 0, data = dto, msg = "获取菜单列表" }; } /// /// 递归获取子菜单列表 /// /// /// public async Task> GetChildList(string parentId) { Expression> exp = filter => filter.IsDelete == false && filter.ParentId == parentId; Expression> expDataSource = filter => filter.IsDelete; var list = (await GetListWithExp(exp)) .OrderBy(x => x.Sort) .ToList().Adapt>(); var DataSourceList = (await GetAsync()) .OrderBy(x => x.Sort) .ToList();//拿到所有数据源,筛选结果 foreach (var item in list) { item.Children = await GetChildList(item.Id); item.ParentName = DataSourceList.FirstOrDefault(p => p.Id == item.ParentId)?.Name; item.ParentId = DataSourceList.FirstOrDefault(p => p.Id == item.ParentId)?.Id; } return list; } } }