feat: 商品列表查询改为数据库分页过滤
All checks were successful
Build and Deploy TenantApi + SkuWorker / build-and-deploy (push) Successful in 1m53s

This commit is contained in:
2026-02-26 10:50:20 +08:00
parent 8f64eb897b
commit 3f5ca9c3ee
3 changed files with 173 additions and 54 deletions

View File

@@ -23,62 +23,26 @@ public sealed class SearchProductsQueryHandler(
{
var tenantId = _tenantProvider.GetCurrentTenantId();
// 沽清查询需要包含 OffShelf 状态后再做二次过滤
var repositoryStatus = request.IsSoldOut == true ? null : request.Status;
var products = await _productRepository.SearchAsync(
tenantId,
request.StoreId,
request.CategoryId,
repositoryStatus,
cancellationToken);
IEnumerable<Domain.Products.Entities.Product> filtered = products;
if (!string.IsNullOrWhiteSpace(request.Keyword))
// 沽清查询不走 Status 过滤,保持“仅沽清”口径
var status = request.IsSoldOut == true ? null : request.Status;
var filter = new ProductSearchFilter
{
var keyword = request.Keyword.Trim().ToLowerInvariant();
filtered = filtered.Where(item =>
item.Name.ToLower().Contains(keyword) ||
item.SpuCode.ToLower().Contains(keyword));
}
if (request.Kind.HasValue)
{
filtered = filtered.Where(item => item.Kind == request.Kind.Value);
}
if (request.IsSoldOut == true)
{
filtered = filtered.Where(item => item.SoldoutMode.HasValue);
}
else if (request.Status == Domain.Products.Enums.ProductStatus.OffShelf)
{
filtered = filtered.Where(item => !item.SoldoutMode.HasValue);
}
var filteredList = filtered.ToList();
var sorted = ApplySorting(filteredList, request.SortBy, request.SortDescending);
var paged = sorted
.Skip((request.Page - 1) * request.PageSize)
.Take(request.PageSize)
.ToList();
var items = paged.Select(MapToDto).ToList();
return new PagedResult<ProductDto>(items, request.Page, request.PageSize, filteredList.Count);
}
private static IOrderedEnumerable<Domain.Products.Entities.Product> ApplySorting(
IReadOnlyCollection<Domain.Products.Entities.Product> products,
string? sortBy,
bool sortDescending)
{
return sortBy?.ToLowerInvariant() switch
{
"name" => sortDescending ? products.OrderByDescending(x => x.Name) : products.OrderBy(x => x.Name),
"price" => sortDescending ? products.OrderByDescending(x => x.Price) : products.OrderBy(x => x.Price),
"status" => sortDescending ? products.OrderByDescending(x => x.Status) : products.OrderBy(x => x.Status),
_ => sortDescending ? products.OrderByDescending(x => x.CreatedAt) : products.OrderBy(x => x.CreatedAt)
TenantId = tenantId,
StoreId = request.StoreId,
CategoryId = request.CategoryId,
Status = status,
Kind = request.Kind,
Keyword = request.Keyword,
IsSoldOut = request.IsSoldOut,
Page = request.Page,
PageSize = request.PageSize,
SortBy = request.SortBy,
SortDescending = request.SortDescending
};
var (products, totalCount) = await _productRepository.SearchPagedAsync(filter, cancellationToken);
var items = products.Select(MapToDto).ToList();
return new PagedResult<ProductDto>(items, request.Page, request.PageSize, totalCount);
}
private static ProductDto MapToDto(Domain.Products.Entities.Product product) => new()