Beispiel #1
0
        /// <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));
        }
Beispiel #2
0
        /// <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);
        }
Beispiel #8
0
        /// <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);
        }