fix(order): move all-orders list to database pagination
All checks were successful
Build and Deploy TenantApi + SkuWorker / build-and-deploy (push) Successful in 1m50s

This commit is contained in:
2026-02-27 10:32:21 +08:00
parent b1c51c7712
commit 502f80473e
3 changed files with 201 additions and 85 deletions

View File

@@ -21,34 +21,29 @@ public sealed class SearchOrderAllListQueryHandler(
public async Task<PagedResult<OrderAllListItemDto>> Handle(SearchOrderAllListQuery request, CancellationToken cancellationToken)
{
var tenantId = tenantProvider.GetCurrentTenantId();
var page = Math.Max(1, request.Page);
var pageSize = Math.Clamp(request.PageSize, 1, 200);
var orders = await orderRepository.SearchAllOrdersAsync(
var (pagedOrders, totalCount) = await orderRepository.SearchAllOrdersPageAsync(
tenantId,
request.StoreId,
request.StartAt,
request.EndAt,
request.Status,
request.RefundedOnly,
request.DeliveryType,
request.PaymentMethod,
request.Keyword,
request.SortBy,
request.SortDescending,
page,
pageSize,
cancellationToken);
var filteredOrders = orders.ToList();
var refundedSet = await LoadRefundedOrderIdsAsync(filteredOrders, tenantId, cancellationToken);
if (request.RefundedOnly)
{
filteredOrders = filteredOrders
.Where(order => refundedSet.Contains(order.Id))
.ToList();
}
var sorted = ApplySorting(filteredOrders, request.SortBy, request.SortDescending);
var page = Math.Max(1, request.Page);
var pageSize = Math.Clamp(request.PageSize, 1, 200);
var pagedOrders = sorted
.Skip((page - 1) * pageSize)
.Take(pageSize)
.ToList();
var refundedSet = await LoadRefundedOrderIdsAsync(
pagedOrders.Select(order => order.Id).ToList(),
tenantId,
cancellationToken);
var itemsLookup = await orderRepository.GetItemsByOrderIdsAsync(
pagedOrders.Select(order => order.Id).ToList(),
@@ -75,15 +70,14 @@ public sealed class SearchOrderAllListQueryHandler(
})
.ToList();
return new PagedResult<OrderAllListItemDto>(rows, page, pageSize, filteredOrders.Count);
return new PagedResult<OrderAllListItemDto>(rows, page, pageSize, totalCount);
}
private async Task<HashSet<long>> LoadRefundedOrderIdsAsync(
IReadOnlyCollection<Order> orders,
IReadOnlyCollection<long> orderIds,
long tenantId,
CancellationToken cancellationToken)
{
var orderIds = orders.Select(order => order.Id).ToList();
if (orderIds.Count == 0)
{
return [];
@@ -116,23 +110,4 @@ public sealed class SearchOrderAllListQueryHandler(
return $"{first}等{totalQuantity}件";
}
private static IEnumerable<Order> ApplySorting(
IReadOnlyCollection<Order> orders,
string? sortBy,
bool sortDescending)
{
return sortBy?.Trim().ToLowerInvariant() switch
{
"amount" => sortDescending
? orders.OrderByDescending(ResolveDisplayAmount).ThenByDescending(order => order.CreatedAt)
: orders.OrderBy(ResolveDisplayAmount).ThenBy(order => order.CreatedAt),
"status" => sortDescending
? orders.OrderByDescending(order => order.Status).ThenByDescending(order => order.CreatedAt)
: orders.OrderBy(order => order.Status).ThenBy(order => order.CreatedAt),
_ => sortDescending
? orders.OrderByDescending(order => order.CreatedAt)
: orders.OrderBy(order => order.CreatedAt)
};
}
}