using FlexJobApi.Core; using Furion.DatabaseAccessor; using Furion.FriendlyException; 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.UserServer.Application.Menus.Queries { /// /// 查询菜单详情 /// /// public class GetMenuQueryHandler(IRepository rep) : IRequestHandler { private readonly IRepository rep = rep; /// public async Task Handle(GetMenuQuery request, CancellationToken cancellationToken) { var model = await rep.AsQueryable().AsNoTracking() .Where(it => it.Id == request.Id) .ProjectToType() .FirstOrDefaultAsync(cancellationToken); if (model == null) throw Oops.Oh(EnumErrorCodeType.s404, "该菜单"); var roleMenuIds = request.RoleId.HasValue ? rep.Change().Where(it => it.RoleId == request.RoleId).DistinctSelect(it => it.MenuId) : []; model.IsChecked = roleMenuIds.Contains(model.Id); var items = await rep.AsQueryable().AsNoTracking() .OrderBy(it => it.Sort).ThenBy(it => it.CreatedTime) .Where(it => it.ParentId == model.Id) .Where(it => it.Type == EnumMenuType.Button || it.Type == EnumMenuType.Field) .ProjectToType() .ToListAsync(cancellationToken); model.Groups = items.GroupBy(it => it.Group ?? "default") .Select(it => new GetMenuQueryResultGroup { Group = it.Key, ButtonLocations = it .Where(l => l.Type == EnumMenuType.Button) .GroupBy(l => l.Location ?? "default") .Select(l => new GetMenuQueryResultButtonLocation { Location = l.Key, Buttons = l .Select(b => { b.IsChecked = roleMenuIds.Contains(b.Id); return b; }) .ToList() .Adapt>() }) .ToList(), Fields = it .Where(f => f.Type == EnumMenuType.Field) .Select(f => { f.IsChecked = roleMenuIds.Contains(f.Id); return f; }) .ToList() .Adapt>() }) .ToList(); return model; } } }