Esempio n. 1
0
        public IndexDocument PreProcessDocument(IndexDocument document, string indexName)
        {
            if (ProductCatalogSearchDomains.Products.Equals(indexName, StringComparison.OrdinalIgnoreCase))
            {
                var articleNumberTagName = TagNames.ArticleNumber;
                if (bool.TryParse(document.Tags.Where(x => TagNames.UseVariantUrl.Equals(x.Name, StringComparison.OrdinalIgnoreCase)).Select(x => x.Value).FirstOrDefault(), out bool useVariantUrl) && !useVariantUrl)
                {
                    articleNumberTagName = TagNames.VariantArticleNumbers;
                }

                IDictionary <Guid, decimal> allItems = new Dictionary <Guid, decimal>();
                var articleNumbers = document.Tags.Where(x => articleNumberTagName.Equals(x.Name, StringComparison.OrdinalIgnoreCase)).Select(x => x.Value);
                foreach (var articleNumber in articleNumbers)
                {
                    if (_mostSoldDataHolder.TryGet(articleNumber, out IDictionary <Guid, decimal> items))
                    {
                        foreach (var item in items)
                        {
                            if (allItems.TryGetValue(item.Key, out decimal currentItem))
                            {
                                allItems[item.Key] = currentItem + item.Value;
                            }
                            else
                            {
                                allItems[item.Key] = item.Value;
                            }
                        }
                    }
                }

                foreach (var item in allItems)
                {
                    document.Tags.Add(new DocumentTag(FilteringConstants.GetMostSoldTagName(item.Key), item.Value));
                }

                foreach (var item in _webSiteIds.Except(allItems.Keys))
                {
                    document.Tags.Add(new DocumentTag(FilteringConstants.GetMostSoldTagName(item), 0));
                }
            }

            return(document);
        }
        private void StatisticsUpdated()
        {
            var articleStatistics = new List <Tuple <Guid, string, decimal> >();

            foreach (var channel in _channelService.GetAll())
            {
                if (channel.WebsiteSystemId != null && channel.MarketSystemId != null)
                {
                    var market = _marketService.Get(channel.MarketSystemId.Value);
                    if (market?.AssortmentSystemId != null)
                    {
                        var categorySystemIds = _categoryService.GetChildCategories(Guid.Empty, market.AssortmentSystemId).SelectMany(x => x.GetChildren(true)).Select(x => x.SystemId).ToList();
                        articleStatistics.AddRange(ModuleECommerce.Instance.Statistics.GetMostSoldArticles(null, channel.WebsiteSystemId.Value, channel.SystemId, categorySystemIds, int.MaxValue, _token)
                                                   .GroupBy(x => x.VariantArticleNumber, StringComparer.OrdinalIgnoreCase)
                                                   .Select(x => new Tuple <Guid, string, decimal>(channel.WebsiteSystemId.Value, x.Key, x.Sum(z => z.Count))));
                    }
                }
            }

            var existingArticleNumbers = _mostSoldDataHolder.GetCurrentArticleNumbers();

            foreach (var item in articleStatistics.GroupBy(x => x.Item2))
            {
                if (!existingArticleNumbers.TryGetValue(item.Key, out HashSet <Guid> existingWebsite))
                {
                    existingWebsite = new HashSet <Guid>();
                }

                var isUpdated = item.Aggregate(false, (current, iitem) =>
                {
                    existingWebsite.Remove(iitem.Item1);
                    decimal old = -1;
                    if (_mostSoldDataHolder.TryGet(iitem.Item2, out IDictionary <Guid, decimal> c))
                    {
                        c.TryGetValue(iitem.Item1, out old);
                    }
                    var r = _mostSoldDataHolder.AddOrUpdate(iitem.Item2, iitem.Item1, iitem.Item3);
                    this.Log().Trace("WebSite: {3} Article: {0} IsUpdated: {2} IsCurrent: {5} OldCount: {4} Count: {1}", iitem.Item2, iitem.Item3, r, iitem.Item1, old, current);
                    return(r | current);
                });

                this.Log().Trace("Article: {0} IsUpdated: {1}", item.Key, isUpdated);
                if (isUpdated)
                {
                    this.Log().Trace("Article: {0} try get", item.Key);
                    var variant = _variantService.Get(item.Key);
                    if (variant != null)
                    {
                        this.Log().Trace("Article: {0} fire event", item.Key);
                        _eventBroker.Publish(new VariantUpdated(variant.SystemId, variant.BaseProductSystemId, new Lazy <Variant>(() => variant)));
                    }
                    else
                    {
                        this.Log().Trace("Article: {0} did not exists", item.Key);
                    }
                }
            }

            foreach (var item in existingArticleNumbers.Where(x => x.Value.Count > 0))
            {
                foreach (var iitem in item.Value)
                {
                    _mostSoldDataHolder.Remove(item.Key, iitem);
                }

                var variant = _variantService.Get(item.Key);
                if (variant != null)
                {
                    this.Log().Trace("Article: {0} fire event", item.Key);
                    _eventBroker.Publish(new VariantUpdated(variant.SystemId, variant.BaseProductSystemId, new Lazy <Variant>(() => variant)));
                }
            }
        }