/*********************************************************************** * 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; } } }