using FlexJobApi.Core; using FlexJobApi.Core.Entities.Common; using Furion.DatabaseAccessor; using Furion.LinqBuilder; 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.CommonServer.Application { /// /// 跟踪Id日志查询 /// public class GetTraceIdLogQueryHandler( IRepository repResourceLog, IRepository repExceptionLog, IRepository repDbAuditLog, IRepository repUser ) : IRequestHandler { private readonly IRepository repResourceLog = repResourceLog; private readonly IRepository repExceptionLog = repExceptionLog; private readonly IRepository repDbAuditLog = repDbAuditLog; private readonly IRepository repUser = repUser; /// /// 跟踪Id日志查询 /// /// /// /// public async Task Handle(GetTraceIdLogQuery request, CancellationToken cancellationToken) { var result = new GetTraceIdLogQueryResult(); result.ResourceLogs = await repResourceLog.AsQueryable().AsNoTracking() .Where(it => it.TraceId == request.TraceId) .ProjectToType() .ToListAsync(); result.ExceptionLogs = await repExceptionLog.AsQueryable().AsNoTracking() .Where(it => it.TraceId == request.TraceId) .ProjectToType() .ToListAsync(); result.DbAuditLogs = await repDbAuditLog.AsQueryable().AsNoTracking() .Where(it => it.TraceId == request.TraceId) .ProjectToType() .ToListAsync(); var userIds = result.ResourceLogs.DistinctSelect(it => it.CreatedUserId.HasValue, it => it.CreatedUserId!.Value) .Union(result.ExceptionLogs.DistinctSelect(it => it.CreatedUserId.HasValue, it => it.CreatedUserId!.Value)) .Union(result.DbAuditLogs.DistinctSelect(it => it.CreatedUserId.HasValue, it => it.CreatedUserId!.Value)) .ToList(); if (userIds.IsNotNull()) { var users = await repUser.AsQueryable().AsNoTracking() .Where(it => userIds.Contains(it.Id)) .ProjectToType() .ToListAsync(); foreach (var log in result.ResourceLogs) { if (log.CreatedUserId.HasValue) log.CreatedUser = users.FirstOrDefault(it => it.Id == log.CreatedUserId); } foreach (var log in result.ExceptionLogs) { if (log.CreatedUserId.HasValue) log.CreatedUser = users.FirstOrDefault(it => it.Id == log.CreatedUserId); } foreach (var log in result.DbAuditLogs) { if (log.CreatedUserId.HasValue) log.CreatedUser = users.FirstOrDefault(it => it.Id == log.CreatedUserId); } } return result; } } }