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