Как автоматизировать доставку без дублей отправлений
Как связать заказ, посылку и заявку перевозчику, обработать тайм-аут и повтор статуса. Учебный протокол и пилот автоматизации доставки.

Автоматизация доставки должна сохранять однозначную связь между заказом и физическими отправлениями. Её результат — одна корректная заявка на посылку, достоверный статус и управляемое исключение при ошибке. Автоматически отправлять форму перевозчику после каждого изменения заказа недостаточно: так появляются повторные накладные и неверные уведомления.
Сначала выберите один готовый способ доставки и ограниченный тип посылки. Выбор модели исполнения разобран в организации доставки; здесь — надёжность обмена данными после этого выбора.
Какие данные и состояния разделить
До создания заявки проверьте адрес или пункт выдачи, контакты в необходимом объёме, вес, габариты упаковки, состав, оплату и согласованные услуги. Передавайте перевозчику только нужные для исполнения данные с надлежащим основанием. Договор обработки и права доступа к интеграции — часть подготовки.
Заказ магазина и отправление — разные сущности. Один заказ может ехать двумя посылками, а одна посылка иметь несколько этапов отслеживания. Храните внутренний номер заказа, номер посылки, версию заявки и внешний идентификатор. Состояние «готовим» в магазине не должно автоматически означать «принято перевозчиком».
| Этап | Данные для контроля | Действие при проблеме |
|---|---|---|
| Готовность к отправлению | Адрес, упаковка, оплата, услуги | Исправить до передачи |
| Запрос создания | Устойчивый ключ операции | Записать попытку и ответ |
| Неопределённый результат | Ключ, время, внешний ID при наличии | Сверить результат, не создавать новую посылку вслепую |
| Заявка подтверждена | Внешний ID и накладная | Проверить поля перед передачей |
| Отслеживание | Исходный код и время события | Обновить по правилам перехода |
Что делать при тайм-ауте
Тайм-аут не означает, что перевозчик не создал отправление. Запрос мог быть обработан, а ответ потерян. Безопасность повторения зависит от конкретного API: некоторые поддерживают ключ идемпотентности, другие — поиск по вашему номеру, третьи требуют иной процедуры сверки.
В учебном примере заказ O-418 содержит посылку P-1. Интеграция отправила операцию создания с ключом O-418/P-1/v1 и не получила ответ. Система отмечает результат как неопределённый, проверяет наличие отправления предусмотренным API способом и записывает найденный внешний номер. Новую заявку с другим ключом она не создаёт.
Если контракт гарантирует идемпотентность повтора, используйте тот же ключ и согласованные данные в пределах установленных условий и срока хранения ключа. Если такой гарантии или поиска нет, передайте случай ответственному на ручную сверку. Автоматический повтор любого POST-запроса небезопасен; универсальную поддержку идемпотентности всем перевозчикам приписывать нельзя.
Как принимать статусы
Сохраняйте исходные события, их идентификаторы и время. Проверяйте источник уведомления по документации сервиса; входящий запрос сам по себе не подтверждает подлинность статуса. Сопоставьте внешние коды с понятными состояниями магазина, сохранив оригинал для диагностики.
Повтор одного события «вручено» не должен повторно списывать товар или отправлять письмо. Запоздалое «в пути» не должно отменять более позднее подтверждённое вручение. Но не сортируйте статусы только по придуманному числу: возврат после вручения — допустимый новый процесс. Правила переходов и исправлений нужно определить отдельно.
Накладная не доказывает физическую передачу посылки, а вручение не всегда означает окончательное завершение денежных расчётов. Для наложенного платежа и возвратов сверяйте предусмотренные договором реестры отдельно от трекинга.
Ограниченный пилот
В тестовой среде или на учебных данных воспроизведите создание, потерю ответа, повтор уведомления, позднее событие и отмену до передачи. Ожидаемый результат для O-418 — одна внешняя посылка, одна накладная, одно уведомление о каждом значимом событии и сохранённая история.
Затем проведите разрешённый операционный пилот на небольшом контролируемом потоке. Сверяйте журнал магазина, кабинет перевозчика и фактически переданные места. Назначьте человека для очереди исключений и срок её проверки по обещанным отправкам. При дублях, потерянных заявках или расхождении состава временно вернитесь к управляемой ручной обработке; нельзя скрывать ошибку статусом «отправлено».