From cc89701db176260d47159dcc45dc25767817f323 Mon Sep 17 00:00:00 2001 From: gdlcf88 Date: Wed, 6 May 2020 11:36:08 +0800 Subject: [PATCH] Close #26: Use IProductInventoryProvider to get real inventories --- .../Products/Products/ProductAppService.cs | 39 ++++++++++++++----- .../DefaultProductInventoryProvider.cs | 22 +++++++---- .../Products/IProductInventoryProvider.cs | 5 ++- .../EShop/Products/Products/ProductManager.cs | 12 +++--- 4 files changed, 54 insertions(+), 24 deletions(-) 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 9a090964..efe5c5ff 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 @@ -25,6 +25,7 @@ namespace EasyAbp.EShop.Products.Products protected override string GetListPolicyName { get; set; } = null; private readonly IProductManager _productManager; + private readonly IProductInventoryProvider _productInventoryProvider; private readonly IAttributeOptionIdsSerializer _attributeOptionIdsSerializer; private readonly IProductStoreRepository _productStoreRepository; private readonly IProductCategoryRepository _productCategoryRepository; @@ -32,12 +33,14 @@ namespace EasyAbp.EShop.Products.Products public ProductAppService( IProductManager productManager, + IProductInventoryProvider productInventoryProvider, IAttributeOptionIdsSerializer attributeOptionIdsSerializer, IProductStoreRepository productStoreRepository, IProductCategoryRepository productCategoryRepository, IProductRepository repository) : base(repository) { _productManager = productManager; + _productInventoryProvider = productInventoryProvider; _attributeOptionIdsSerializer = attributeOptionIdsSerializer; _productStoreRepository = productStoreRepository; _productCategoryRepository = productCategoryRepository; @@ -211,21 +214,37 @@ namespace EasyAbp.EShop.Products.Products public virtual async Task GetAsync(Guid id, Guid storeId) { - var dto = await base.GetAsync(id); + await CheckGetPolicyAsync(); + var product = await GetEntityByIdAsync(id); + + var dto = MapToGetOutputDto(product); + if (!dto.IsPublished) { await CheckStoreIsProductOwnerAsync(id, storeId); } - // Todo: get real inventory. - + await LoadRealInventoriesAsync(product, dto, storeId); + dto.CategoryIds = (await _productCategoryRepository.GetListByProductIdAsync(dto.Id)) .Select(x => x.CategoryId).ToList(); return dto; } + protected virtual async Task LoadRealInventoriesAsync(Product product, ProductDto productDto, Guid storeId) + { + var inventoryDict = await _productInventoryProvider.GetInventoryDictionaryAsync(product, storeId); + + foreach (var productSkuDto in productDto.ProductSkus) + { + productSkuDto.Inventory = inventoryDict[productSkuDto.Id]; + } + + return productDto; + } + public override async Task> GetListAsync(GetProductListDto input) { await CheckGetListPolicyAsync(); @@ -250,14 +269,16 @@ namespace EasyAbp.EShop.Products.Products query = ApplySorting(query, input); query = ApplyPaging(query, input); - var entities = await AsyncQueryableExecuter.ToListAsync(query); + var products = await AsyncQueryableExecuter.ToListAsync(query); - // Todo: get real inventory. + var items = new List(); + + foreach (var product in products) + { + items.Add(await LoadRealInventoriesAsync(product, MapToGetListOutputDto(product), input.StoreId)); + } - return new PagedResultDto( - totalCount, - entities.Select(MapToGetListOutputDto).ToList() - ); + return new PagedResultDto(totalCount, items); } public async Task DeleteAsync(Guid id, Guid storeId) diff --git a/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/DefaultProductInventoryProvider.cs b/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/DefaultProductInventoryProvider.cs index 82b6c5bc..00815a03 100644 --- a/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/DefaultProductInventoryProvider.cs +++ b/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/DefaultProductInventoryProvider.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Threading.Tasks; using Volo.Abp.DependencyInjection; @@ -7,24 +8,29 @@ namespace EasyAbp.EShop.Products.Products [Dependency(TryRegister = true)] public class DefaultProductInventoryProvider : IProductInventoryProvider, ITransientDependency { - public virtual async Task IsInventorySufficientAsync(Product product, ProductSku productSku, Guid storeId, int quantity) + public virtual Task GetInventoryAsync(Product product, ProductSku productSku, Guid storeId) { - var inventory = await GetInventoryAsync(product, productSku, storeId); - - return product.InventoryStrategy == InventoryStrategy.NoNeed || inventory - quantity >= 0; + return Task.FromResult(productSku.Inventory); } - public virtual Task GetInventoryAsync(Product product, ProductSku productSku, Guid storeId) + public virtual Task> GetInventoryDictionaryAsync(Product product, Guid storeId) { - return Task.FromResult(productSku.Inventory); + var dict = new Dictionary(); + + foreach (var productSku in product.ProductSkus) + { + dict[productSku.Id] = productSku.Inventory; + } + + return Task.FromResult(dict); } - public Task TryIncreaseInventoryAsync(Product product, ProductSku productSku, Guid storeId, int quantity) + public virtual Task TryIncreaseInventoryAsync(Product product, ProductSku productSku, Guid storeId, int quantity) { return Task.FromResult(productSku.TryIncreaseInventory(quantity)); } - public Task TryReduceInventoryAsync(Product product, ProductSku productSku, Guid storeId, int quantity) + public virtual Task TryReduceInventoryAsync(Product product, ProductSku productSku, Guid storeId, int quantity) { return Task.FromResult(productSku.TryReduceInventory(quantity)); } diff --git a/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/IProductInventoryProvider.cs b/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/IProductInventoryProvider.cs index 9a392e09..46450cc0 100644 --- a/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/IProductInventoryProvider.cs +++ b/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/IProductInventoryProvider.cs @@ -1,13 +1,14 @@ using System; +using System.Collections.Generic; using System.Threading.Tasks; namespace EasyAbp.EShop.Products.Products { public interface IProductInventoryProvider { - Task IsInventorySufficientAsync(Product product, ProductSku productSku, Guid storeId, int quantity); - Task GetInventoryAsync(Product product, ProductSku productSku, Guid storeId); + + Task> GetInventoryDictionaryAsync(Product product, Guid storeId); Task TryIncreaseInventoryAsync(Product product, ProductSku productSku, Guid storeId, int quantity); diff --git a/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/ProductManager.cs b/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/ProductManager.cs index f082c3e2..854f68c7 100644 --- a/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/ProductManager.cs +++ b/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/ProductManager.cs @@ -16,22 +16,24 @@ namespace EasyAbp.EShop.Products.Products _productInventoryProvider = productInventoryProvider; } - public async Task IsInventorySufficientAsync(Product product, ProductSku productSku, Guid storeId, int quantity) + public virtual async Task IsInventorySufficientAsync(Product product, ProductSku productSku, Guid storeId, int quantity) { - return await _productInventoryProvider.IsInventorySufficientAsync(product, productSku, storeId, quantity); + var inventory = await _productInventoryProvider.GetInventoryAsync(product, productSku, storeId); + + return product.InventoryStrategy == InventoryStrategy.NoNeed || inventory - quantity >= 0; } - public async Task GetInventoryAsync(Product product, ProductSku productSku, Guid storeId) + public virtual async Task GetInventoryAsync(Product product, ProductSku productSku, Guid storeId) { return await _productInventoryProvider.GetInventoryAsync(product, productSku, storeId); } - public async Task TryIncreaseInventoryAsync(Product product, ProductSku productSku, Guid storeId, int quantity) + public virtual async Task TryIncreaseInventoryAsync(Product product, ProductSku productSku, Guid storeId, int quantity) { return await _productInventoryProvider.TryIncreaseInventoryAsync(product, productSku, storeId, quantity); } - public async Task TryReduceInventoryAsync(Product product, ProductSku productSku, Guid storeId, int quantity) + public virtual async Task TryReduceInventoryAsync(Product product, ProductSku productSku, Guid storeId, int quantity) { return await _productInventoryProvider.TryReduceInventoryAsync(product, productSku, storeId, quantity); }