示例#1
0
        public async Task <IActionResult> UpdateProductsPrices([FromBody] ProductPrice[] productPrices)
        {
            var result = await _pricingSearchService.SearchPricesAsync(new PricesSearchCriteria
            {
                Take       = int.MaxValue,
                ProductIds = productPrices.Select(x => x.ProductId).ToArray()
            });

            var targetPricesGroups = result.Results.GroupBy(x => x.PricelistId);
            var sourcePricesGroups = productPrices.SelectMany(x => x.Prices).GroupBy(x => x.PricelistId);

            var changedPrices = new List <Price>();
            var deletedPrices = new List <Price>();

            foreach (var sourcePricesGroup in sourcePricesGroups)
            {
                var targetPricesGroup = targetPricesGroups.FirstOrDefault(x => x.Key == sourcePricesGroup.Key);
                if (targetPricesGroup != null)
                {
                    sourcePricesGroup.ToArray().CompareTo(targetPricesGroup.ToArray(), EqualityComparer <Price> .Default, (state, x, y) =>
                    {
                        switch (state)
                        {
                        case EntryState.Modified:
                        case EntryState.Added:
                            changedPrices.Add(x);
                            break;

                        case EntryState.Deleted:
                            deletedPrices.Add(x);
                            break;
                        }
                    });
                }
                else
                {
                    changedPrices.AddRange(sourcePricesGroup);
                }
            }
            await _pricingService.SavePricesAsync(changedPrices.ToArray());

            if (!deletedPrices.IsNullOrEmpty())
            {
                await _pricingService.DeletePricesAsync(deletedPrices.Select(x => x.Id).ToArray());
            }
            return(NoContent());
        }
示例#2
0
        public virtual async Task Handle(ProductChangedEvent message)
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }
            var deletedProductIds = message.ChangedEntries.Where(x => x.EntryState == EntryState.Deleted && x.OldEntry.Id != null)
                                    .Select(x => x.OldEntry.Id)
                                    .Distinct().ToArray();

            if (!deletedProductIds.IsNullOrEmpty())
            {
                var searchResult = await _pricingSearchService.SearchPricesAsync(new PricesSearchCriteria { ProductIds = deletedProductIds, Take = int.MaxValue });

                if (searchResult.Results.Any())
                {
                    await _pricingService.DeletePricesAsync(searchResult.Results.Select(p => p.Id).ToArray());
                }
            }
        }