public void Calculate(ref OrderInfo order) { if (order.DiscountDetailList == null) { order.DiscountDetailList = new List <OrderItemDiscountInfo>(); } foreach (OrderItemGroup itemGroup in order.OrderItemGroupList) { if (itemGroup.PackageNo > 0 && itemGroup.PackageType == 1) { ComboInfo combo = PromotionDA.GetComboByComboSysNo(itemGroup.PackageNo); if (combo != null && combo.Items != null && combo.Items.Count > 0) { foreach (ComboItem comboItem in combo.Items) { OrderItemDiscountInfo itemDiscount = new OrderItemDiscountInfo(); itemDiscount.DiscountActivityName = combo.SaleRuleName; itemDiscount.DiscountActivityNo = itemGroup.PackageNo; itemDiscount.DiscountType = 1; itemDiscount.PackageNo = itemGroup.PackageNo; itemDiscount.ProductSysNo = comboItem.ProductSysNo; itemDiscount.Quantity = itemGroup.Quantity * comboItem.Quantity; itemDiscount.UnitDiscount = Math.Abs(comboItem.Discount); itemDiscount.UnitRewardedBalance = 0; itemDiscount.UnitRewardedPoint = 0; itemDiscount.UnitShipFeeDiscountAmt = 0; order.DiscountDetailList.Add(itemDiscount); } } } } }
/// <summary> /// 计算促销折扣金额,主要是进行金额分摊 /// </summary> /// <param name="order"></param> private void CalculateDiscountAmount(OrderInfo order) { if (order.DiscountDetailList == null || order.DiscountDetailList.Count <= 0) { return; } decimal unitDiscountAmt = 0m; foreach (var kvs in order.SubOrderList) { //初始化子单上的折扣列表,通过计算,将折扣信息分摊到每个子单上 kvs.Value.DiscountDetailList = new List <OrderItemDiscountInfo>(); //计算该item总计购买数量,需要遍历主商品列表 if (kvs.Value.OrderItemGroupList != null) { foreach (var itemGroup in kvs.Value.OrderItemGroupList) { if (itemGroup.ProductItemList != null) { itemGroup.ProductItemList.ForEach(orderItem => { //暂时还没有考虑整单减免的情况。 //从订单的折扣明细表找到当前item的折扣信息 var discountInfoList = order.DiscountDetailList.FindAll(x => x.ProductSysNo == orderItem.ProductSysNo); //先考虑和主商品相关的促销折扣 if (discountInfoList != null) { //计算item总数量 int totalItemBuyQuantity = 0; //只考虑主商品折扣 if (order.OrderItemGroupList != null) { //计算该主商品购买的总数量 order.OrderItemGroupList.ForEach(g => { totalItemBuyQuantity += g.ProductItemList.Where(x => x.ProductSysNo == orderItem.ProductSysNo) .Sum(x => x.UnitQuantity * g.Quantity); }); } //计算item总折扣 decimal totalDiscountAmt = 0m; foreach (var discountInfo in discountInfoList) { //将折扣信息加入到子单中, 按照item平均折扣重新计算UnitDiscount,并将Quantity填为1 OrderItemDiscountInfo clonedDiscountInfo = (OrderItemDiscountInfo)discountInfo.Clone(); clonedDiscountInfo.Quantity = 1; clonedDiscountInfo.UnitDiscount = (discountInfo.UnitDiscount * discountInfo.Quantity) * orderItem.UnitQuantity / totalItemBuyQuantity; kvs.Value.DiscountDetailList.Add(clonedDiscountInfo); //计算单个item的平均折扣,同一个商品A如果既存在与套餐C中,又单独购买过,那么discountInfo中记录的是套餐中该商品享受的折扣 //而单独购买的A不享受折扣,这里需要计算的是单个item的平均折扣,计算的时候需要用item的总折扣除以item的总数量 totalDiscountAmt += (discountInfo.UnitDiscount * discountInfo.Quantity); } //计算item平均折扣金额,折扣金额为正数 if (totalItemBuyQuantity > 0) { unitDiscountAmt = totalDiscountAmt / totalItemBuyQuantity; orderItem["UnitDiscountAmt"] = unitDiscountAmt; } } }); } } } } }