/// <summary> /// 转换成CrShoppingCart(购物车)对象 /// </summary> /// <param name="platformType">促销使用平台</param> /// <param name="expensesAmount">太平洋保险</param> /// <returns></returns> ///<remarks>2013-11-14 杨文兵 创建</remarks> public CrShoppingCart ToCrShoppingCart(PromotionStatus.促销使用平台[] platformType, decimal expensesAmount = 0M) { var customer = Hyt.BLL.CRM.CrCustomerBo.Instance.GetCrCustomerItem(_customerSysNo); var cartItemList = _jsonCartItemList.ConvertShoppingCartItems(customer.LevelSysNo);; var promotionToPython = new SpPromotionToPython() { Order = _order }; return(Hyt.BLL.CRM.CrShoppingCartBo.Instance.GetShoppingCart(platformType, customer, cartItemList , _usedPromotionSysNo , _couponCode , false , _areaSysNo, _deliveryTypeSysNo, null, false, promotionToPython, _order.DefaultWarehouseSysNo, expensesAmount)); }
/// <summary> /// 订单转购物车对象 /// </summary> /// <param name="platformType">使用平台</param> /// <param name="customerSysNo">客户系统编号</param> /// <param name="orderSysNo">订单系统编号</param> /// <returns>购物车</returns> /// <remarks>2013-09-26 吴文强 创建</remarks> public CrShoppingCart GetCartByOrder(PromotionStatus.促销使用平台[] platformType, int customerSysNo, int orderSysNo) { IList <CBCrShoppingCartItem> shoppingCartItems = new List <CBCrShoppingCartItem>(); var orderItems = SoOrderBo.Instance.GetOrderItemsByOrderId(orderSysNo); var promotionSysNo = GetUsedPromotionSysNo(orderSysNo); var order = SoOrderBo.Instance.GetEntity(orderSysNo); //获取地址对应的实体,得到父级市,计算运费 王耀发 2016-1-26 创建 var receiveAddress = SoOrderBo.Instance.GetOrderReceiveAddress(order.ReceiveAddressSysNo); foreach (var orderItem in orderItems) { shoppingCartItems.Add(new CBCrShoppingCartItem() { SysNo = orderItem.SysNo, CustomerSysNo = customerSysNo, IsChecked = (int)CustomerStatus.是否选中.是, ProductSysNo = orderItem.ProductSysNo, ProductName = orderItem.ProductName, Quantity = orderItem.Quantity, OriginPrice = orderItem.OriginalPrice, SalesUnitPrice = orderItem.SalesUnitPrice, SaleTotalAmount = orderItem.SalesUnitPrice * orderItem.Quantity, IsLock = string.IsNullOrEmpty(orderItem.GroupCode) ? (int)CustomerStatus.购物车是否锁定.否 : (int)CustomerStatus.购物车是否锁定.是, Promotions = orderItem.UsedPromotions, UsedPromotions = orderItem.UsedPromotions, GroupCode = orderItem.GroupCode, ProductSalesType = (int)orderItem.ProductSalesType, ProductSalesTypeSysNo = orderItem.ProductSalesTypeSysNo, }); } var customer = CrCustomerBo.Instance.GetCrCustomerItem(customerSysNo); var promotionToPython = new SpPromotionToPython() { Order = order }; //计算后的购物车对象 var shoppingCart = SpPromotionEngineBo.Instance.CalculateShoppingCart( platformType, customer, shoppingCartItems, promotionSysNo, null, false, receiveAddress.AreaSysNo, order.DeliveryTypeSysNo, null, order.DefaultWarehouseSysNo, false, promotionToPython); return(shoppingCart); }
/// <summary> /// 计算购物车对象(可适合无购物车对象计算,如:前端未登录用户,公共账户,退换货) /// </summary> /// <param name="platformType">使用平台</param> /// <param name="customer">客户对象</param> /// <param name="shoppingCartItems">购物车明细集合</param> /// <param name="promotionSysNo">促销系统编号集合</param> /// <param name="couponCode">优惠券代码</param> /// <param name="isAutoPromotion">是否自动使用当前有效促销</param> /// <param name="areaSysNo">区域系统编号</param> /// <param name="deliveryTypeSysNo">配送方式系统编号</param> /// <param name="promotionCode">促销代码</param> /// <param name="warehouseSysNo">发货仓库.</param> /// <param name="isExpired">是否过期(是否忽略已使用和过期促销)</param> /// <param name="promotionToPython">促销计算元数据</param> /// <param name="expensesAmount">太平洋保险</param> /// <returns>购物车对象</returns> /// <remarks>2013-09-03 吴文强 创建</remarks> public CrShoppingCart CalculateShoppingCart(PromotionStatus.促销使用平台[] platformType, CrCustomer customer, IList <CBCrShoppingCartItem> shoppingCartItems, int[] promotionSysNo, string couponCode = null, bool isAutoPromotion = false, int?areaSysNo = null, int?deliveryTypeSysNo = null, string promotionCode = null, int?warehouseSysNo = null, bool isExpired = true, SpPromotionToPython promotionToPython = null, decimal expensesAmount = 0M) { var promotions = SpPromotionBo.Instance.GetPromotions(promotionSysNo); if (isAutoPromotion) { promotions.AddRange(SpPromotionBo.Instance.GetValidPromotions(platformType)); } return(CalculateShoppingCart(customer, shoppingCartItems, promotions, areaSysNo, deliveryTypeSysNo, promotionCode, couponCode, warehouseSysNo, isExpired, promotionToPython, expensesAmount)); }
/// <summary> /// 计算订单 /// </summary> /// <param name="customer">客户对象</param> /// <param name="shoppingCart">购物车对象</param> /// <param name="cartGiftItems">赠品明细集合</param> /// <param name="promotionToPython">促销计算元数据</param> /// <returns>购物车对象</returns> /// <remarks>2013-09-03 吴文强 创建</remarks> private CrShoppingCart CalculateOrder(CrCustomer customer, CrShoppingCart shoppingCart, IList <CBCrShoppingCartItem> cartGiftItems, SpPromotionToPython promotionToPython = null) { if (shoppingCart.AllPromotions == null) { return(shoppingCart); } //检查促销支持的商品 ScriptEngine engine = Python.CreateEngine(); ScriptScope scope = engine.CreateScope(); var currentPromotions = shoppingCart.AllPromotions.Where(p => p.PromotionType == (int)PromotionStatus.促销应用类型.应用到商品合计 || p.PromotionType == (int)PromotionStatus.促销应用类型.应用到订单合计 || p.PromotionType == (int)PromotionStatus.促销应用类型.应用到运费).OrderBy(p => p.PromotionType).ThenByDescending(p => p.Priority); //检查支持的促销 foreach (var rule in currentPromotions) { ScriptSource sourceCode = engine.CreateScriptSourceFromString(rule.PromotionRule.RuleScript); scope.SetVariable("CurrSpPromotion", rule); scope.SetVariable("CurrCrCustomer", customer); scope.SetVariable("CurrAllPromotion", shoppingCart.AllPromotions); scope.SetVariable("CurrCartGiftItems", cartGiftItems); scope.SetVariable("CurrSpPromotionToPython", promotionToPython); sourceCode.Execute(scope); try { var pyCalculateCart = scope.GetVariable <Func <CrShoppingCart, CrShoppingCart> >("CheckPromotionProduct"); shoppingCart = pyCalculateCart(shoppingCart); } catch (Exception ex) { SysLog.Instance.Error(LogStatus.系统日志来源.后台, ex.Message, LogStatus.系统日志目标类型.促销, rule.SysNo, ex); } } //计算促销 foreach (var rule in currentPromotions) { ScriptSource sourceCode = engine.CreateScriptSourceFromString(rule.PromotionRule.RuleScript); scope.SetVariable("CurrSpPromotion", rule); scope.SetVariable("CurrCrCustomer", customer); scope.SetVariable("CurrAllPromotion", shoppingCart.AllPromotions); scope.SetVariable("CurrSpPromotionToPython", promotionToPython); sourceCode.Execute(scope); try { var pyCalculateCart = scope.GetVariable <Func <CrShoppingCart, CrShoppingCart> >("CalculateCart"); shoppingCart = pyCalculateCart(shoppingCart); } catch (Exception ex) { SysLog.Instance.Error(LogStatus.系统日志来源.后台, ex.Message, LogStatus.系统日志目标类型.促销, rule.SysNo, ex); } } #region 2013-12-31 吴文强 添加赠品加购计算 //计算赠品加购价 var sumGpPurchasePrice = shoppingCart.GroupPromotions == null ? 0 : shoppingCart.GroupPromotions.Where(gp => gp.UsedGiftProducts != null) .Sum(gp => gp.UsedGiftProducts.Sum(ugp => ugp.PurchasePrice)); //2013-12-31 吴文强 计算订单赠品加购价添加至商品合计金额中(促销商品合计需排除加购价的商品金额) //计算订单赠品加购价 shoppingCart.ProductAmount += sumGpPurchasePrice; //计算购物车结算金额 shoppingCart = CalculateSettlementAmount(shoppingCart); #endregion return(shoppingCart); }
/// <summary> /// 计算购物车 /// </summary> /// <param name="customer">客户对象</param> /// <param name="shoppingCart">购物车对象</param> /// <param name="cartGiftItems">赠品明细集合</param> /// <param name="promotionToPython">促销计算元数据</param> /// <returns>购物车对象</returns> /// <remarks>2013-09-03 吴文强 创建</remarks> private CrShoppingCart CalculateCart(CrCustomer customer, CrShoppingCart shoppingCart, IList <CBCrShoppingCartItem> cartGiftItems, SpPromotionToPython promotionToPython = null) { if (shoppingCart.AllPromotions == null) { return(shoppingCart); } //检查促销支持的商品 ScriptEngine engine = Python.CreateEngine(); ScriptScope scope = engine.CreateScope(); var currentPromotions = shoppingCart.AllPromotions.Where(p => p.PromotionType == (int)PromotionStatus.促销应用类型.应用到分类 || p.PromotionType == (int)PromotionStatus.促销应用类型.应用到商品 || p.PromotionType == (int)PromotionStatus.促销应用类型.团购 || p.PromotionType == (int)PromotionStatus.促销应用类型.组合套餐).OrderBy(p => p.PromotionType).ThenByDescending(p => p.Priority); foreach (var rule in currentPromotions) { ScriptSource sourceCode = engine.CreateScriptSourceFromString(rule.PromotionRule.RuleScript); scope.SetVariable("CurrSpPromotion", rule); scope.SetVariable("CurrCrCustomer", customer); scope.SetVariable("CurrAllPromotion", shoppingCart.AllPromotions); scope.SetVariable("CurrCartGiftItems", cartGiftItems); scope.SetVariable("CurrSpPromotionToPython", promotionToPython); //if (rule.PromotionType == (int)PromotionStatus.促销应用类型.团购) //{ // GsGroupShopping groupShopping= GroupShoppingBo.Instance.Get() // scope.SetVariable("CurrGroupShopping", ); //} //if (rule.PromotionType == (int)PromotionStatus.促销应用类型.组合套餐) //{ // scope.SetVariable("CurrCombo", cartGiftItems); //} sourceCode.Execute(scope); try { var pyCalculateCart = scope.GetVariable <Func <CrShoppingCart, CrShoppingCart> >("CalculateCart"); shoppingCart = pyCalculateCart(shoppingCart); } catch (Exception ex) { SysLog.Instance.Error(LogStatus.系统日志来源.后台, ex.Message, LogStatus.系统日志目标类型.促销, rule.SysNo, ex); } } return(shoppingCart); }
/// <summary> /// 检查商品支持的促销规则 /// </summary> /// <param name="customer">客户对象</param> /// <param name="promotions">有效促销集合</param> /// <param name="shoppingCartItems">购物车明细集合</param> /// <param name="promotionToPython">促销计算元数据</param> /// <returns>购物车明细集合</returns> /// <remarks>2013-09-03 吴文强 创建</remarks> private IList <CBCrShoppingCartItem> CheckPromotionProduct(CrCustomer customer, IList <CBSpPromotion> promotions, IList <CBCrShoppingCartItem> shoppingCartItems, SpPromotionToPython promotionToPython = null) { if (shoppingCartItems == null || shoppingCartItems.Count == 0) { return(new List <CBCrShoppingCartItem>()); } //检查促销支持的商品 ScriptEngine engine = Python.CreateEngine(); ScriptScope scope = engine.CreateScope(); var currentPromotions = promotions.Where(p => p.PromotionType == (int)PromotionStatus.促销应用类型.应用到分类 || p.PromotionType == (int)PromotionStatus.促销应用类型.应用到商品 || p.PromotionType == (int)PromotionStatus.促销应用类型.团购 || p.PromotionType == (int)PromotionStatus.促销应用类型.组合套餐).OrderBy(p => p.PromotionType).ThenByDescending(p => p.Priority); foreach (var rule in currentPromotions) { ScriptSource sourceCode = engine.CreateScriptSourceFromString(rule.PromotionRule.RuleScript); scope.SetVariable("CurrSpPromotion", rule); scope.SetVariable("CurrCrCustomer", customer); scope.SetVariable("CurrAllPromotion", promotions); scope.SetVariable("CurrSpPromotionToPython", promotionToPython); sourceCode.Execute(scope); try { var pyCheckPromotionProduct = scope.GetVariable <Func <IList <CBCrShoppingCartItem>, IList <CBCrShoppingCartItem> > >("CheckPromotionProduct"); shoppingCartItems = pyCheckPromotionProduct(shoppingCartItems); } catch (Exception ex) { SysLog.Instance.Error(LogStatus.系统日志来源.后台, ex.Message, LogStatus.系统日志目标类型.促销, rule.SysNo, ex); } } return(shoppingCartItems); }
/// <summary> /// 计算购物车对象 /// </summary> /// <param name="customer">客户对象</param> /// <param name="shoppingCartItems">购物车明细集合</param> /// <param name="promotions">计算促销集合</param> /// <param name="areaSysNo">区域系统编号</param> /// <param name="deliveryTypeSysNo">配送方式系统编号</param> /// <param name="promotionCode">促销代码</param> /// <param name="couponCode">优惠券代码</param> /// <param name="warehouseSysNo">发货仓库.</param> /// <param name="isExpired">是否过期(是否忽略已使用和过期促销)</param> /// <param name="promotionToPython">促销计算元数据</param> /// <param name="expensesAmount">太平洋保险</param> /// <returns>购物车对象</returns> /// <remarks>2013-09-03 吴文强 创建</remarks> private CrShoppingCart CalculateShoppingCart(CrCustomer customer, IList <CBCrShoppingCartItem> shoppingCartItems, List <CBSpPromotion> promotions, int?areaSysNo, int?deliveryTypeSysNo, string promotionCode, string couponCode, int?warehouseSysNo, bool isExpired = true, SpPromotionToPython promotionToPython = null, decimal expensesAmount = 0M) { var cartGiftItems = shoppingCartItems.Where(item => item.ProductSalesType == (int)CustomerStatus.商品销售类型.赠品).ToList(); shoppingCartItems = shoppingCartItems.Where(item => item.ProductSalesType != (int)CustomerStatus.商品销售类型.赠品).ToList(); CrShoppingCart shoppingCart; //获取促销代码 if (!string.IsNullOrEmpty(promotionCode)) { var promotion = SpPromotionBo.Instance.GetValidPromotions(new[] { promotionCode }); promotions.AddRange(promotion); } var newPromotions = new List <CBSpPromotion>(); foreach (var promotion in promotions) { if (newPromotions.All(p => p.SysNo != promotion.SysNo)) { newPromotions.Add(promotion); } } promotions = newPromotions; //检查购物车明细商品支持的促销 shoppingCartItems = CheckPromotionProduct(customer, promotions, shoppingCartItems, promotionToPython); //根据促销创建购物车组并转换为购物车对象 shoppingCart = CreateShoppingCart(promotions, shoppingCartItems); shoppingCart.AllPromotions = promotions; //计算购物车商品 shoppingCart = CalculateCart(customer, shoppingCart, cartGiftItems, promotionToPython); //计算组价格 shoppingCart = CalculateGroupPrice(shoppingCart); //计算运费 2016-1-25 王耀发 添加 shoppingCart = CalculateFreigh(shoppingCart, deliveryTypeSysNo, areaSysNo, warehouseSysNo); //计算订单 shoppingCart = CalculateOrder(customer, shoppingCart, cartGiftItems, promotionToPython); #region 计算优惠券 //计算优惠券 if (!string.IsNullOrEmpty(couponCode)) { var coupon = PromotionBo.Instance.GetCoupon(couponCode); shoppingCart.CouponCode = couponCode; //解决修改订单时优惠券丢失问题 by ywb 2014-01-03 //判断促销是否有效 if (coupon != null && SpCouponEngineBo.Instance.CheckCoupon(customer.SysNo, new[] { coupon }, shoppingCart, isExpired).Count == 1) { //有效促销,更新购物车促销金额 shoppingCart.CouponCode = couponCode; shoppingCart.CouponAmount = coupon.CouponAmount; } else { shoppingCart.CouponCode = string.Empty; //解决修改订单时优惠券丢失问题 by ywb 2014-01-03 shoppingCart.CouponAmount = 0m; //解决修改订单时优惠券丢失问题 by ywb 2014-01-03 } } #endregion //已使用成功的促销码 if (!string.IsNullOrEmpty(promotionCode)) { var promotion = SpPromotionBo.Instance.GetValidPromotions(new[] { promotionCode }).FirstOrDefault(); if (promotion != null) { foreach (var cbSpPromotion in shoppingCart.GroupPromotions) { if (cbSpPromotion.IsUsed && cbSpPromotion.PromotionSysNo == promotion.SysNo) { shoppingCart.PromotionCode = promotionCode; break; } } foreach (var item in shoppingCart.GetShoppingCartItem()) { if (item.UsedPromotions.Split(';').Contains(promotion.SysNo.ToString())) { shoppingCart.PromotionCode = promotionCode; break; } } } } //计算税费 2016-1-25 王耀发 添加 shoppingCart = CalculateTaxFee(shoppingCart, warehouseSysNo); //计算购物车结算金额 shoppingCart = CalculateSettlementAmount(shoppingCart, expensesAmount); return(shoppingCart); }
/// <summary> /// 获取购物车对象(可适合无购物车对象计算,如:前端未登录用户,公共账户,退换货) /// </summary> /// <param name="platformType">使用平台</param> /// <param name="customer">客户对象</param> /// <param name="shoppingCartItems">购物车明细集合</param> /// <param name="promotionSysNo">促销系统编号集合</param> /// <param name="couponCode">优惠券代码</param> /// <param name="isAutoPromotion">是否自动使用当前有效促销</param> /// <param name="areaSysNo">区域系统编号</param> /// <param name="deliveryTypeSysNo">配送方式系统编号</param> /// <param name="promotionCode">促销代码</param> /// <param name="isFrontProduct">是否只允许前台下单的商品(默认:true)</param> /// <param name="promotionToPython">促销计算元数据</param> /// <param name="warehouseSysNo">发货仓库.</param> /// <param name="expensesAmount">太平洋保险</param> /// <returns>购物车对象</returns> /// <remarks>2013-08-12 吴文强 创建</remarks> public CrShoppingCart GetShoppingCart(PromotionStatus.促销使用平台[] platformType, CrCustomer customer, IList <CBCrShoppingCartItem> shoppingCartItems, int[] promotionSysNo, string couponCode = null, bool isAutoPromotion = false, int?areaSysNo = null, int?deliveryTypeSysNo = null, string promotionCode = null, bool isFrontProduct = true, SpPromotionToPython promotionToPython = null, int?warehouseSysNo = null, decimal expensesAmount = 0M) { //移除下架的商品 shoppingCartItems = CrShoppingCartConvertBo.Instance.RemoveSoldoutProduct(shoppingCartItems, customer.SysNo, isFrontProduct); var shoppingCart = SpPromotionEngineBo.Instance.CalculateShoppingCart(platformType, customer, shoppingCartItems, promotionSysNo, couponCode, isAutoPromotion, areaSysNo, deliveryTypeSysNo, promotionCode, warehouseSysNo, true, promotionToPython, expensesAmount); //移除前台不能下单的赠品 shoppingCart = CrShoppingCartConvertBo.Instance.RemoveSoldoutGift(shoppingCart, isFrontProduct); return(shoppingCart); }