【新增】优惠券及全局优惠的【指定商品减固定金额】【指定商品打X折】【指定商品一口价】,增加针对订单符合条件商品是只单个数量计算,还是针对满足条件商品的所有数量计算优惠。

【优化】订单详情不在针对优惠条件下,修改商品sku保存的优惠后单品售价,防止出现优惠模式下,购买多个同样商品,但是只计算一个商品数量优惠的情况,可能导致明细合计与订单计算合计歧义。
【修复】修复优惠券及全局优惠【指定商品每第几件减去指定金额】多次满足条件不叠加计算的问题。
【修复】修复优惠券未在领取有效期内,但是可以领取的问题。
This commit is contained in:
jianweie code
2023-11-07 14:54:04 +08:00
parent 6ac2ecb8ab
commit a65372ad11
7 changed files with 125 additions and 38 deletions

View File

@@ -258,6 +258,7 @@ namespace CoreCms.Net.Services
{
if (!parameters.ContainsKey("money")) return 0;
var objMoney = parameters["money"].ObjectToDecimal(0);
var isApplyToNum = parameters["isApplyToNum"].ObjectToInt(1);
decimal promotionMoney = 0;
//判断极端情况减的太多超过商品单价了那么就最多减到0
@@ -265,11 +266,12 @@ namespace CoreCms.Net.Services
{
objMoney = cartProducts.products.price;
}
cartProducts.products.price = Math.Round(cartProducts.products.price - objMoney, 2);
//此处不存储优惠后单价,防止出现针对单个产品,多个数量情况下,单一优惠券无法针对每个数量的商品进行计算售价。
//cartProducts.products.price = Math.Round(cartProducts.products.price - objMoney, 2);
//此次商品促销一共优惠了多少钱
promotionMoney = promotionInfo.type == (int)GlobalEnumVars.PromotionType.Coupon ? objMoney : Math.Round(cartProducts.nums * objMoney, 2);
promotionMoney = promotionInfo.type == (int)GlobalEnumVars.PromotionType.Coupon ? isApplyToNum == 1 ? objMoney : Math.Round(cartProducts.nums * objMoney, 2) : Math.Round(cartProducts.nums * objMoney, 2);
//设置商品优惠总金额
cartProducts.products.promotionAmount = Math.Round(cartProducts.products.promotionAmount + objMoney, 2);
cartProducts.products.promotionAmount = Math.Round(cartProducts.products.promotionAmount + promotionMoney, 2);
//设置商品的实际销售金额(单品)
cartProducts.products.amount = Math.Round(cartProducts.products.amount - promotionMoney, 2);
return promotionMoney;
@@ -286,13 +288,22 @@ namespace CoreCms.Net.Services
{
if (!parameters.ContainsKey("discount")) return 0;
var objDiscount = parameters["discount"].ObjectToDecimal(0);
var isApplyToNum = parameters["isApplyToNum"].ObjectToInt(1);
//判断参数是否设置的正确
if (objDiscount >= 10 || objDiscount <= 0)
{
return 0;
}
decimal promotionMoney = 0;
decimal goodsPrice = cartProducts.products.price;
cartProducts.products.price = Math.Round(Math.Round(Math.Round(cartProducts.products.price * objDiscount, 3) * 10, 2) / 100, 2);
//此处不存储优惠后单价,防止出现针对单个产品,多个数量情况下,单一优惠券无法针对每个数量的商品进行计算售价。
//cartProducts.products.price = Math.Round(Math.Round(Math.Round(cartProducts.products.price * objDiscount, 3) * 10, 2) / 100, 2);
var productsPrice = Math.Round(Math.Round(Math.Round(cartProducts.products.price * objDiscount, 3) * 10, 2) / 100, 2);
//单品优惠的金额
var pmoney = Math.Round(goodsPrice - cartProducts.products.price, 2);
promotionMoney = promotionInfo.type == (int)GlobalEnumVars.PromotionType.Coupon ? pmoney : Math.Round(cartProducts.nums * pmoney, 2);
var pmoney = Math.Round(goodsPrice - productsPrice, 2);
var promotionMoney = promotionInfo.type == (int)GlobalEnumVars.PromotionType.Coupon ? isApplyToNum == 1 ? pmoney : Math.Round(cartProducts.nums * pmoney, 2) : Math.Round(cartProducts.nums * pmoney, 2);
//设置商品优惠总金额
cartProducts.products.promotionAmount = Math.Round(cartProducts.products.promotionAmount + promotionMoney, 2);
//设置商品的实际销售总金额
@@ -306,6 +317,7 @@ namespace CoreCms.Net.Services
{
if (!parameters.ContainsKey("money")) return 0;
var objMoney = parameters["money"].ObjectToDecimal(0);
var isApplyToNum = parameters["isApplyToNum"].ObjectToInt(1);
//如果一口价比商品价格高,那么就不执行了
decimal promotionMoney = 0;
@@ -314,10 +326,12 @@ namespace CoreCms.Net.Services
return promotionMoney;
}
var goodsPrice = (decimal)cartProducts.products.price;
cartProducts.products.price = Math.Round(objMoney, 2);
//此处不存储优惠后单价,防止出现针对单个产品,多个数量情况下,单一优惠券无法针对每个数量的商品进行计算售价。
//cartProducts.products.price = Math.Round(objMoney, 2);
var productsPrice = Math.Round(objMoney, 2);
//单品优惠的金额
var pmoney = Math.Round(goodsPrice - cartProducts.products.price, 2);
promotionMoney = promotionInfo.type == (int)GlobalEnumVars.PromotionType.Coupon ? pmoney : Math.Round(cartProducts.nums * pmoney, 2);
var pmoney = Math.Round(goodsPrice - productsPrice, 2);
promotionMoney = promotionInfo.type == (int)GlobalEnumVars.PromotionType.Coupon ? isApplyToNum == 1 ? pmoney : Math.Round(cartProducts.nums * pmoney, 2) : Math.Round(cartProducts.nums * pmoney, 2);
//设置商品优惠总金额
cartProducts.products.promotionAmount = Math.Round(cartProducts.products.promotionAmount + promotionMoney, 2);
//设置商品的实际销售总金额
@@ -344,11 +358,12 @@ namespace CoreCms.Net.Services
if (cartProducts.nums >= num)
{
//var promotionNum = buyNum / num;
var pmoney = Math.Round(objMoney / buyNum, 2); //单品优惠的金额
var goodsPrice = (decimal)cartProducts.products.price;
cartProducts.products.price = goodsPrice - pmoney; //优惠后的平均价格
promotionMoney = Math.Round(cartProducts.nums * pmoney, 2);//优惠金额
var promotionNum = buyNum / num;
//var pmoney = Math.Round(objMoney / buyNum, 2); //单品优惠的金额
//var goodsPrice = (decimal)cartProducts.products.price;
//此处不存储优惠后单价,防止出现针对单个产品,多个数量情况下,单一优惠券无法针对每个数量的商品进行计算售价。
//cartProducts.products.price = goodsPrice - pmoney; //优惠后的平均价格
promotionMoney = Math.Round(promotionNum * objMoney, 2);//优惠金额
//设置商品优惠总金额
cartProducts.products.promotionAmount = Math.Round(cartProducts.products.promotionAmount + promotionMoney, 2);

View File

@@ -684,9 +684,10 @@ namespace CoreCms.Net.Services
public async Task<WebApiCallBack> ReceiveCoupon(int promotionId)
{
var jm = new WebApiCallBack();
var dt = DateTime.Now;
var where = PredicateBuilder.True<CoreCmsPromotion>();
where = where.And(p => p.endTime > DateTime.Now); //判断优惠券失效时间 是否可领取
where = where.And(p => p.endTime > dt); //判断优惠券失效时间 是否可领取
//where = where.And(p => p.startTime < dt);
where = where.And(p => p.isEnable == true); //启用状态
where = where.And(p => p.type == (int)GlobalEnumVars.PromotionType.Coupon); //促销 类型
where = where.And(p => p.isAutoReceive == true); //自动领取状态
@@ -699,6 +700,12 @@ namespace CoreCms.Net.Services
{
jm.data = info;
//判断最大领取数量
if (info.endTime < dt || info.startTime > dt)
{
jm.status = false;
jm.msg = "请在领取时间范围内领取";
return jm;
}
if (info.maxRecevieNums == 0)
{
jm.status = true;