Example #1
0
        /// <summary>
        /// 获取促销结果
        /// </summary>
        /// <param name="origComboList"></param>
        /// <param name="soInfo"></param>
        /// <param name="soItemList"></param>
        /// <param name="promotionInfoList"></param>
        protected virtual void GetPromotionListForSO(List <ComboInfo> origComboList, SOInfo soInfo, ref List <SOItemInfo> soItemList, ref List <SOPromotionInfo> promotionInfoList)
        {
            //1.取当前订单商品有效的Combo
            List <ComboInfo> validComboList = GetValidComboList(origComboList, soItemList);

            if (validComboList.Count == 0)
            {
                return;
            }

            //2.按照这些可以参与活动的Combo列表,得到所有的折扣列表: 遵循最大Combo折扣优先原则,而不是客户最大折扣优先原则
            List <ComboApplyInstance> comboApplyList = new List <ComboApplyInstance>();

            foreach (ComboInfo combo in validComboList)
            {
                ComboApplyInstance comboApply = new ComboApplyInstance();
                ComboInfo          comboClone = SerializationUtility.DeepClone <ComboInfo>(combo);
                comboApply.ComboSysNo = comboClone.SysNo.Value;
                //获取当前Combo在订单中最多可以存在多少套: 取订单中满足该Combo商品中最小数量
                int maxCount = int.MaxValue;
                foreach (ComboItem comboItem in comboClone.Items)
                {
                    SOItemInfo soItem   = soItemList.Find(f => f.ProductSysNo == comboItem.ProductSysNo);
                    int        curCount = soItem.Quantity.Value / comboItem.Quantity.Value;
                    if (curCount < maxCount)
                    {
                        maxCount = curCount;
                    }
                }
                comboApply.Qty = maxCount;
                decimal totalDiscount = 0.00m;
                foreach (ComboItem comboItem in comboClone.Items)
                {
                    totalDiscount += Math.Round(comboItem.Discount.Value * comboItem.Quantity.Value * maxCount, 2);
                }
                //取Combo Total Discount的绝对值
                comboApply.TotalDiscount = Math.Abs(totalDiscount);
                comboApplyList.Add(comboApply);
            }
            //3.得到折扣从大到小排序的列表
            var comboApplySortList = from p in comboApplyList
                                     orderby p.TotalDiscount descending
                                     select p;

            //4.取最大折扣的Combo
            ComboApplyInstance maxDiscountComboApply = comboApplySortList.First();
            ComboInfo          curCombo = validComboList.Find(f => f.SysNo.Value == maxDiscountComboApply.ComboSysNo);


            SOPromotionInfo promotionInfo = GetPromotionInfoForCurrentCombo(curCombo, maxDiscountComboApply, ref soItemList,
                                                                            promotionInfoList.Count + 1, soInfo.SysNo);

            if (promotionInfo != null)
            {
                promotionInfoList.Add(promotionInfo);
            }

            //5.轮询调用剩下的订单商品
            GetPromotionListForSO(validComboList, soInfo, ref soItemList, ref promotionInfoList);
        }
Example #2
0
        /// <summary>
        /// 根据当前Combo,得到该Combo在订单中的SOPromotionInfo
        /// </summary>
        /// <param name="curCombo"></param>
        /// <param name="comboApply"></param>
        /// <param name="soItemList"></param>
        /// <param name="priority"></param>
        /// <param name="soSysNo"></param>
        /// <returns></returns>
        protected virtual SOPromotionInfo GetPromotionInfoForCurrentCombo(ComboInfo curCombo,
                                                                          ComboApplyInstance comboApply, ref List <SOItemInfo> soItemList, int priority, int?soSysNo)
        {
            SOPromotionInfo promotionInfo = null;

            int maxCount = comboApply.Qty;

            if (maxCount > 0)
            {
                //说明当前订单剩余商品还可以满足这个Combo
                promotionInfo = new SOPromotionInfo();
                promotionInfo.PromotionType  = SOPromotionType.Combo;
                promotionInfo.Combo          = curCombo;
                promotionInfo.PromotionSysNo = curCombo.SysNo.Value;
                promotionInfo.PromotionName  = curCombo.Name != null ? curCombo.Name.Content : null;
                promotionInfo.DiscountAmount = -Math.Abs(comboApply.TotalDiscount);
                promotionInfo.GainPoint      = 0;
                promotionInfo.Priority       = priority;
                promotionInfo.SOSysNo        = soSysNo;
                promotionInfo.Time           = maxCount;
                if (promotionInfo.Time > 0)
                {
                    promotionInfo.Discount = promotionInfo.DiscountAmount / promotionInfo.Time;
                }

                StringBuilder promotionNote = new StringBuilder();

                promotionInfo.SOPromotionDetails = new List <SOPromotionDetailInfo>();
                foreach (ComboItem comboItem in curCombo.Items)
                {
                    SOPromotionDetailInfo promotionDetail = new SOPromotionDetailInfo();
                    promotionDetail.DiscountAmount        = Math.Abs(Math.Round(comboItem.Discount.Value * comboItem.Quantity.Value * maxCount, 2));
                    promotionDetail.GainPoint             = 0;
                    promotionDetail.MasterProductQuantity = comboItem.Quantity.Value * maxCount;
                    promotionDetail.MasterProductSysNo    = comboItem.ProductSysNo.Value;
                    //promotionDetail.MasterProductType = SOProductType.Product;
                    promotionInfo.SOPromotionDetails.Add(promotionDetail);

                    promotionNote.AppendFormat("{0},{1},-{2};", promotionDetail.MasterProductQuantity, promotionDetail.MasterProductSysNo, promotionDetail.DiscountAmount);

                    //最重要的一点:要从soItemList中减掉这些已经做了折扣的商品及数量
                    //如果数量没减完,则在soItemList中保留该Item,但是数量要减掉;如果数量减完,则从soItemList中Remove掉改Item
                    List <SOItemInfo> needRemoveSOItemList = new List <SOItemInfo>();
                    foreach (SOItemInfo soItem in soItemList)
                    {
                        if (soItem.ProductSysNo == comboItem.ProductSysNo)
                        {
                            soItem.OriginalPrice = soItem.OriginalPrice + comboItem.Discount; //有折扣总价减去折扣 Bug:89610
                            if (soItem.Quantity > comboItem.Quantity.Value * maxCount)
                            {
                                soItem.Quantity = soItem.Quantity - comboItem.Quantity.Value * maxCount;
                            }
                            else
                            {
                                needRemoveSOItemList.Add(soItem);
                            }
                        }
                    }
                    foreach (SOItemInfo soItem in needRemoveSOItemList)
                    {
                        soItemList.Remove(soItem);
                    }
                }
                promotionInfo.Note = promotionNote.ToString();
            }
            return(promotionInfo);
        }