Пример #1
0
        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);
                        }
                    }
                }
            }
        }
Пример #2
0
        /// <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;
                                    }
                                }
                            });
                        }
                    }
                }
            }
        }