Browse Source

Introduce IOrderLinePriceOverrider

pull/156/head
gdlcf88 4 years ago
parent
commit
bc79f52f79
  1. 11
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/IOrderLinePriceOverrider.cs
  2. 28
      modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/NewOrderGenerator.cs
  3. 38
      modules/EasyAbp.EShop.Orders/test/EasyAbp.EShop.Orders.Application.Tests/Orders/OrderAppServiceTests.cs
  4. 22
      modules/EasyAbp.EShop.Orders/test/EasyAbp.EShop.Orders.Application.Tests/Orders/TestOrderLinePriceOverrider.cs

11
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/IOrderLinePriceOverrider.cs

@ -0,0 +1,11 @@
using System.Threading.Tasks;
using EasyAbp.EShop.Orders.Orders.Dtos;
using EasyAbp.EShop.Products.Products.Dtos;
namespace EasyAbp.EShop.Orders.Orders;
public interface IOrderLinePriceOverrider
{
Task<decimal?> GetUnitPriceOrNullAsync(CreateOrderDto input, CreateOrderLineDto inputOrderLine, ProductDto product,
ProductSkuDto productSku);
}

28
modules/EasyAbp.EShop.Orders/src/EasyAbp.EShop.Orders.Application/EasyAbp/EShop/Orders/Orders/NewOrderGenerator.cs

@ -23,6 +23,7 @@ namespace EasyAbp.EShop.Orders.Orders
private readonly IServiceProvider _serviceProvider; private readonly IServiceProvider _serviceProvider;
private readonly IOrderNumberGenerator _orderNumberGenerator; private readonly IOrderNumberGenerator _orderNumberGenerator;
private readonly IProductSkuDescriptionProvider _productSkuDescriptionProvider; private readonly IProductSkuDescriptionProvider _productSkuDescriptionProvider;
private readonly IEnumerable<IOrderLinePriceOverrider> _orderLinePriceOverriders;
public NewOrderGenerator( public NewOrderGenerator(
IClock clock, IClock clock,
@ -30,7 +31,8 @@ namespace EasyAbp.EShop.Orders.Orders
ICurrentTenant currentTenant, ICurrentTenant currentTenant,
IServiceProvider serviceProvider, IServiceProvider serviceProvider,
IOrderNumberGenerator orderNumberGenerator, IOrderNumberGenerator orderNumberGenerator,
IProductSkuDescriptionProvider productSkuDescriptionProvider) IProductSkuDescriptionProvider productSkuDescriptionProvider,
IEnumerable<IOrderLinePriceOverrider> orderLinePriceOverriders)
{ {
_clock = clock; _clock = clock;
_guidGenerator = guidGenerator; _guidGenerator = guidGenerator;
@ -38,6 +40,7 @@ namespace EasyAbp.EShop.Orders.Orders
_serviceProvider = serviceProvider; _serviceProvider = serviceProvider;
_orderNumberGenerator = orderNumberGenerator; _orderNumberGenerator = orderNumberGenerator;
_productSkuDescriptionProvider = productSkuDescriptionProvider; _productSkuDescriptionProvider = productSkuDescriptionProvider;
_orderLinePriceOverriders = orderLinePriceOverriders;
} }
public virtual async Task<Order> GenerateAsync(Guid customerUserId, CreateOrderDto input, public virtual async Task<Order> GenerateAsync(Guid customerUserId, CreateOrderDto input,
@ -119,8 +122,10 @@ namespace EasyAbp.EShop.Orders.Orders
{ {
throw new OrderLineInvalidQuantityException(product.Id, productSku.Id, inputOrderLine.Quantity); throw new OrderLineInvalidQuantityException(product.Id, productSku.Id, inputOrderLine.Quantity);
} }
var unitPrice = await GetUnitPriceAsync(input, inputOrderLine, product, productSku);
var totalPrice = productSku.Price * inputOrderLine.Quantity; var totalPrice = unitPrice * inputOrderLine.Quantity;
var orderLine = new OrderLine( var orderLine = new OrderLine(
id: _guidGenerator.Create(), id: _guidGenerator.Create(),
@ -137,7 +142,7 @@ namespace EasyAbp.EShop.Orders.Orders
skuDescription: await _productSkuDescriptionProvider.GenerateAsync(product, productSku), skuDescription: await _productSkuDescriptionProvider.GenerateAsync(product, productSku),
mediaResources: product.MediaResources, mediaResources: product.MediaResources,
currency: productSku.Currency, currency: productSku.Currency,
unitPrice: productSku.Price, unitPrice: unitPrice,
totalPrice: totalPrice, totalPrice: totalPrice,
totalDiscount: 0, totalDiscount: 0,
actualTotalPrice: totalPrice, actualTotalPrice: totalPrice,
@ -149,6 +154,23 @@ namespace EasyAbp.EShop.Orders.Orders
return orderLine; return orderLine;
} }
protected virtual async Task<decimal> GetUnitPriceAsync(CreateOrderDto input, CreateOrderLineDto inputOrderLine,
ProductDto product, ProductSkuDto productSku)
{
foreach (var overrider in _orderLinePriceOverriders)
{
var overridenUnitPrice =
await overrider.GetUnitPriceOrNullAsync(input, inputOrderLine, product, productSku);
if (overridenUnitPrice is not null)
{
return overridenUnitPrice.Value;
}
}
return productSku.Price;
}
protected virtual Task<string> GetStoreCurrencyAsync(Guid storeId) protected virtual Task<string> GetStoreCurrencyAsync(Guid storeId)
{ {
// Todo: Get real store currency configuration. // Todo: Get real store currency configuration.

38
modules/EasyAbp.EShop.Orders/test/EasyAbp.EShop.Orders.Application.Tests/Orders/OrderAppServiceTests.cs

@ -292,7 +292,7 @@ namespace EasyAbp.EShop.Orders.Orders
}); });
} }
[Fact] [Fact]
public async Task Paid_Order_Should_Not_Be_Auto_Canceled_When_Payment_Overtime() public async Task Paid_Order_Should_Not_Be_Auto_Canceled_When_Payment_Overtime()
{ {
// Arrange // Arrange
@ -462,5 +462,41 @@ namespace EasyAbp.EShop.Orders.Orders
order.CancellationReason.ShouldBe(OrdersConsts.CancellationReason); order.CancellationReason.ShouldBe(OrdersConsts.CancellationReason);
}); });
} }
[Fact]
public async Task Should_Override_Unit_Price()
{
var createOrderDto = new CreateOrderDto
{
CustomerRemark = "customer remark",
StoreId = OrderTestData.Store1Id,
OrderLines = new List<CreateOrderLineDto>
{
new()
{
ProductId = OrderTestData.Product1Id,
ProductSkuId = OrderTestData.ProductSku1Id,
Quantity = 10
},
new()
{
ProductId = OrderTestData.Product1Id,
ProductSkuId = OrderTestData.ProductSku2Id,
Quantity = 2
}
}
};
await WithUnitOfWorkAsync(async () =>
{
var order = await _orderAppService.CreateAsync(createOrderDto);
var orderLine = order.OrderLines.Find(x => x.ProductSkuId == OrderTestData.ProductSku2Id);
order.ProductTotalPrice.ShouldBe(10 * 1m + 2 * TestOrderLinePriceOverrider.Sku2UnitPrice);
orderLine.ShouldNotBeNull();
orderLine.UnitPrice.ShouldBe(TestOrderLinePriceOverrider.Sku2UnitPrice);
orderLine.TotalPrice.ShouldBe(orderLine.Quantity * orderLine.UnitPrice);
});
}
} }
} }

22
modules/EasyAbp.EShop.Orders/test/EasyAbp.EShop.Orders.Application.Tests/Orders/TestOrderLinePriceOverrider.cs

@ -0,0 +1,22 @@
using System.Threading.Tasks;
using EasyAbp.EShop.Orders.Orders.Dtos;
using EasyAbp.EShop.Products.Products.Dtos;
using Volo.Abp.DependencyInjection;
namespace EasyAbp.EShop.Orders.Orders;
public class TestOrderLinePriceOverrider : IOrderLinePriceOverrider, ITransientDependency
{
public static decimal Sku2UnitPrice { get; set; } = 100m;
public async Task<decimal?> GetUnitPriceOrNullAsync(CreateOrderDto input, CreateOrderLineDto inputOrderLine,
ProductDto product, ProductSkuDto productSku)
{
if (inputOrderLine.ProductSkuId == OrderTestData.ProductSku2Id)
{
return Sku2UnitPrice;
}
return null;
}
}
Loading…
Cancel
Save