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
All checks were successful
Build and Deploy TenantApi + SkuWorker / build-and-deploy (push) Successful in 1m50s
This commit is contained in:
@@ -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)
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user