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 35c20af2..34e23318 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 @@ -24,6 +24,7 @@ namespace EasyAbp.EShop.Products.Products protected override string GetListPolicyName { get; set; } = null; private readonly IProductManager _productManager; + private readonly IProductPriceProvider _productPriceProvider; private readonly IProductInventoryProvider _productInventoryProvider; private readonly IAttributeOptionIdsSerializer _attributeOptionIdsSerializer; private readonly IProductStoreRepository _productStoreRepository; @@ -32,6 +33,7 @@ namespace EasyAbp.EShop.Products.Products public ProductAppService( IProductManager productManager, + IProductPriceProvider productPriceProvider, IProductInventoryProvider productInventoryProvider, IAttributeOptionIdsSerializer attributeOptionIdsSerializer, IProductStoreRepository productStoreRepository, @@ -39,6 +41,7 @@ namespace EasyAbp.EShop.Products.Products IProductRepository repository) : base(repository) { _productManager = productManager; + _productPriceProvider = productPriceProvider; _productInventoryProvider = productInventoryProvider; _attributeOptionIdsSerializer = attributeOptionIdsSerializer; _productStoreRepository = productStoreRepository; @@ -74,7 +77,12 @@ namespace EasyAbp.EShop.Products.Products await _productManager.CreateAsync(product, input.StoreId, input.CategoryIds); - return MapToGetOutputDto(product); + var dto = MapToGetOutputDto(product); + + await LoadDtoExtraDataAsync(product, dto, input.StoreId); + await LoadDtosProductTypeUniqueNameAsync(new[] {dto}); + + return dto; } public override async Task UpdateAsync(Guid id, CreateUpdateProductDto input) @@ -93,7 +101,12 @@ namespace EasyAbp.EShop.Products.Products await _productManager.UpdateAsync(product, input.CategoryIds); - return MapToGetOutputDto(product); + var dto = MapToGetOutputDto(product); + + await LoadDtoExtraDataAsync(product, dto, input.StoreId); + await LoadDtosProductTypeUniqueNameAsync(new[] {dto}); + + return dto; } protected virtual async Task CheckStoreIsProductOwnerAsync(Guid productId, Guid storeId) @@ -202,9 +215,7 @@ namespace EasyAbp.EShop.Products.Products var dto = MapToGetOutputDto(product); - await LoadDtoInventoryDataAsync(product, dto, storeId); - await LoadDtoPriceAsync(product, dto, storeId); - + await LoadDtoExtraDataAsync(product, dto, storeId); await LoadDtosProductTypeUniqueNameAsync(new[] {dto}); return dto; @@ -233,8 +244,9 @@ namespace EasyAbp.EShop.Products.Products var dto = MapToGetOutputDto(product); - await LoadDtoInventoryDataAsync(product, dto, storeId); - + await LoadDtoExtraDataAsync(product, dto, storeId); + await LoadDtosProductTypeUniqueNameAsync(new[] {dto}); + return dto; } @@ -271,8 +283,7 @@ namespace EasyAbp.EShop.Products.Products { var productDto = MapToGetListOutputDto(product); - await LoadDtoInventoryDataAsync(product, productDto, input.StoreId); - await LoadDtoPriceAsync(product, productDto, input.StoreId); + await LoadDtoExtraDataAsync(product, productDto, input.StoreId); items.Add(productDto); } @@ -300,12 +311,24 @@ namespace EasyAbp.EShop.Products.Products return productDto; } - protected virtual async Task LoadDtoPriceAsync(Product product, ProductDto productDto, Guid storeId) + protected virtual async Task LoadDtoExtraDataAsync(Product product, ProductDto productDto, Guid storeId) { - foreach (var productSkuDto in productDto.ProductSkus) + await LoadDtoInventoryDataAsync(product, productDto, storeId); + await LoadDtoPriceDataAsync(product, productDto, storeId); + + return productDto; + } + + protected virtual async Task LoadDtoPriceDataAsync(Product product, ProductDto productDto, Guid storeId) + { + foreach (var productSku in product.ProductSkus) { - productSkuDto.DiscountedPrice = await _productManager.GetDiscountedPriceAsync(product, - product.ProductSkus.Single(sku => sku.Id == productSkuDto.Id), storeId); + var productSkuDto = productDto.ProductSkus.First(x => x.Id == productSku.Id); + + var priceDataModel = await _productManager.GetProductPriceAsync(product, productSku, storeId); + + productSkuDto.Price = priceDataModel.Price; + productSkuDto.DiscountedPrice = priceDataModel.DiscountedPrice; } if (productDto.ProductSkus.Count > 0) @@ -354,7 +377,12 @@ namespace EasyAbp.EShop.Products.Products await _productManager.CreateSkuAsync(product, sku); - return ObjectMapper.Map(product); + var dto = MapToGetOutputDto(product); + + await LoadDtoExtraDataAsync(product, dto, storeId); + await LoadDtosProductTypeUniqueNameAsync(new[] {dto}); + + return dto; } public async Task UpdateSkuAsync(Guid productId, Guid productSkuId, Guid storeId, UpdateProductSkuDto input) @@ -373,7 +401,12 @@ namespace EasyAbp.EShop.Products.Products await _productManager.UpdateSkuAsync(product, sku); - return ObjectMapper.Map(product); + var dto = MapToGetOutputDto(product); + + await LoadDtoExtraDataAsync(product, dto, storeId); + await LoadDtosProductTypeUniqueNameAsync(new[] {dto}); + + return dto; } public async Task DeleteSkuAsync(Guid productId, Guid productSkuId, Guid storeId) @@ -390,7 +423,12 @@ namespace EasyAbp.EShop.Products.Products await _productManager.DeleteSkuAsync(product, sku); - return ObjectMapper.Map(product); + var dto = MapToGetOutputDto(product); + + await LoadDtoExtraDataAsync(product, dto, storeId); + await LoadDtosProductTypeUniqueNameAsync(new[] {dto}); + + return dto; } } } \ No newline at end of file diff --git a/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/ProductsApplicationAutoMapperProfile.cs b/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/ProductsApplicationAutoMapperProfile.cs index ac7bcc8c..595ef2ad 100644 --- a/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/ProductsApplicationAutoMapperProfile.cs +++ b/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/ProductsApplicationAutoMapperProfile.cs @@ -39,6 +39,7 @@ namespace EasyAbp.EShop.Products CreateMap() .ForSourceMember(entity => entity.SerializedAttributeOptionIds, opt => opt.DoNotValidate()) .Ignore(dto => dto.AttributeOptionIds) + .Ignore(dto => dto.Price) .Ignore(dto => dto.DiscountedPrice) .Ignore(dto => dto.Inventory) .Ignore(dto => dto.Sold) diff --git a/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/DefaultProductPriceProvider.cs b/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/DefaultProductPriceProvider.cs new file mode 100644 index 00000000..7eec983c --- /dev/null +++ b/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/DefaultProductPriceProvider.cs @@ -0,0 +1,14 @@ +using System; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace EasyAbp.EShop.Products.Products +{ + public class DefaultProductPriceProvider : IProductPriceProvider, ITransientDependency + { + public virtual Task GetPriceAsync(Product product, ProductSku productSku, Guid storeId) + { + return Task.FromResult(productSku.Price); + } + } +} \ No newline at end of file diff --git a/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/IProductManager.cs b/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/IProductManager.cs index 02a2ef87..dc7e4ff5 100644 --- a/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/IProductManager.cs +++ b/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/IProductManager.cs @@ -28,7 +28,7 @@ namespace EasyAbp.EShop.Products.Products Task TryIncreaseInventoryAsync(Product product, ProductSku productSku, Guid storeId, int quantity, bool reduceSold); Task TryReduceInventoryAsync(Product product, ProductSku productSku, Guid storeId, int quantity, bool increaseSold); - - Task GetDiscountedPriceAsync(Product product, ProductSku productSku, Guid storeId); + + Task GetProductPriceAsync(Product product, ProductSku productSku, Guid storeId); } } \ No newline at end of file diff --git a/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/IProductPriceProvider.cs b/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/IProductPriceProvider.cs new file mode 100644 index 00000000..e4bd3163 --- /dev/null +++ b/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/IProductPriceProvider.cs @@ -0,0 +1,10 @@ +using System; +using System.Threading.Tasks; + +namespace EasyAbp.EShop.Products.Products +{ + public interface IProductPriceProvider + { + Task GetPriceAsync(Product product, ProductSku productSku, Guid storeId); + } +} \ No newline at end of file diff --git a/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/PriceDataModel.cs b/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/PriceDataModel.cs new file mode 100644 index 00000000..f8168434 --- /dev/null +++ b/modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/PriceDataModel.cs @@ -0,0 +1,9 @@ +namespace EasyAbp.EShop.Products.Products +{ + public class PriceDataModel + { + public decimal Price { get; set; } + + public decimal DiscountedPrice { get; set; } + } +} \ No newline at end of file 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 883d30ef..cd513785 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 @@ -13,17 +13,20 @@ namespace EasyAbp.EShop.Products.Products { private readonly IProductRepository _productRepository; private readonly IProductStoreRepository _productStoreRepository; + private readonly IProductPriceProvider _productPriceProvider; private readonly IProductCategoryRepository _productCategoryRepository; private readonly IProductInventoryProvider _productInventoryProvider; public ProductManager( IProductRepository productRepository, IProductStoreRepository productStoreRepository, + IProductPriceProvider productPriceProvider, IProductCategoryRepository productCategoryRepository, IProductInventoryProvider productInventoryProvider) { _productRepository = productRepository; _productStoreRepository = productStoreRepository; + _productPriceProvider = productPriceProvider; _productCategoryRepository = productCategoryRepository; _productInventoryProvider = productInventoryProvider; } @@ -203,16 +206,22 @@ namespace EasyAbp.EShop.Products.Products increaseSold); } - public virtual async Task GetDiscountedPriceAsync(Product product, ProductSku productSku, Guid storeId) + public virtual async Task GetProductPriceAsync(Product product, ProductSku productSku, Guid storeId) { - var currentPrice = productSku.Price; + var price = await _productPriceProvider.GetPriceAsync(product, productSku, storeId); + + var discountedPrice = price; foreach (var provider in ServiceProvider.GetServices()) { - currentPrice = await provider.GetDiscountedPriceAsync(product, productSku, storeId, currentPrice); + discountedPrice = await provider.GetDiscountedPriceAsync(product, productSku, storeId, discountedPrice); } - return currentPrice; + return new PriceDataModel + { + Price = price, + DiscountedPrice = discountedPrice + }; } } } \ No newline at end of file