| | | 1 | | using OzonDomains.Models; |
| | | 2 | | |
| | | 3 | | namespace Services.DataServices.OrderRollback; |
| | | 4 | | |
| | | 5 | | /// <summary>Тип значения поля заказа для парсинга/применения при откате.</summary> |
| | | 6 | | public enum RollbackFieldKind |
| | | 7 | | { |
| | | 8 | | String, |
| | | 9 | | Int, |
| | | 10 | | Decimal, |
| | | 11 | | Bool, |
| | | 12 | | DateTime, |
| | | 13 | | ForeignKey |
| | | 14 | | } |
| | | 15 | | |
| | | 16 | | /// <summary>Справочник, используемый FK-полем (имя в истории → Id в Orders).</summary> |
| | | 17 | | public enum RollbackLookup |
| | | 18 | | { |
| | | 19 | | None, |
| | | 20 | | AppStatus, |
| | | 21 | | Manufacturer, |
| | | 22 | | Warehouse, |
| | | 23 | | Supplier, |
| | | 24 | | OzonClient |
| | | 25 | | } |
| | | 26 | | |
| | | 27 | | /// <summary>Описание одного отслеживаемого поля заказа.</summary> |
| | | 28 | | public sealed record RollbackFieldDef( |
| | | 29 | | string Column, |
| | | 30 | | string Display, |
| | | 31 | | RollbackFieldKind Kind, |
| | | 32 | | RollbackLookup Lookup = RollbackLookup.None); |
| | | 33 | | |
| | | 34 | | /// <summary> |
| | | 35 | | /// Каталог полей заказа, которые отслеживает MySQL-триггер <c>trg_orders_after_update</c> |
| | | 36 | | /// и которые можно восстановить (откатить/накатить) из истории. |
| | | 37 | | /// Список должен оставаться в синхроне с триггером. Поле <c>Status</c> намеренно исключено: |
| | | 38 | | /// в EF-модели оно <c>[NotMapped]</c> и вычисляется из <see cref="Order.ClientStatus"/> — задать его напрямую нельзя. |
| | | 39 | | /// </summary> |
| | | 40 | | public static class OrderRollbackFieldCatalog |
| | | 41 | | { |
| | 1 | 42 | | public static readonly IReadOnlyList<RollbackFieldDef> Fields = new List<RollbackFieldDef> |
| | 1 | 43 | | { |
| | 1 | 44 | | new("ShipmentNumber", "Номер отправления", RollbackFieldKind.String), |
| | 1 | 45 | | new("ProcessingDate", "Принят в обработку", RollbackFieldKind.DateTime), |
| | 1 | 46 | | new("ShippingDate", "Дата отгрузки", RollbackFieldKind.DateTime), |
| | 1 | 47 | | new("AppStatusId", "Статус в отчете", RollbackFieldKind.ForeignKey, RollbackLookup.AppSta |
| | 1 | 48 | | new("ShipmentAmount", "Сумма отправления", RollbackFieldKind.Decimal), |
| | 1 | 49 | | new("ProductName", "Наименование", RollbackFieldKind.String), |
| | 1 | 50 | | new("ProductKey", "Ключ товара", RollbackFieldKind.String), |
| | 1 | 51 | | new("Article", "Артикул", RollbackFieldKind.String), |
| | 1 | 52 | | new("ManufacturerId", "Производитель", RollbackFieldKind.ForeignKey, RollbackLookup.Manufa |
| | 1 | 53 | | new("Price", "Цена", RollbackFieldKind.Decimal), |
| | 1 | 54 | | new("Quantity", "Количество", RollbackFieldKind.Int), |
| | 1 | 55 | | new("ShipmentWarehouseId", "Склад отгрузки", RollbackFieldKind.ForeignKey, RollbackLookup.Wareho |
| | 1 | 56 | | new("SupplierId", "Поставщик", RollbackFieldKind.ForeignKey, RollbackLookup.Suppli |
| | 1 | 57 | | new("OrderNumberToSupplier", "Номер заказа", RollbackFieldKind.String), |
| | 1 | 58 | | new("PurchasePrice", "Цена закупки", RollbackFieldKind.Decimal), |
| | 1 | 59 | | new("OriginalPurchasePrice", "Цена закупки до перевода", RollbackFieldKind.Decimal), |
| | 1 | 60 | | new("MinOzonCommission", "Минимальная комиссия ОЗОН", RollbackFieldKind.Decimal), |
| | 1 | 61 | | new("MaxOzonCommission", "Максимальная комиссия ОЗОН", RollbackFieldKind.Decimal), |
| | 1 | 62 | | new("MinProfit", "Минимальная прибыль", RollbackFieldKind.Decimal), |
| | 1 | 63 | | new("MaxProfit", "Максимальная прибыль", RollbackFieldKind.Decimal), |
| | 1 | 64 | | new("MinDiscount", "Минимальная скидка, %", RollbackFieldKind.Decimal), |
| | 1 | 65 | | new("MaxDiscount", "Максимальная скидка, %", RollbackFieldKind.Decimal), |
| | 1 | 66 | | new("CostPrice", "Себестоимость", RollbackFieldKind.Decimal), |
| | 1 | 67 | | new("DeliveryCity", "Город доставки", RollbackFieldKind.String), |
| | 1 | 68 | | new("IsVerified", "Статус обработки", RollbackFieldKind.Bool), |
| | 1 | 69 | | new("IsAccepted", "Принят", RollbackFieldKind.Bool), |
| | 1 | 70 | | new("OzonClientId", "Ozon клиент", RollbackFieldKind.ForeignKey, RollbackLookup.OzonCl |
| | 1 | 71 | | }; |
| | | 72 | | |
| | | 73 | | /// <summary>Множество отслеживаемых имён колонок (для реконструкции снимка).</summary> |
| | 1 | 74 | | public static readonly IReadOnlySet<string> TrackedColumns = |
| | 28 | 75 | | Fields.Select(f => f.Column).ToHashSet(StringComparer.Ordinal); |
| | | 76 | | |
| | | 77 | | public static RollbackFieldDef? Find(string? column) |
| | 76 | 78 | | => column is null ? null : Fields.FirstOrDefault(f => f.Column == column); |
| | | 79 | | } |