11 KiB
Оркестрация процесса согласования доставки
Цель
Этот документ фиксирует, как должен работать процесс согласования доставки по схеме:
- готовность заказа определяется внешним XML-файлом на FTP;
- клиент получает SMS со ссылкой на публичную страницу выбора доставки;
- при отсутствии реакции запускаются повторные уведомления и ручная обработка логистом;
- после доставки статус передается обратно во внешнюю учетную систему.
Короткий ответ по архитектуре
Рекомендуемое разделение ответственности такое:
Supabase— источник истины для пользователей, заказов, статусов, истории, клиентских ссылок и подтвержденных действий.Edge Functions— безопасные серверные точки входа для изменения состояния заказа и валидации переходов.n8n— оркестратор расписания и интеграций: FTP XML, SMS-провайдер, напоминания по времени, обмен с1Си внешними системами.
Иными словами:
- состояние процесса хранится и проверяется в
Supabase; - время, расписание и внешние вызовы удобнее и надежнее исполнять в
n8n.
Почему не стоит строить это только на Supabase
Теоретически часть сценариев можно делать только через Supabase Edge Functions, но в этом проекте это будет слабее, чем связка Supabase + n8n, по трем причинам:
-
Источник готовности заказа приходит из внешнего XML на FTP. Это интеграционный сценарий, а не чисто внутренний backend-flow.
-
Напоминания завязаны на время. Нужны регулярные проверки: через 3 часа, через 1 час, через 2 часа, перенос на рабочее время.
-
Есть внешние каналы и обратный обмен. SMS,
1С, возможные ошибки доставки и повторная отправка лучше ложатся на отдельный orchestration-слой.
Поэтому для этого проекта оптимальная модель такая:
n8nрешает, когда и что запустить;Supabaseрешает, можно ли менять статус и что именно записать.
Роли систем
Supabase
В Supabase хранится:
ordersorder_historydelivery_slotsdelivery_invitationsintegration_events- пользователи и роли
Через Edge Functions выполняются только валидные переходы:
- создание клиентской ссылки;
- чтение состояния ссылки;
- подтверждение выбора клиентом;
- передача логисту;
- перевод в платное хранение;
- фиксация результата доставки.
n8n
В n8n реализуются сценарии:
- чтение XML с FTP по расписанию;
- определение новых заказов, готовых к доставке;
- запуск первой SMS;
- запуск повторной SMS;
- запуск reminder после незавершенного выбора;
- передача заказа логисту при SLA timeout;
- отправка SMS о платном хранении;
- отправка результата доставки во внешнюю систему.
Публичное приложение
Клиентская страница на dost.supersamsev.ru:
- получает token из SMS;
- читает invitation state из
Supabase; - показывает допустимый интерфейс;
- сохраняет выбор доставки через
Edge Function.
Основной поток данных
1. Проверка готовности заказа
n8n по расписанию читает XML на FTP.
На этом шаге workflow:
- забирает XML;
- парсит записи заказов;
- определяет, какие заказы стали полностью готовыми к доставке;
- сверяет их с
Supabase.
Если заказ уже заведен и еще не переведен в delivery agreement flow, n8n вызывает create-delivery-invitation.
2. Первая SMS
После успешного вызова create-delivery-invitation:
- в
Supabaseсоздается или обновляетсяdelivery_invitations; - заказ получает статус
Ожидает ответа клиента; n8nотправляет первую SMS со ссылкой.
3. Контроль перехода по ссылке
n8n по расписанию проверяет заказы в статусе Ожидает ответа клиента.
Основание для решения:
delivery_invitations.sent_atdelivery_invitations.opened_atdelivery_invitations.confirmed_atorders.status
Если клиент не перешел по ссылке в течение 3 часов:
n8nотправляет повторную SMS;- фиксирует это в
integration_eventsили отдельном поле reminder state.
Если и после повторной SMS перехода нет:
n8nвызываетtransfer-to-logistics;- заказ получает статус
Передан логисту.
4. Незавершенный выбор
Если клиент открыл ссылку, но не подтвердил время:
- это видно по
opened_at, при этомconfirmed_atостается пустым; n8nзапускает reminder через 1 час;- если подтверждения нет еще 2 часа,
n8nпередает заказ логисту.
Проверка рабочего времени должна жить именно в n8n, потому что это orchestration rule.
5. Ручная работа логиста
После статуса Передан логисту автоматический сценарий считается неуспешным и дальше заказ ведет логист.
Логист:
- связывается с клиентом;
- согласует доставку вручную;
- либо переводит заказ в
Доставка согласована; - либо после безуспешных попыток переводит заказ в
Платное хранение.
После перевода в Платное хранение:
n8nотправляет клиенту отдельную SMS.
6. Доставка и обратная интеграция
После статуса Доставка согласована:
- логист планирует доставку;
- водитель выполняет доставку;
- приложение фиксирует
ДоставленилиПроблема доставки.
При успешной доставке:
n8nотправляет статус во внешнюю систему.
При проблеме доставки:
- заказ возвращается логисту;
- цикл ручного согласования повторяется.
Где живет “понятие времени”
Это ключевой вопрос проекта.
Само приложение не должно самостоятельно “просыпаться” и решать, что прошло 3 часа.
Правильная модель такая:
- приложение и
Supabaseтолько фиксируют события и timestamps; n8nрегулярно запускается по cron и вычисляет, наступило ли время следующего действия.
То есть логика выглядит так:
Supabaseхранитsent_at,opened_at,confirmed_at, текущий статус;n8nкаждые 5-15 минут проверяет, какие записи пересекли SLA-порог;- если порог наступил,
n8nзапускает нужный сценарий.
Рекомендуемый набор workflow в n8n
-
FTP XML PollerЧитает XML с FTP и определяет готовые заказы. -
Delivery Offer DispatcherСоздает invitation и отправляет первую SMS. -
Delivery Reminder SchedulerПроверяет timeouts:- 3 часа до повторной SMS
- еще 3 часа до передачи логисту
- 1 час до reminder после opened/no-confirm
- 2 часа до передачи логисту после reminder
-
Paid Storage NotifierОтправляет SMS при статусеПлатное хранение. -
Delivery Result ExporterПередает итог доставки во внешнюю систему.
Минимальный набор данных, который нужен для orchestration
Чтобы схема работала стабильно, в Supabase должны быть доступны как минимум:
orders.idorders.order_numberorders.statusorders.delivery_agreement_statusdelivery_invitations.order_iddelivery_invitations.token_hashdelivery_invitations.statedelivery_invitations.sent_atdelivery_invitations.opened_atdelivery_invitations.confirmed_atdelivery_invitations.logistics_transferred_atdelivery_invitations.paid_storage_atdelivery_invitations.delivered_atdelivery_slotsintegration_events
Итоговое решение
Для этого проекта рабочая и рекомендуемая архитектура такая:
- FTP XML читает
n8n; - time-based automation исполняет
n8n; - SMS и внешние интеграции исполняет
n8n; Supabaseхранит бизнес-состояние;Edge Functionsвалидируют и фиксируют изменения состояния;- клиентское приложение показывает состояние и принимает подтверждение клиента.
Это дает понятное разделение:
n8nотвечает за “когда запускать сценарий”;Supabaseотвечает за “какое состояние заказа сейчас истинно”.