| | | 1 | | using Services.ApiServices.OzonApi.Filters; |
| | | 2 | | |
| | | 3 | | namespace Services.BitrixStockServices; |
| | | 4 | | |
| | | 5 | | /// <summary>Сопоставление ответа Ozon на пакетное обновление остатков со строками отчёта.</summary> |
| | | 6 | | internal static class BitrixStockApplyBatchMatcher |
| | | 7 | | { |
| | | 8 | | /// <summary> |
| | | 9 | | /// Находит отправленную позицию для строки ответа Ozon. Сначала по <c>offer_id + warehouse_id</c>: Ozon |
| | | 10 | | /// принимает обновление по offer_id и возвращает свой product_id, а в отчёте он может быть устаревшим |
| | | 11 | | /// (карточку пересоздали или удалили). Раньше строка ответа искалась только по <c>product_id</c>: при |
| | | 12 | | /// несовпадении она терялась, позиция считалась необработанной и повторялась по одной, а Ozon отвечал |
| | | 13 | | /// «слишком часто» (на деле остаток уже был обновлён пакетом). Запасной вариант — <c>product_id + warehouse_id</c>. |
| | | 14 | | /// </summary> |
| | | 15 | | public static BitrixStockPushItemDto? FindItem(IReadOnlyList<BitrixStockPushItemDto> items, UpdateStockResult row) |
| | | 16 | | { |
| | 8 | 17 | | if (!string.IsNullOrWhiteSpace(row.OfferId)) |
| | | 18 | | { |
| | 6 | 19 | | var byOffer = items.FirstOrDefault(i => |
| | 13 | 20 | | i.WarehouseId == row.WarehouseId && |
| | 13 | 21 | | string.Equals(i.OfferId, row.OfferId, StringComparison.OrdinalIgnoreCase)); |
| | 6 | 22 | | if (byOffer != null) |
| | 4 | 23 | | return byOffer; |
| | | 24 | | } |
| | | 25 | | |
| | 4 | 26 | | return row.ProductId > 0 |
| | 3 | 27 | | ? items.FirstOrDefault(i => i.ProductId == row.ProductId && i.WarehouseId == row.WarehouseId) |
| | 4 | 28 | | : null; |
| | | 29 | | } |
| | | 30 | | |
| | | 31 | | /// <summary>Ошибка частоты обновления остатка у Ozon: помогает повтор через 1–2 минуты (текст — из <see cref="Bitri |
| | | 32 | | public static bool IsTooFrequentError(string? error) => |
| | 7 | 33 | | !string.IsNullOrWhiteSpace(error) && |
| | 7 | 34 | | error.Contains("слишком часто", StringComparison.OrdinalIgnoreCase); |
| | | 35 | | } |