Browse Source

Introduce IProductPriceProvider

Resolve #91
Load extra product data in the methods of ProductAppService
pull/96/head
gdlcf88 6 years ago
parent
commit
e536e76dec
  1. 70
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/Products/ProductAppService.cs
  2. 1
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/ProductsApplicationAutoMapperProfile.cs
  3. 14
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/DefaultProductPriceProvider.cs
  4. 4
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/IProductManager.cs
  5. 10
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/IProductPriceProvider.cs
  6. 9
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/PriceDataModel.cs
  7. 17
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain/EasyAbp/EShop/Products/Products/ProductManager.cs

70
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<ProductDto> 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<ProductDto> LoadDtoPriceAsync(Product product, ProductDto productDto, Guid storeId)
protected virtual async Task<ProductDto> 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<ProductDto> 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, ProductDto>(product);
var dto = MapToGetOutputDto(product);
await LoadDtoExtraDataAsync(product, dto, storeId);
await LoadDtosProductTypeUniqueNameAsync(new[] {dto});
return dto;
}
public async Task<ProductDto> 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, ProductDto>(product);
var dto = MapToGetOutputDto(product);
await LoadDtoExtraDataAsync(product, dto, storeId);
await LoadDtosProductTypeUniqueNameAsync(new[] {dto});
return dto;
}
public async Task<ProductDto> 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, ProductDto>(product);
var dto = MapToGetOutputDto(product);
await LoadDtoExtraDataAsync(product, dto, storeId);
await LoadDtosProductTypeUniqueNameAsync(new[] {dto});
return dto;
}
}
}

1
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Application/EasyAbp/EShop/Products/ProductsApplicationAutoMapperProfile.cs

@ -39,6 +39,7 @@ namespace EasyAbp.EShop.Products
CreateMap<ProductSku, ProductSkuDto>()
.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)

14
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<decimal> GetPriceAsync(Product product, ProductSku productSku, Guid storeId)
{
return Task.FromResult(productSku.Price);
}
}
}

4
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<bool> TryIncreaseInventoryAsync(Product product, ProductSku productSku, Guid storeId, int quantity, bool reduceSold);
Task<bool> TryReduceInventoryAsync(Product product, ProductSku productSku, Guid storeId, int quantity, bool increaseSold);
Task<decimal> GetDiscountedPriceAsync(Product product, ProductSku productSku, Guid storeId);
Task<PriceDataModel> GetProductPriceAsync(Product product, ProductSku productSku, Guid storeId);
}
}

10
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<decimal> GetPriceAsync(Product product, ProductSku productSku, Guid storeId);
}
}

9
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; }
}
}

17
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<decimal> GetDiscountedPriceAsync(Product product, ProductSku productSku, Guid storeId)
public virtual async Task<PriceDataModel> 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<IProductDiscountProvider>())
{
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
};
}
}
}
Loading…
Cancel
Save