Browse Source

Merge pull request #156 from EasyAbp/orderline-price-overrider

Introduce IOrderLinePriceOverrider
pull/161/head
Super 4 years ago
committed by GitHub
parent
commit
ad6a886b85
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  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 IOrderNumberGenerator _orderNumberGenerator;
private readonly IProductSkuDescriptionProvider _productSkuDescriptionProvider;
private readonly IEnumerable<IOrderLinePriceOverrider> _orderLinePriceOverriders;
public NewOrderGenerator(
IClock clock,
@ -30,7 +31,8 @@ namespace EasyAbp.EShop.Orders.Orders
ICurrentTenant currentTenant,
IServiceProvider serviceProvider,
IOrderNumberGenerator orderNumberGenerator,
IProductSkuDescriptionProvider productSkuDescriptionProvider)
IProductSkuDescriptionProvider productSkuDescriptionProvider,
IEnumerable<IOrderLinePriceOverrider> orderLinePriceOverriders)
{
_clock = clock;
_guidGenerator = guidGenerator;
@ -38,6 +40,7 @@ namespace EasyAbp.EShop.Orders.Orders
_serviceProvider = serviceProvider;
_orderNumberGenerator = orderNumberGenerator;
_productSkuDescriptionProvider = productSkuDescriptionProvider;
_orderLinePriceOverriders = orderLinePriceOverriders;
}
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);
}
var unitPrice = await GetUnitPriceAsync(input, inputOrderLine, product, productSku);
var totalPrice = productSku.Price * inputOrderLine.Quantity;
var totalPrice = unitPrice * inputOrderLine.Quantity;
var orderLine = new OrderLine(
id: _guidGenerator.Create(),
@ -137,7 +142,7 @@ namespace EasyAbp.EShop.Orders.Orders
skuDescription: await _productSkuDescriptionProvider.GenerateAsync(product, productSku),
mediaResources: product.MediaResources,
currency: productSku.Currency,
unitPrice: productSku.Price,
unitPrice: unitPrice,
totalPrice: totalPrice,
totalDiscount: 0,
actualTotalPrice: totalPrice,
@ -149,6 +154,23 @@ namespace EasyAbp.EShop.Orders.Orders
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)
{
// 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()
{
// Arrange
@ -462,5 +462,41 @@ namespace EasyAbp.EShop.Orders.Orders
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