| | | 1 | | using OzonDomains.Models.SupplierStatuses; |
| | | 2 | | |
| | | 3 | | namespace Services.SupplierStatusServices; |
| | | 4 | | |
| | | 5 | | /// <summary> |
| | | 6 | | /// Минимум данных о строке состояния, который нужен провайдеру для опроса поставщика. |
| | | 7 | | /// Провайдер не получает саму сущность, чтобы не тащить трекинг EF в HTTP-вызовы. |
| | | 8 | | /// </summary> |
| | | 9 | | public sealed record OrderSupplierStateRef( |
| | | 10 | | long StateId, |
| | | 11 | | int OrderId, |
| | | 12 | | string ProviderKey, |
| | | 13 | | string Stage, |
| | | 14 | | long? CartItemId, |
| | | 15 | | string? ExternalBasketItemId, |
| | | 16 | | string? ExternalOrderNumber, |
| | | 17 | | string? ExternalOrderId, |
| | | 18 | | string? ExternalLineId, |
| | | 19 | | int? CurrentSupplierStatusId); |
| | | 20 | | |
| | | 21 | | /// <summary>Результат опроса поставщика по одной строке состояния.</summary> |
| | | 22 | | public sealed record SupplierStatusSnapshot |
| | | 23 | | { |
| | 1488 | 24 | | public required int OrderId { get; init; } |
| | | 25 | | |
| | | 26 | | /// <summary><see cref="SupplierStatusKind.Cart"/> или <see cref="SupplierStatusKind.Order"/>.</summary> |
| | 891 | 27 | | public required string Kind { get; init; } |
| | | 28 | | |
| | | 29 | | /// <summary>Код статуса у поставщика. Может отсутствовать — тогда статус ищется по имени.</summary> |
| | 841 | 30 | | public string? ExternalCode { get; init; } |
| | | 31 | | |
| | 1004 | 32 | | public required string StatusName { get; init; } |
| | | 33 | | |
| | 195 | 34 | | public string? ExternalOrderNumber { get; init; } |
| | | 35 | | |
| | 114 | 36 | | public string? ExternalOrderId { get; init; } |
| | | 37 | | |
| | 91 | 38 | | public string? ExternalLineId { get; init; } |
| | | 39 | | |
| | 145 | 40 | | public decimal? QuantityConfirmed { get; init; } |
| | | 41 | | |
| | 50 | 42 | | public decimal? QuantityShipped { get; init; } |
| | | 43 | | |
| | 79 | 44 | | public decimal? QuantityRejected { get; init; } |
| | | 45 | | |
| | 102 | 46 | | public DateTime? ExpectedDeliveryAt { get; init; } |
| | | 47 | | |
| | 78 | 48 | | public DateTime? StatusChangedAt { get; init; } |
| | | 49 | | |
| | | 50 | | /// <summary> |
| | | 51 | | /// Ошибка опроса именно по этой строке. Записывается в SyncError, статус при этом |
| | | 52 | | /// не меняется: недоступность API не должна выглядеть как смена состояния заказа. |
| | | 53 | | /// </summary> |
| | 160 | 54 | | public string? Error { get; init; } |
| | | 55 | | } |
| | | 56 | | |
| | | 57 | | /// <summary> |
| | | 58 | | /// Провайдер статусов одного API-поставщика. Закрывает обе стадии: состояние позиции |
| | | 59 | | /// в корзине и состояние оформленного заказа. |
| | | 60 | | /// </summary> |
| | | 61 | | public interface ISupplierStatusProvider |
| | | 62 | | { |
| | | 63 | | /// <summary>Ключ провайдера — см. ApiSupplierSettings.*ProviderKey.</summary> |
| | | 64 | | string ProviderKey { get; } |
| | | 65 | | |
| | | 66 | | /// <summary>Актуальное состояние позиций в корзине поставщика.</summary> |
| | | 67 | | Task<IReadOnlyList<SupplierStatusSnapshot>> FetchCartAsync( |
| | | 68 | | IReadOnlyList<OrderSupplierStateRef> states, CancellationToken ct); |
| | | 69 | | |
| | | 70 | | /// <summary>Статусы оформленных заказов у поставщика.</summary> |
| | | 71 | | Task<IReadOnlyList<SupplierStatusSnapshot>> FetchOrderAsync( |
| | | 72 | | IReadOnlyList<OrderSupplierStateRef> states, CancellationToken ct); |
| | | 73 | | } |