diff --git a/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/ProductCategories/ProductCategoryAppService.cs b/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/ProductCategories/ProductCategoryAppService.cs index 9b8dd950..991d7fd3 100644 --- a/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/ProductCategories/ProductCategoryAppService.cs +++ b/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/ProductCategories/ProductCategoryAppService.cs @@ -8,11 +8,12 @@ using Volo.Abp.Application.Services; namespace EasyAbp.EShop.Products.ProductCategories { - public class ProductCategoryAppService : ReadOnlyAppService, + public class ProductCategoryAppService : + ReadOnlyAppService, IProductCategoryAppService { protected override string GetListPolicyName { get; set; } = ProductsPermissions.Products.Manage; - + private readonly IProductCategoryRepository _repository; public ProductCategoryAppService(IProductCategoryRepository repository) : base(repository) @@ -20,10 +21,11 @@ namespace EasyAbp.EShop.Products.ProductCategories _repository = repository; } - protected override async Task> CreateFilteredQueryAsync(GetProductCategoryListDto input) + protected override async Task> CreateFilteredQueryAsync( + GetProductCategoryListDto input) { var queryable = await Repository.GetQueryableAsync(); - + if (input.CategoryId.HasValue) { queryable = queryable.Where(x => x.CategoryId == input.CategoryId); @@ -37,6 +39,12 @@ namespace EasyAbp.EShop.Products.ProductCategories return queryable; } + protected override IQueryable ApplyDefaultSorting(IQueryable query) + { + return query.OrderBy(x => x.DisplayOrder) + .ThenBy(x => x.Id); + } + [RemoteService(false)] public override Task GetAsync(Guid id) { diff --git a/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/Products/ProductAppService.cs b/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/Products/ProductAppService.cs index 0f1f3bc6..9cc63dd6 100644 --- a/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/Products/ProductAppService.cs +++ b/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/Products/ProductAppService.cs @@ -64,6 +64,12 @@ namespace EasyAbp.EShop.Products.Products .WhereIf(!input.ShowUnpublished, x => x.IsPublished); } + protected override IQueryable ApplyDefaultSorting(IQueryable query) + { + return query.OrderBy(x => x.DisplayOrder) + .ThenBy(x => x.Id); + } + protected override Product MapToEntity(CreateUpdateProductDto createInput) { var product = base.MapToEntity(createInput); @@ -481,12 +487,12 @@ namespace EasyAbp.EShop.Products.Products protected virtual ProductDto SortAttributesAndOptions(ProductDto productDto) { - productDto.ProductAttributes = productDto.ProductAttributes.OrderByDescending(x => x.DisplayOrder).ToList(); + productDto.ProductAttributes = productDto.ProductAttributes.OrderBy(x => x.DisplayOrder).ToList(); foreach (var productAttributeDto in productDto.ProductAttributes) { productAttributeDto.ProductAttributeOptions = productAttributeDto.ProductAttributeOptions - .OrderByDescending(x => x.DisplayOrder).ToList(); + .OrderBy(x => x.DisplayOrder).ToList(); } return productDto; diff --git a/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/Products/ProductViewAppService.cs b/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/Products/ProductViewAppService.cs index efd24881..69a83754 100644 --- a/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/Products/ProductViewAppService.cs +++ b/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/Products/ProductViewAppService.cs @@ -15,7 +15,8 @@ using Volo.Abp.Uow; namespace EasyAbp.EShop.Products.Products { - public class ProductViewAppService : MultiStoreReadOnlyAppService, + public class ProductViewAppService : + MultiStoreReadOnlyAppService, IProductViewAppService { protected override string GetPolicyName { get; set; } = null; @@ -27,7 +28,7 @@ namespace EasyAbp.EShop.Products.Products private readonly IProductManager _productManager; private readonly IProductRepository _productRepository; private readonly IProductViewRepository _repository; - + public ProductViewAppService( IProductViewCacheKeyProvider productViewCacheKeyProvider, IDistributedCache cache, @@ -41,7 +42,7 @@ namespace EasyAbp.EShop.Products.Products _productRepository = productRepository; _repository = repository; } - + protected override async Task> CreateFilteredQueryAsync(GetProductListInput input) { var query = input.CategoryId.HasValue @@ -54,10 +55,16 @@ namespace EasyAbp.EShop.Products.Products .WhereIf(!input.ShowUnpublished, x => x.IsPublished); } + protected override IQueryable ApplyDefaultSorting(IQueryable query) + { + return query.OrderBy(x => x.DisplayOrder) + .ThenBy(x => x.Id); + } + public override async Task> GetListAsync(GetProductListInput input) { await CheckGetListPolicyAsync(); - + if (input.ShowHidden || input.ShowUnpublished) { await CheckMultiStorePolicyAsync(input.StoreId, ProductsPermissions.Products.Manage); @@ -67,7 +74,7 @@ namespace EasyAbp.EShop.Products.Products { await BuildStoreProductViewsAsync(input.StoreId); } - + var query = await CreateFilteredQueryAsync(input); var totalCount = await AsyncExecuter.CountAsync(query); @@ -103,7 +110,7 @@ namespace EasyAbp.EShop.Products.Products await BuildStoreProductViewsAsync(productView.StoreId); productView = await GetEntityByIdAsync(id); - + return await MapToGetOutputDtoAsync(productView); } @@ -120,7 +127,7 @@ namespace EasyAbp.EShop.Products.Products var productView = ObjectMapper.Map(product); await FillPriceInfoWithRealPriceAsync(product, productView); - + await _repository.InsertAsync(productView); } @@ -134,7 +141,7 @@ namespace EasyAbp.EShop.Products.Products await SettingProvider.GetOrNullAsync(ProductsSettings.ProductView.CacheDurationSeconds))) }); } - + protected virtual async Task FillPriceInfoWithRealPriceAsync(Product product, ProductView productView) { if (product.ProductSkus.IsNullOrEmpty()) @@ -143,7 +150,7 @@ namespace EasyAbp.EShop.Products.Products } decimal? min = null, max = null; - + foreach (var productSku in product.ProductSkus) { var priceDataModel = await _productManager.GetRealPriceAsync(product, productSku); @@ -162,4 +169,4 @@ namespace EasyAbp.EShop.Products.Products productView.SetPrices(min, max); } } -} +} \ No newline at end of file