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