Esempio n. 1
0
        /// <summary>
        /// 从购物车商品构建订单商品创建参数
        /// </summary>
        /// <param name="cartProduct">购物车商品</param>
        /// <returns></returns>
        public static CreateOrderProductParameters ToCreateOrderProductParameters(
            this CartProduct cartProduct)
        {
            var parameters = new CreateOrderProductParameters();

            parameters.ProductId              = cartProduct.Product.Id;
            parameters.MatchParameters        = cartProduct.MatchParameters;
            parameters.Extra["cartProductId"] = cartProduct.Id;
            return(parameters);
        }
        /// <summary>
        /// 计算订单商品的单价
        /// 返回价格保证大于或等于0
        /// </summary>
        /// <param name="userId">用户Id,未登录时等于null</param>
        /// <param name="parameters">创建订单商品的参数</param>
        /// <returns></returns>
        public virtual OrderPriceCalcResult CalculateOrderProductUnitPrice(
            Guid?userId, CreateOrderProductParameters parameters)
        {
            var result      = new OrderPriceCalcResult();
            var calculators = Application.Ioc.ResolveMany <IOrderProductUnitPriceCalculator>();

            foreach (var calculator in calculators)
            {
                calculator.Calculate(userId, parameters, result);
            }
            if (result.Parts.Sum() < 0)
            {
                throw new BadRequestException(new T("Order product unit price must not be negative"));
            }
            return(result);
        }
Esempio n. 3
0
        /// <summary>
        /// 从商品匹配数据获取匹配的价格和货币单位
        /// </summary>
        public void Calculate(
            long?userId, CreateOrderProductParameters parameters, OrderPriceCalcResult result)
        {
            var currencyManager = Application.Ioc.Resolve <CurrencyManager>();
            var productManager  = Application.Ioc.Resolve <ProductManager>();
            var product         = productManager.GetProduct(parameters.ProductId);

            if (product == null)
            {
                throw new BadRequestException(new T("The product you are try to purchase does not exist."));
            }
            var data = product.MatchedDatas
                       .Where(d => d.Price != null)
                       .WhereMatched(parameters.MatchParameters).FirstOrDefault();
            var basePrice = (data == null) ? 0M : data.Price.Value;
            var currency  = (data == null) ? currencyManager.GetDefaultCurrency() : data.GetCurrency();

            result.Currency = currency.Type;
            result.Parts.Add(new OrderPriceCalcResult.Part("ProductUnitPrice", basePrice));
        }
        /// <summary>
        /// 从订单商品创建参数生成显示信息
        /// </summary>
        /// <param name="parameters">订单商品创建参数</param>
        /// <param name="userId">用户Id,未登录时等于null</param>
        /// <returns></returns>
        public static OrderProductDisplayInfo ToOrderProductDisplayInfo(
            this CreateOrderProductParameters parameters, Guid?userId)
        {
            var orderManager         = Application.Ioc.Resolve <SellerOrderManager>();
            var productManager       = Application.Ioc.Resolve <ProductManager>();
            var productAlbumManager  = Application.Ioc.Resolve <ProductAlbumManager>();
            var currencyManager      = Application.Ioc.Resolve <CurrencyManager>();
            var descriptionProviders = Application.Ioc.ResolveMany <IProductMatchParametersDescriptionProvider>();
            var unitPrice            = orderManager.CalculateOrderProductUnitPrice(userId, parameters);
            var info    = new OrderProductDisplayInfo();
            var product = productManager.GetWithCache(parameters.ProductId);

            if (product == null)
            {
                throw new BadRequestException(new T("The product you are try to purchase does not exist."));
            }
            info.ProductId      = product.Id;
            info.OrderProductId = null;
            info.Name           = new T(product.Name);
            info.ImageWebPath   = productAlbumManager.GetAlbumImageWebPath(
                product.Id, null, ProductAlbumImageType.Thumbnail);
            info.MatchedParameters            = parameters.MatchParameters;
            info.MatchedParametersDescription = string.Join(" ", descriptionProviders
                                                            .Select(p => p.GetDescription(product, parameters.MatchParameters))
                                                            .Where(d => !string.IsNullOrEmpty(d)));
            info.UnitPrice                    = unitPrice.Parts.Sum();
            info.OriginalUnitPrice            = info.UnitPrice;
            info.Currency                     = currencyManager.GetCurrency(unitPrice.Currency);
            info.UnitPriceString              = info.Currency.Format(info.UnitPrice);
            info.UnitPriceDescription         = unitPrice.Parts.GetDescription();
            info.OriginalUnitPriceString      = info.UnitPriceString;
            info.OriginalUnitPriceDescription = info.UnitPriceDescription;
            info.Count         = parameters.MatchParameters.GetOrderCount();
            info.ShippedCount  = 0;
            info.SellerId      = product.Seller?.Id;
            info.Seller        = product.Seller?.Username;
            info.State         = product.State;
            info.Type          = product.Type;
            info.IsRealProduct = product.GetProductType() is IAmRealProduct;
            return(info);
        }