Перейти к основному содержимому

0034. Мониторинг и бронирование слотов поставок FBW

Копия ADR из репозитория: backend/docs/adr/0034-supply-slot-booking.md. Канонический текст — в репозитории; портал обновляется командой npm run sync:adr.

  • Статус: accepted (2026-07-07 — мониторинг публичным API с общим бюджетом опроса per-аккаунт; бронь FBO-слота — assisted-manual по ADR-0026, полное авто — пост-MVP за фиче-флагом)
  • Дата: 2026-07-07
  • Связанные задачи: OP-115 (Spike · 5.8 · Бронировщик поставок); потребители — OP-114 (модель задания), OP-116 (монитор), OP-117 (движок), OP-118 (статусы/история), OP-119 (уведомления)
  • Связанные ADR: ADR-0026 (стратегия доступа к ЛК — FBO-бронь UI-only), ADR-0006 (rate-limit/retry WB), ADR-0007 (BullMQ), ADR-0009 (планировщик)

Контекст и проблема​

ТЗ 5.8 помечает «Метод бронирования — уточняется» и хочет опрос слотов «1 раз в 1–5 сек». Спайк должен авторитетно ответить: чем мониторить доступность слотов, есть ли API для самого бронирования, и с какой частотой это реально.

Проверка по контракту (локальный OpenAPI-снимок WB)​

FBW-контракт 07-orders-fbw.yaml — только чтение, эндпоинта создания/планирования/бронирования слота нет:

МетодНазначение
POST /api/v1/acceptance/optionsопции приёмки (типы тары по складу) — чтение
GET /api/v1/warehousesсписок складов
GET /api/v1/transit-tariffsтранзитные направления
POST /api/v1/suppliesсписок поставок (чтение)
GET /api/v1/supplies/{ID} · /goods · /packageдетали/товары/упаковка поставки

POST /api/v3/supplies (marketplace) — это FBS-поставка собранных заказов, не FBO-слот (подтверждает вывод ADR-0026).

Мониторинг слотов — публичный: GET /api/tariffs/v1/acceptance/coefficients возвращает коэффициенты приёмки по складам на ближайшие 14 дней одним вызовом (параметр warehouseIDs, по умолчанию — все склады). Приёмка доступна при coefficient ∈ {0, 1} и allowUnload = true. Лимит запросов: 6/мин, интервал 10 сек (на аккаунт продавца).

Вердикт​

  1. Мониторинг доступности слотов — публичный API, ЛК не нужен. Один вызов покрывает все склады × 14 дней.
  2. Само бронирование слота публичным API не выведено → UI-only (подтверждено контрактом; согласуется с ADR-0026).
  3. Частота ТЗ «1–5 сек» невыполнима: минимальный интервал coefficients — 10 сек, бюджет 6/мин на аккаунт. Но поскольку один вызов возвращает всю картину, частый per-задание опрос и не нужен.

Решение​

  1. Монитор (OP-116) — один воркер per WB-аккаунт, а не per-задание. Интервал ~10–15 сек (в рамках 6/мин, ADR-0006), один вызов coefficients (все склады × 14 дней) → фанаут результата по всем активным заданиям аккаунта. «Слот доступен» = coefficient ∈ {0,1} и allowUnload=true, совпадение по складу и дате ±допуск задания.
  2. Бронь (OP-117) — в MVP assisted-manual (вариант E из ADR-0026): при появлении подходящего слота → уведомление (OP-119) с диплинком в экран планирования поставки ЛК; само нажатие делает продавец. Сессии ЛК не храним.
  3. Полностью автоматическая «гонка за слотом» (headless/RPA) — пост-MVP за фиче-флагом, вне критического пути, только с явным согласием и аудитом (граница из ADR-0026).
  4. Уведомления (OP-119) — центральный элемент MVP (детект → нотификация + диплинк), а не второстепенная фича.
  5. Триггер пересмотра: перепроверять живой FBW/Supplies API — как только WB откроет бронирование официально, OP-117 переезжает на API-бронь, а флаговый RPA-модуль становится не нужен.

Последствия​

  • Положительные: мониторинг дёшев и легален (1 вызов/10–15 сек, публичный API); MVP не хранит сессии ЛК и не нарушает оферту WB (ADR-0026); уведомление + диплинк даёт основную продуктовую ценность (продавец мгновенно узнаёт о слоте и бронирует сам).
  • Границы (осознанно): полностью автоматическая бронь в MVP не поставляется — это меняет риск-профиль и требует отдельного решения/бюджета (ADR-0026); частота ограничена 10 сек (не 1–5 сек из ТЗ) — задокументированное расхождение с ТЗ.
  • Влияние на задачи: OP-116 переописан (per-account монитор ~10–15 сек, не 1–5 сек); OP-117 переописан (MVP = assisted-manual, полное авто за флагом пост-MVP). Обе разблокированы и помечены ai-agent-ready.