using MediatR; using TakeoutSaaS.Application.App.Orders.Dto; using TakeoutSaaS.Application.App.Orders.Queries; using TakeoutSaaS.Domain.Orders.Repositories; using TakeoutSaaS.Shared.Abstractions.Results; using TakeoutSaaS.Shared.Abstractions.Tenancy; namespace TakeoutSaaS.Application.App.Orders.Handlers; /// /// 订单列表查询处理器。 /// public sealed class SearchOrdersQueryHandler( IOrderRepository orderRepository, ITenantProvider tenantProvider) : IRequestHandler> { private readonly IOrderRepository _orderRepository = orderRepository; private readonly ITenantProvider _tenantProvider = tenantProvider; /// public async Task> Handle(SearchOrdersQuery request, CancellationToken cancellationToken) { var tenantId = _tenantProvider.GetCurrentTenantId(); var orders = await _orderRepository.SearchAsync(tenantId, request.Status, request.PaymentStatus, cancellationToken); if (request.StoreId.HasValue) { orders = orders.Where(x => x.StoreId == request.StoreId.Value).ToList(); } if (!string.IsNullOrWhiteSpace(request.OrderNo)) { var orderNo = request.OrderNo.Trim(); orders = orders .Where(x => x.OrderNo.Contains(orderNo, StringComparison.OrdinalIgnoreCase)) .ToList(); } var sorted = ApplySorting(orders, request.SortBy, request.SortDescending); var paged = sorted .Skip((request.Page - 1) * request.PageSize) .Take(request.PageSize) .ToList(); var items = paged.Select(order => new OrderDto { Id = order.Id, TenantId = order.TenantId, OrderNo = order.OrderNo, StoreId = order.StoreId, Channel = order.Channel, DeliveryType = order.DeliveryType, Status = order.Status, PaymentStatus = order.PaymentStatus, CustomerName = order.CustomerName, CustomerPhone = order.CustomerPhone, TableNo = order.TableNo, QueueNumber = order.QueueNumber, ReservationId = order.ReservationId, ItemsAmount = order.ItemsAmount, DiscountAmount = order.DiscountAmount, PayableAmount = order.PayableAmount, PaidAmount = order.PaidAmount, PaidAt = order.PaidAt, FinishedAt = order.FinishedAt, CancelledAt = order.CancelledAt, CancelReason = order.CancelReason, Remark = order.Remark, CreatedAt = order.CreatedAt }).ToList(); return new PagedResult(items, request.Page, request.PageSize, orders.Count); } private static IOrderedEnumerable ApplySorting( IReadOnlyCollection orders, string? sortBy, bool sortDescending) { return sortBy?.ToLowerInvariant() switch { "paidat" => sortDescending ? orders.OrderByDescending(x => x.PaidAt) : orders.OrderBy(x => x.PaidAt), "status" => sortDescending ? orders.OrderByDescending(x => x.Status) : orders.OrderBy(x => x.Status), "payableamount" => sortDescending ? orders.OrderByDescending(x => x.PayableAmount) : orders.OrderBy(x => x.PayableAmount), _ => sortDescending ? orders.OrderByDescending(x => x.CreatedAt) : orders.OrderBy(x => x.CreatedAt) }; } }