Статусная модель

Статусная модель заказа доставки

Диаграмма состояний

Описание состояний

Создание и оценка заказа

new

Начальное состояние заказа. Заказ только что создан в системе.

Переходы:

  • estimated - успешно получена предварительная стоимость заказа
  • estimate_failed - не удалось рассчитать параметры заказа

estimated

Заказ успешно оценен. Рассчитана стоимость доставки, время и маршрут.

Переходы:

  • pending - если передан параметр deferred_till (отложенный поиск)
  • performer_lookup - если параметр deferred_till не передан, начинается немедленный поиск исполнителя

estimate_failed 🔴

Терминальный статус

Не удалось выполнить оценку заказа (невозможно построить маршрут, недоступна зона доставки и т.д.).


Отложенное выполнение

pending

Условие: Этот статус выставляется только если был передан параметр deferred_till (отложенный поиск).

Заказ ожидает наступления даты и времени, указанных в параметре deferred_till. Система находится в режиме ожидания и не начинает поиск исполнителя до наступления указанного времени.

Переходы:

  • performer_lookup - наступило время, указанное в deferred_till
  • cancellation_in_progress - инициирована отмена заказа

Основной поток выполнения заказа

performer_lookup

Система активно ищет доступного исполнителя для заказа.

Как попадаем:

  • Из estimated - если deferred_till не был передан (немедленный поиск)
  • Из pending - когда наступило время, указанное в deferred_till

Переходы:

  • driving_to_pickup - исполнитель назначен и едет к точке забора
  • cancellation_in_progress - отмена заказа во время поиска исполнителя

driving_to_pickup

Исполнитель в пути к точке забора груза.

Переходы:

  • arrived_to_pickup - исполнитель прибыл к точке забора
  • cancellation_in_progress - отмена заказа

arrived_to_pickup

Исполнитель прибыл к точке забора и ожидает передачи груза.

Переходы:

  • picked_up - груз передан исполнителю
  • cancellation_in_progress - отмена заказа

picked_up

Груз получен исполнителем, начинается доставка.

Переходы:

  • driving_to_dropoff - исполнитель едет к точке доставки
  • cancellation_in_progress - отмена заказа (может потребоваться возврат груза)

driving_to_dropoff

Исполнитель в пути к точке доставки с грузом.

Переход:arrived_to_dropoff

arrived_to_dropoff

Исполнитель прибыл к точке доставки.

Переход:dropped_off

dropped_off

Груз успешно доставлен получателю.

Переход:done

done 🔴

Терминальный статус

Заказ успешно завершён. Доставка полностью выполнена.


Процесс отмены заказа

cancellation_in_progress

Начат процесс отмены заказа. Система обрабатывает отмену в зависимости от текущего состояния и причины отмены.

Переходы:

  • cancelled - заказ отменён
  • performer_not_found - исполнитель не найден
  • driving_to_return - требуется возврат груза отправителю

performer_not_found 🔴

Терминальный статус

Не удалось найти исполнителя для заказа или исполнитель отказался от выполнения заказа.

cancelled 🔴

Терминальный статус

Заказ отменён по инициативе клиента, системы или по другим причинам.


Процесс возврата груза

driving_to_return

Исполнитель везёт груз обратно к точке отправления после отмены заказа.

Переход:arrived_to_return

arrived_to_return

Исполнитель прибыл к точке возврата груза.

Переход:returned

returned 🔴

Терминальный статус

Груз успешно возвращён отправителю после отмены заказа.


Терминальные состояния

Заказ завершает свой жизненный цикл при достижении одного из следующих терминальных состояний:

СтатусОписаниеПричина
estimate_failedОшибка оценкиНе удалось рассчитать параметры доставки
doneУспешное завершениеЗаказ выполнен, груз доставлен
performer_not_foundИсполнитель не найденНе удалось назначить исполнителя
returnedГруз возвращёнГруз возвращён отправителю после отмены
cancelledЗаказ отменёнОтмена по инициативе клиента/системы

Основные сценарии

✅ Успешная доставка (немедленный поиск)

Условие: deferred_till не передан

new → estimated → performer_lookup → driving_to_pickup → 
arrived_to_pickup → picked_up → driving_to_dropoff → arrived_to_dropoff → 
dropped_off → done [ТЕРМИНАЛЬНЫЙ]

⏰ Успешная доставка (отложенный поиск)

Условие: передан параметр deferred_till

new → estimated → pending → [ожидание deferred_till] → performer_lookup → 
driving_to_pickup → arrived_to_pickup → picked_up → driving_to_dropoff → 
arrived_to_dropoff → dropped_off → done [ТЕРМИНАЛЬНЫЙ]

❌ Отмена заказа

new → estimated → performer_lookup → driving_to_pickup → 
cancellation_in_progress → cancelled [ТЕРМИНАЛЬНЫЙ]

🔍 Исполнитель не найден

new → estimated → performer_lookup → cancellation_in_progress → 
performer_not_found [ТЕРМИНАЛЬНЫЙ]

🔄 Возврат груза после отмены

new → estimated → performer_lookup → driving_to_pickup → 
arrived_to_pickup → picked_up → cancellation_in_progress → 
driving_to_return → arrived_to_return → returned [ТЕРМИНАЛЬНЫЙ]

⚠️ Неудачная оценка

new → estimated → estimate_failed [ТЕРМИНАЛЬНЫЙ]

Параметры заказа

deferred_till

Тип: DateTime (ISO 8601)
Обязательный: Нет
Описание: Дата и время, до которого заказ должен находиться в состоянии pending перед началом поиска исполнителя.

Поведение:

  • Переданestimatedpending → (ожидание) → performer_lookup
  • Не переданestimatedperformer_lookup (немедленный поиск)

Пример:

{
  "deferred_till": "2024-01-15T14:30:00Z"
}

Примечания

  • Терминальные статусы: estimate_failed, done, performer_not_found, returned, cancelled - из этих статусов переходы невозможны
  • Отложенный поиск: Статус pending используется только при передаче параметра deferred_till
  • Точки отмены: Заказ может быть отменён на этапах: pending, performer_lookup, driving_to_pickup, arrived_to_pickup, picked_up
  • Возврат груза: Процесс возврата (driving_to_returnarrived_to_returnreturned) инициируется из состояния cancellation_in_progress
  • Немедленное выполнение: Если deferred_till не передан, заказ минует статус pending и сразу переходит к поиску исполнителя
  • Множественные исходы отмены: Из cancellation_in_progress возможны три варианта завершения: cancelled, performer_not_found, или процесс возврата с финальным статусом returned