using MediatR; using TakeoutSaaS.Application.App.Payments.Dto; using TakeoutSaaS.Application.App.Payments.Queries; using TakeoutSaaS.Domain.Payments.Repositories; using TakeoutSaaS.Shared.Abstractions.Results; namespace TakeoutSaaS.Application.App.Payments.Handlers; /// /// 支付记录列表查询处理器。 /// public sealed class SearchPaymentsQueryHandler( IPaymentRepository paymentRepository) : IRequestHandler> { /// public async Task> Handle(SearchPaymentsQuery request, CancellationToken cancellationToken) { // 1. 查询支付记录(可选租户过滤) var payments = await paymentRepository.SearchAsync(request.TenantId, request.Status, cancellationToken); // 2. (空行后) 可选过滤:订单 if (request.OrderId.HasValue) { payments = payments.Where(x => x.OrderId == request.OrderId.Value).ToList(); } // 3. (空行后) 排序与分页 var sorted = ApplySorting(payments, request.SortBy, request.SortDescending); var paged = sorted .Skip((request.Page - 1) * request.PageSize) .Take(request.PageSize) .ToList(); // 4. (空行后) 映射 DTO 并返回分页结果 var items = paged.Select(payment => new PaymentDto { Id = payment.Id, TenantId = payment.TenantId, OrderId = payment.OrderId, Method = payment.Method, Status = payment.Status, Amount = payment.Amount, TradeNo = payment.TradeNo, ChannelTransactionId = payment.ChannelTransactionId, PaidAt = payment.PaidAt, Remark = payment.Remark, Payload = payment.Payload, CreatedAt = payment.CreatedAt }).ToList(); return new PagedResult(items, request.Page, request.PageSize, payments.Count); } private static IOrderedEnumerable ApplySorting( IReadOnlyCollection payments, string? sortBy, bool sortDescending) { return sortBy?.ToLowerInvariant() switch { "paidat" => sortDescending ? payments.OrderByDescending(x => x.PaidAt) : payments.OrderBy(x => x.PaidAt), "status" => sortDescending ? payments.OrderByDescending(x => x.Status) : payments.OrderBy(x => x.Status), "amount" => sortDescending ? payments.OrderByDescending(x => x.Amount) : payments.OrderBy(x => x.Amount), _ => sortDescending ? payments.OrderByDescending(x => x.CreatedAt) : payments.OrderBy(x => x.CreatedAt) }; } }