/***********************************************************************
* Project: baifenBinfa
* ProjectName: 百分兵法管理系统
* Web: http://chuanyin.com
* Author:
* Email:
* CreateTime: 202403/02
* Description: 暂无
***********************************************************************/
using System;
using System.Threading.Tasks;
using CoreCms.Net.Configuration;
using CoreCms.Net.IRepository;
using CoreCms.Net.IRepository.UnitOfWork;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.ViewModels.DTO;
using CoreCms.Net.Utility.Extensions;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace CoreCms.Net.Services
{
///
/// 促销结果表 接口实现
///
public class CoreCmsPromotionResultServices : BaseServices, ICoreCmsPromotionResultServices
{
private readonly ICoreCmsPromotionResultRepository _dal;
private ICoreCmsPromotionConditionServices _promotionConditionServices;
private readonly IUnitOfWork _unitOfWork;
public CoreCmsPromotionResultServices(IUnitOfWork unitOfWork, ICoreCmsPromotionResultRepository dal, ICoreCmsPromotionConditionServices promotionConditionServices)
{
this._dal = dal;
base.BaseDal = dal;
_unitOfWork = unitOfWork;
_promotionConditionServices = promotionConditionServices;
}
//去计算结果
public async Task toResult(CoreCmsPromotionResult resultInfo, CartDto cart,
CoreCmsPromotion promotionInfo)
{
if (string.IsNullOrEmpty(resultInfo.parameters)) return false;
var resultType = SystemSettingDictionary.GetPromotionResultType();
var resultModel = resultType.Find(p => p.sKey == resultInfo.code);
if (resultModel != null)
{
JObject parameters = (JObject)JsonConvert.DeserializeObject(resultInfo.parameters);
//如果是订单促销就直接去判断促销条件,如果是商品促销,就循环订单明细
if (resultModel.sValue == "goods")
{
var isUsed = false;
foreach (var item in cart.list)
{
var type = await _promotionConditionServices.goods_check(promotionInfo.id, (int)item.products.goodsId, item.nums);
if (type == 2)
{
//到这里就说明此商品信息满足促销商品促销信息的条件,去计算结果
//注意,在明细上面,就不细分促销的种类了,都放到一个上面,在订单上面才细分
decimal promotionModel = 0;
if (isUsed == false)
{
switch (resultInfo.code)
{
//指定商品减固定金额
case "GOODS_REDUCE":
promotionModel = result_GOODS_REDUCE(parameters, item, promotionInfo);
break;
//指定商品打X折
case "GOODS_DISCOUNT":
promotionModel = result_GOODS_DISCOUNT(parameters, item, promotionInfo);
break;
//指定商品一口价
case "GOODS_ONE_PRICE":
promotionModel = result_GOODS_ONE_PRICE(parameters, item, promotionInfo);
break;
//指定商品每第几件减指定金额
case "GOODS_HALF_PRICE": //todo 指定商品每第几件减指定金额
promotionModel = result_GOODS_HALF_PRICE(parameters, item, promotionInfo);
break;
default:
promotionModel = 0;
break;
}
}
if (item.isSelect)
{
switch (promotionInfo.type)
{
case (int)GlobalEnumVars.PromotionType.Promotion:
//设置总的商品促销金额
cart.goodsPromotionMoney = Math.Round(cart.goodsPromotionMoney + promotionModel, 2);
//设置总的价格
cart.amount = Math.Round(cart.amount - promotionModel, 2);
break;
case (int)GlobalEnumVars.PromotionType.Coupon:
if (isUsed)
{
item.products.promotionList.Remove(promotionInfo.id);
}
else
{
//优惠券促销金额
cart.couponPromotionMoney = Math.Round(cart.couponPromotionMoney + promotionModel, 2);
//设置总的价格
cart.amount = Math.Round(cart.amount - promotionModel, 2);
//跳出下级处理
isUsed = true;
}
break;
case (int)GlobalEnumVars.PromotionType.Group:
//团购
cart.goodsPromotionMoney = Math.Round(cart.goodsPromotionMoney + promotionModel, 2);
//设置总的价格
cart.amount = Math.Round(cart.amount - promotionModel, 2);
break;
case (int)GlobalEnumVars.PromotionType.Seckill:
//秒杀
cart.goodsPromotionMoney = Math.Round(cart.goodsPromotionMoney + promotionModel, 2);
//设置总的价格
cart.amount = Math.Round(cart.amount - promotionModel, 2);
break;
}
}
}
}
//商品促销可能做的比较狠,导致订单价格为负数了,这里判断一下,如果订单价格小于0了,就是0了
cart.amount = cart.amount > 0 ? cart.amount : 0;
}
else
{
//订单打X折
if (resultInfo.code == "ORDER_DISCOUNT")
{
result_ORDER_DISCOUNT(parameters, cart, promotionInfo);
}
//订单减指定金额
else if (resultInfo.code == "ORDER_REDUCE")
{
result_ORDER_REDUCE(parameters, cart, promotionInfo);
}
}
}
return true;
}
///
/// 订单减固定金额
///
///
///
///
///
public bool result_ORDER_REDUCE(JObject parameters, CartDto cart, CoreCmsPromotion promotionInfo)
{
if (!parameters.ContainsKey("money")) return true;
//判断极端情况,减的太多,超过购物车的总金额了,那么就最多减到0
if (cart.amount < (decimal)parameters["money"])
{
parameters["money"] = cart.amount;
}
//总价格修改
cart.amount -= (decimal)parameters["money"];
switch (promotionInfo.type)
{
case (int)GlobalEnumVars.PromotionType.Promotion:
//总促销修改
cart.orderPromotionMoney += (decimal)parameters["money"];
//设置促销列表
if (cart.promotionList.ContainsKey(promotionInfo.id))
{
cart.promotionList[promotionInfo.id].name = promotionInfo.name;
cart.promotionList[promotionInfo.id].type = 2;
}
else
{
cart.promotionList.Add(promotionInfo.id, new WxNameTypeDto() { name = promotionInfo.name, type = 2 });
}
break;
case (int)GlobalEnumVars.PromotionType.Coupon:
//优惠券促销金额
cart.couponPromotionMoney += (decimal)parameters["money"];
break;
}
return true;
}
///
/// 订单打X折
///
///
///
///
///
public bool result_ORDER_DISCOUNT(JObject parameters, CartDto cart, CoreCmsPromotion promotionInfo)
{
//if (parameters.Property("discount") == null) return true;
//var objDiscount = Convert.ToInt32(parameters["discount"]);
if (!parameters.ContainsKey("discount")) return true;
var objDiscount = parameters["discount"].ObjectToDecimal(0);
//判断参数是否设置的正确
if (objDiscount >= 10 || objDiscount <= 0)
{
return true;
}
var orderAmount = cart.amount;
//总价格修改
cart.amount = Math.Round(Math.Round(Math.Round(cart.amount * objDiscount, 3) * 10, 2) / 100, 2);
switch (promotionInfo.type)
{
case (int)GlobalEnumVars.PromotionType.Promotion:
//总促销修改
cart.orderPromotionMoney = Math.Round(cart.orderPromotionMoney + Math.Round(orderAmount - cart.amount, 2), 2);
//设置促销列表
if (cart.promotionList.ContainsKey(promotionInfo.id))
{
cart.promotionList[promotionInfo.id].name = promotionInfo.name;
cart.promotionList[promotionInfo.id].type = 2;
}
else
{
cart.promotionList.Add(promotionInfo.id, new WxNameTypeDto() { name = promotionInfo.name, type = 2 });
}
break;
case (int)GlobalEnumVars.PromotionType.Coupon:
//优惠券促销金额
cart.couponPromotionMoney = Math.Round(cart.couponPromotionMoney + Math.Round(orderAmount - cart.amount, 2), 2);
break;
}
return true;
}
///
/// 指定商品减固定金额
///
///
///
///
///
public decimal result_GOODS_REDUCE(JObject parameters, CartProducts cartProducts, CoreCmsPromotion promotionInfo)
{
if (!parameters.ContainsKey("money")) return 0;
var objMoney = parameters["money"].ObjectToDecimal(0);
var isApplyToNum = parameters["isApplyToNum"].ObjectToInt(1);
decimal promotionMoney = 0;
//判断极端情况,减的太多,超过商品单价了,那么就最多减到0
if (cartProducts.products.price < objMoney)
{
objMoney = cartProducts.products.price;
}
//此处不存储优惠后单价,防止出现针对单个产品,多个数量情况下,单一优惠券无法针对每个数量的商品进行计算售价。
//cartProducts.products.price = Math.Round(cartProducts.products.price - objMoney, 2);
//此次商品促销一共优惠了多少钱
if (promotionInfo.type is (int)GlobalEnumVars.PromotionType.Coupon or (int)GlobalEnumVars.PromotionType.Seckill or (int)GlobalEnumVars.PromotionType.Group or (int)GlobalEnumVars.PromotionType.Promotion)
{
promotionMoney = isApplyToNum == 1 ? objMoney : Math.Round(cartProducts.nums * objMoney, 2);
}
else
{
promotionMoney = 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 + promotionMoney, 2);
//设置商品的实际销售金额(单品)
cartProducts.products.amount = Math.Round(cartProducts.products.amount - promotionMoney, 2);
return promotionMoney;
}
///
/// 指定商品打X折
///
///
///
///
///
public decimal result_GOODS_DISCOUNT(JObject parameters, CartProducts cartProducts, CoreCmsPromotion promotionInfo)
{
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 goodsPrice = cartProducts.products.price;
//此处不存储优惠后单价,防止出现针对单个产品,多个数量情况下,单一优惠券无法针对每个数量的商品进行计算售价。
//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 - productsPrice, 2);
decimal promotionMoney = 0;
if (promotionInfo.type is (int)GlobalEnumVars.PromotionType.Coupon or (int)GlobalEnumVars.PromotionType.Seckill or (int)GlobalEnumVars.PromotionType.Group or (int)GlobalEnumVars.PromotionType.Promotion)
{
promotionMoney = isApplyToNum == 1 ? pmoney : Math.Round(cartProducts.nums * pmoney, 2);
}
else
{
promotionMoney = Math.Round(cartProducts.nums * pmoney, 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);
//设置商品的实际销售总金额
cartProducts.products.amount = Math.Round(cartProducts.products.amount - promotionMoney, 2);
return promotionMoney;
}
//商品一口价
public decimal result_GOODS_ONE_PRICE(JObject parameters, CartProducts cartProducts, CoreCmsPromotion promotionInfo)
{
if (!parameters.ContainsKey("money")) return 0;
var objMoney = parameters["money"].ObjectToDecimal(0);
var isApplyToNum = parameters["isApplyToNum"].ObjectToInt(1);
//如果一口价比商品价格高,那么就不执行了
decimal promotionMoney = 0;
if (cartProducts.products.price <= objMoney)
{
return promotionMoney;
}
var goodsPrice = (decimal)cartProducts.products.price;
//此处不存储优惠后单价,防止出现针对单个产品,多个数量情况下,单一优惠券无法针对每个数量的商品进行计算售价。
//cartProducts.products.price = Math.Round(objMoney, 2);
var productsPrice = Math.Round(objMoney, 2);
//单品优惠的金额
var pmoney = Math.Round(goodsPrice - productsPrice, 2);
if (promotionInfo.type is (int)GlobalEnumVars.PromotionType.Coupon or (int)GlobalEnumVars.PromotionType.Seckill or (int)GlobalEnumVars.PromotionType.Group or (int)GlobalEnumVars.PromotionType.Promotion)
{
promotionMoney = isApplyToNum == 1 ? pmoney : Math.Round(cartProducts.nums * pmoney, 2);
}
else
{
promotionMoney = Math.Round(cartProducts.nums * pmoney, 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);
//设置商品的实际销售总金额
cartProducts.products.amount = Math.Round(cartProducts.products.amount - promotionMoney, 2);
return promotionMoney;
}
//指定商品每第几件减指定金额
public decimal result_GOODS_HALF_PRICE(JObject parameters, CartProducts cartProducts, CoreCmsPromotion promotionInfo)
{
if (!parameters.ContainsKey("money")) return 0;
var objMoney = parameters["money"].ObjectToDecimal(0);
//如果一口价比商品价格高,那么就不执行了
decimal promotionMoney = 0;
if (cartProducts.products.price <= objMoney)
{
return promotionMoney;
}
//第几个优惠
var num = parameters["num"].ObjectToInt(0);
//购买的数量
var buyNum = cartProducts.nums;
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(promotionNum * objMoney, 2);//优惠金额
//设置商品优惠总金额
cartProducts.products.promotionAmount = Math.Round(cartProducts.products.promotionAmount + promotionMoney, 2);
//设置商品的实际销售总金额
cartProducts.products.amount = Math.Round(cartProducts.products.amount - promotionMoney, 2);
}
return promotionMoney;
}
}
}