feat: 商品列表查询改为数据库分页过滤
All checks were successful
Build and Deploy TenantApi + SkuWorker / build-and-deploy (push) Successful in 1m53s
All checks were successful
Build and Deploy TenantApi + SkuWorker / build-and-deploy (push) Successful in 1m53s
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user