Browse Source

Add `RuleData` in OrderDiscountPreviewInfoModel

pull/256/head
gdlcf88 3 years ago
parent
commit
9f7caf736c
  1. 2
      common.props
  2. 19
      modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Products/OrderDiscountPreviewInfoModel.cs
  3. 4
      modules/EasyAbp.EShop.Products/test/EasyAbp.EShop.Products.Application.Tests/Products/DemoProductDiscountProvider.cs
  4. 15
      plugins/Promotions/src/EasyAbp.EShop.Plugins.Promotions.Domain/EasyAbp/EShop/Plugins/Promotions/PromotionTypes/MinQuantityOrderDiscount/MinQuantityOrderDiscountPromotionHandler.cs

2
common.props

@ -1,7 +1,7 @@
<Project>
<PropertyGroup>
<LangVersion>latest</LangVersion>
<Version>4.0.0-preview.1</Version>
<Version>4.0.0-preview.2</Version>
<NoWarn>$(NoWarn);CS1591</NoWarn>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Authors>EasyAbp Team</Authors>

19
modules/EasyAbp.EShop.Products/src/EasyAbp.EShop.Products.Domain.Shared/EasyAbp/EShop/Products/Products/OrderDiscountPreviewInfoModel.cs

@ -6,19 +6,28 @@ namespace EasyAbp.EShop.Products.Products;
[Serializable]
public class OrderDiscountPreviewInfoModel : DiscountInfoModel, ICloneable
{
/// <summary>
/// This property can be used as an additional rule explanation for the UI.
/// For example, <c>2,rate,0.1</c> could mean 10% off while the quantity of order line >= 2.
/// UI cannot always calculate the discount amount correctly, but if you need to, this property can help.
/// </summary>
[CanBeNull]
public string RuleData { get; }
public OrderDiscountPreviewInfoModel()
{
}
public OrderDiscountPreviewInfoModel([CanBeNull] string effectGroup, [NotNull] string name, [CanBeNull] string key,
[CanBeNull] string displayName, DateTime? fromTime, DateTime? toTime) : base(effectGroup, name, key,
displayName, fromTime, toTime)
[CanBeNull] string displayName, DateTime? fromTime, DateTime? toTime, [CanBeNull] string ruleData) : base(
effectGroup, name, key, displayName, fromTime, toTime)
{
RuleData = ruleData;
}
public virtual object Clone()
{
return new OrderDiscountPreviewInfoModel(EffectGroup, Name, Key, DisplayName, FromTime, ToTime);
return new OrderDiscountPreviewInfoModel(EffectGroup, Name, Key, DisplayName, FromTime, ToTime, RuleData);
}
public override bool Equals(object obj)
@ -33,7 +42,8 @@ public class OrderDiscountPreviewInfoModel : DiscountInfoModel, ICloneable
Key == other.Key &&
DisplayName == other.DisplayName &&
Nullable.Equals(FromTime, other.FromTime) &&
Nullable.Equals(ToTime, other.ToTime);
Nullable.Equals(ToTime, other.ToTime) &&
RuleData == other.RuleData;
}
public override int GetHashCode()
@ -46,6 +56,7 @@ public class OrderDiscountPreviewInfoModel : DiscountInfoModel, ICloneable
hashCode = (hashCode * 397) ^ (DisplayName != null ? DisplayName.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ FromTime.GetHashCode();
hashCode = (hashCode * 397) ^ ToTime.GetHashCode();
hashCode = (hashCode * 397) ^ (RuleData != null ? RuleData.GetHashCode() : 0);
return hashCode;
}
}

4
modules/EasyAbp.EShop.Products/test/EasyAbp.EShop.Products.Application.Tests/Products/DemoProductDiscountProvider.cs

@ -57,8 +57,8 @@ public class DemoProductDiscountProvider : IProductDiscountProvider
var orderDiscountPreviewInfoModels = new List<OrderDiscountPreviewInfoModel>
{
new(null, "DemoDiscount", "1", "Demo Discount 1", null, null),
new(null, "DemoDiscount", "2", "Demo Discount 2", _clock.Now.AddDays(-1), _clock.Now.AddDays(1)),
new(null, "DemoDiscount", "1", "Demo Discount 1", null, null, null),
new(null, "DemoDiscount", "2", "Demo Discount 2", _clock.Now.AddDays(-1), _clock.Now.AddDays(1), null),
};
foreach (var model in orderDiscountPreviewInfoModels)

15
plugins/Promotions/src/EasyAbp.EShop.Plugins.Promotions.Domain/EasyAbp/EShop/Plugins/Promotions/PromotionTypes/MinQuantityOrderDiscount/MinQuantityOrderDiscountPromotionHandler.cs

@ -17,10 +17,15 @@ public class MinQuantityOrderDiscountPromotionHandler : PromotionHandlerBase, IS
{
}
public override Task HandleProductAsync(ProductDiscountContext context, Promotion promotion)
public override async Task HandleProductAsync(ProductDiscountContext context, Promotion promotion)
{
foreach (var discountModel in GetConfigurations<MinQuantityOrderDiscountConfigurations>(promotion).Discounts)
{
if (context.ProductSku.Currency != discountModel.DynamicDiscountAmount.Currency)
{
continue;
}
if (!discountModel.IsInScope(context.Product.ProductGroupName, context.Product.Id, context.ProductSku.Id))
{
continue;
@ -28,12 +33,16 @@ public class MinQuantityOrderDiscountPromotionHandler : PromotionHandlerBase, IS
var newDiscount = new OrderDiscountPreviewInfoModel(PromotionConsts.PromotionEffectGroup,
PromotionConsts.PromotionDiscountName, promotion.UniqueName, promotion.DisplayName, promotion.FromTime,
promotion.ToTime);
promotion.ToTime, await CreateOrderDiscountPreviewRuleDataAsync(discountModel, context, promotion));
context.OrderDiscountPreviews.Add(newDiscount);
}
}
return Task.CompletedTask;
protected virtual Task<string?> CreateOrderDiscountPreviewRuleDataAsync(MinQuantityOrderDiscountModel discountModel,
ProductDiscountContext context, Promotion promotion)
{
return Task.FromResult<string?>(null);
}
public override Task HandleOrderAsync(OrderDiscountContext context, Promotion promotion)

Loading…
Cancel
Save