using FlexJobApi.Core; using FlexJobApi.Core.Models; using Furion.DatabaseAccessor; using Mapster; using MediatR; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.User.Application { /// /// 查询菜单列表 /// public class GetMenusQueryHandler( IRepository rep) : IRequestHandler> { private readonly IRepository rep = rep; /// public async Task> Handle(GetMenusQuery request, CancellationToken cancellationToken) { var q = rep.AsQueryable().AsNoTracking() .Where(it => it.UserType == request.UserType && it.ClientType == request.ClientType) .Where(it => it.Type == EnumMenuType.Menu || it.Type == EnumMenuType.Page || it.Type == EnumMenuType.Modal); var all = await q.ProjectToType().ToListAsync(); var models = all.Where(it => it.ParentId == null).ToList(); var roleMenuIds = request.RoleId.HasValue ? rep.Change().Where(it => it.RoleId == request.RoleId).DistinctSelect(it => it.MenuId) : []; LoopChildrens(models, all, roleMenuIds); return models; } /// /// 递归赋值下级菜单 /// /// /// /// private void LoopChildrens(List models, List all, List roleMenuIds) { foreach (var item in models) { item.IsChecked = roleMenuIds.Contains(item.Id); item.Children = all.Where(it => it.ParentId == item.Id).ToList(); if (item.Children.IsNotNull()) { LoopChildrens(item.Children, all, roleMenuIds); } } } } }