示例#1
0
        public virtual async Task EvaluateProductPricesAsync(IEnumerable <Product> products, WorkContext workContext)
        {
            if (products == null)
            {
                throw new ArgumentNullException(nameof(products));
            }
            if (workContext == null)
            {
                throw new ArgumentNullException(nameof(workContext));
            }

            //Evaluate products prices
            var evalContext    = workContext.ToPriceEvaluationContext(products);
            var cacheKey       = CacheKey.With(GetType(), "EvaluateProductPricesAsync", evalContext.GetCacheKey());
            var pricesResponse = await _memoryCache.GetOrCreateExclusiveAsync(cacheKey, async (cacheEntry) =>
            {
                cacheEntry.AddExpirationToken(PricingCacheRegion.CreateChangeToken());
                cacheEntry.AddExpirationToken(_apiChangesWatcher.CreateChangeToken());

                return(await _pricingApi.EvaluatePricesAsync(evalContext.ToPriceEvaluationContextDto()));
            });

            ApplyProductPrices(products, pricesResponse, workContext);

            //Evaluate product discounts
            //Fill product inventories for getting InStockQuantity data for promotion evaluation
            await _inventoryService.EvaluateProductInventoriesAsync(products.ToList(), workContext);

            var promoEvalContext = workContext.ToPromotionEvaluationContext(products);
            await _promotionEvaluator.EvaluateDiscountsAsync(promoEvalContext, products);

            //Evaluate product taxes
            var taxEvalContext = workContext.ToTaxEvaluationContext(products);
            await _taxEvaluator.EvaluateTaxesAsync(taxEvalContext, products);
        }
示例#2
0
        public async Task <Product[]> GetProductsAsync(ProductSearchCriteria criteria)
        {
            var result = await _catalogModuleSearch.SearchProductsAsync(criteria.ToApiCriteria());

            var products = new List <Product>();

            if (!result.Items.IsNullOrEmpty())
            {
                var evaluationContext = new PriceEvaluationContext
                {
                    ProductIds = result.Items.Select(p => p.Id).ToArray()
                };

                var prices = await _pricingModule.EvaluatePricesAsync(evaluationContext);

                products.AddRange(
                    result
                    .Items
                    .Select(
                        product => product.ToProduct(
                            prices.FirstOrDefault(p => p.ProductId == product.Id)
                            )
                        )
                    );
            }

            return(products.ToArray());
        }