Спроектировать диаграмму состояний для сущности Заказ
Условие
Спроектируйте диаграмму состояний (State Machine Diagram) для сущности "Заказ" в системе доставки еды.
Возможные состояния:
- Создан
- Ожидает оплаты
- Оплачен
- Принят рестораном
- Готовится
- Готов к выдаче
- Передан курьеру
- В пути
- Доставлен
- Отменён
- Возврат
Задача:
- Нарисуйте или опишите диаграмму состояний
- Укажите все переходы между состояниями
- Укажите условия переходов (guards)
- Опишите, какие действия происходят при входе/выходе из состояний
- Какие состояния являются конечными?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
State Machine Diagram для сущности "Заказ"
1. Текстовое описание диаграммы состояний
┌─────────────────────────────────────────────────────────────────────┐
│ ЖИЗНЕННЫЙ ЦИКЛ ЗАКАЗА │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────┐
│ [*] START │
└──────────┬──────────┘
│
▼
┌─────────────────────────────┐
│ 1. Создан (Created) │ (initial state)
│ Entry: создать заказ │
│ Exit: отправить на платёж │
└──────────┬──────────────────┘
│
│ [order confirmed]
│ Order.total > 0
▼
┌─────────────────────────────────┐
│ 2. Ожидает оплаты (Pending Pay) │
│ Entry: отправить счёт │
│ Exit: начать проверку платежа │
└──┬──────────────────────────────┘
│
├─[payment successful]──┐
│ │
│ [payment failed] │
│ OR [timeout > 30min] ▼
▼ ┌──────────────────┐
┌─────────────────┐ │ 10. Отменён │
│ 3. Оплачен │ │ (Cancelled) │
│ (Paid) │ │ Entry: вернуть $ │
│ Entry: подтв. $ │ │ Exit: архивировать
│ Exit: отправить │ └──────────────────┘
│ в ресторан │ ▲
└────────┬────────┘ │
│ │
│ [restaurant │
│ accepted] │
│ │ [customer requests
▼ │ cancellation]
┌────────────────────────┐ │ OR [timeout]
│ 4. Принят рестораном │ │
│ (Accepted) │──┘
│ Entry: отправить push │
│ Exit: начать готовку │
└─────────┬──────────────┘
│
│ [start cooking]
│
▼
┌────────────────────────┐
│ 5. Готовится │
│ (Cooking) │
│ Entry: обновить время │
│ Exit: начать упаковку │
└─────────┬──────────────┘
│
│ [cooking complete]
│
▼
┌────────────────────────────────┐
│ 6. Готов к выдаче │
│ (Ready for pickup) │
│ Entry: отправить готов push │
│ Exit: передать курьеру │
└────────┬───────────────────────┘
│
│ [assigned to courier]
│
▼
┌────────────────────────────┐
│ 7. Передан курьеру │
│ (Assigned to Courier) │
│ Entry: отправить трек │
│ Exit: начать маршрут │
└─────────┬──────────────────┘
│
│ [pickup by courier]
│
▼
┌──────────────────────────┐
│ 8. В пути │
│ (In Transit) │
│ Entry: обновить location │
│ Exit: доставить │
└──────────┬───────────────┘
│
├─[delivery successful]──┐
│ │
│ [delivery failed] │
│ ▼
│ ┌─────────────────────┐
│ │ 11. Возврат │
│ │ (Return) │
│ │ Entry: создать RMA │
│ │ Exit: обработать │
│ └────────┬────────────┘
│ │
▼ │ [return processed]
┌──────────────────────────┐ ▼
│ 9. Доставлен │ ┌──────────────────┐
│ (Delivered) │ │ Финальные │
│ Entry: завершить заказ │ │ состояния (Final)│
│ Exit: отправить счёт │ │ - Доставлен │
└──────────┬───────────────┘ │ - Отменён │
│ │ - Возврат │
│ └──────────────────┘
│
└──────────────┬────────────────────┐
│ │
▼ ▼
┌─────────┐ [*] END
│ Archive │
└─────────┘
2. Все переходы между состояниями
| From State | To State | Condition | Guard | Action |
|---|---|---|---|---|
| Created | Pending Payment | order_confirmed | total > 0 | Send invoice, email notification |
| Pending Payment | Paid | payment_successful | payment_verified | Confirm payment, notify kitchen |
| Pending Payment | Cancelled | payment_failed OR timeout | timeout > 30min | Refund money, notify customer |
| Paid | Accepted | restaurant_accepted | kitchen_capacity > 0 | Notify kitchen, start timer |
| Paid | Cancelled | timeout OR customer_cancel | timeout > 5min | Refund payment, notify restaurant |
| Accepted | Cooking | start_cooking | always | Update ETA, start timer |
| Cooking | Ready for Pickup | cooking_complete | always | Notify customer (push), pack order |
| Ready for Pickup | Assigned to Courier | courier_assigned | courier_available | Generate tracking, notify both |
| Ready for Pickup | Cancelled | timeout | timeout > 30min | Refund, notify customer |
| Assigned to Courier | In Transit | courier_picked_up | always | Update GPS tracking |
| In Transit | Delivered | delivery_successful | delivered_timestamp | Complete order, send receipt |
| In Transit | Return | delivery_failed | max_attempts > 3 OR customer_refuse | Create RMA, start return |
| Delivered | Archive | always | payment_complete | Final settlement |
| Return | Archive | return_processed | always | Complete refund |
| Cancelled | Archive | always | payment_refunded | Final settlement |
3. Условия переходов (Guards)
Guard выражения:
1. From Created → Pending Payment
[order.total > 0 AND order.customer_valid AND payment_method_exists]
2. From Pending Payment → Paid
[payment.status == 'SUCCESS' AND amount_verified == order.total]
3. From Pending Payment → Cancelled
[payment.status == 'FAILED' OR
(current_time - payment_initiated_time > 30 minutes)]
4. From Paid → Accepted
[restaurant.kitchen_load < max_capacity AND
restaurant.is_open == true AND
restaurant.has_items_in_stock]
5. From Paid → Cancelled
[(current_time - order_created_time > 5 minutes) AND
payment.status != 'REFUNDED'] OR customer_cancel_request
6. From Accepted → Cooking
[kitchen.staff_available == true AND
order.items_assigned == true]
7. From Cooking → Ready for Pickup
[cooking.duration_actual <= cooking.expected_duration + 5min AND
order.packed == true]
8. From Ready for Pickup → Assigned to Courier
[courier.available == true AND
courier.location_near_restaurant < 2km AND
restaurant.staff_ready == true]
9. From Ready for Pickup → Cancelled
[(current_time - ready_time > 30 minutes) AND
NOT courier_assigned]
10. From Assigned to Courier → In Transit
[courier.location == restaurant.location AND
order.handed_to_courier == true]
11. From In Transit → Delivered
[courier.location == delivery_address AND
customer.confirmed_delivery == true]
12. From In Transit → Return
[courier.delivery_attempts > 3 OR
customer.refused_delivery == true OR
order.damaged == true]
4. Actions при входе/выходе из состояний
State: Created
-
Entry Actions:
- Создать запись в БД
- Сгенерировать order_id
- Инициализировать timestamp created_at
- Отправить email подтверждение (системное)
-
Exit Actions:
- Заблокировать редактирование товаров
- Зарезервировать товары на складе
- Вычислить финальную сумму (с доставкой, налогами)
State: Pending Payment
-
Entry Actions:
- Отправить счёт на email
- Отправить push-уведомление
- Запустить таймер (timeout 30 минут)
- Зарезервировать слот на время подготовки
-
Exit Actions:
- Остановить таймер
- Отпустить hold (если payment failed)
- Отправить уведомление (paid или failed)
State: Paid
-
Entry Actions:
- Записать платёж в БД
- Отправить потвердрение платежа
- Отправить заказ в систему ресторана
- Запустить таймер принятия ресторана (5 минут)
- Отправить SMS курьерам (есть заказ)
-
Exit Actions:
- Остановить таймер отказа
- Заблокировать возвраты платежа (кроме отмены)
State: Accepted
-
Entry Actions:
- Отправить push "Ресторан принял заказ"
- Обновить ETA (время готовки)
- Запустить таймер готовки
- Уведомить кухню (дисплей на кухне)
- Отправить push курьеру (заказ принят, приезжай через X минут)
-
Exit Actions:
- Остановить таймер
- Начать отсчёт времени готовки
State: Cooking
-
Entry Actions:
- Отправить push "Заказ готовится"
- Обновить ETA (осталось Y минут)
- Запустить таймер готовки
- Отправить сообщение на дисплей кухни (начать готовку)
-
Exit Actions:
- Остановить таймер
- Запаковать заказ
- Уведомить кассир (заказ готов)
State: Ready for Pickup
-
Entry Actions:
- Отправить push "Ваш заказ готов!"
- Начать поиск ближайшего курьера
- Запустить таймер (курьер должен забрать в течение 30 мин)
- Включить маячок (если есть) - заказ готов
- Отправить SMS курьеру
-
Exit Actions:
- Остановить таймер
- Отложить заказ
- Блокировать модификацию
State: Assigned to Courier
-
Entry Actions:
- Отправить push с номером курьера и фото
- Отправить трек-номер
- Запустить таймер приезда (ETA)
- Отправить SMS курьеру с адресом
- Отправить SMS ресторану (курьер в пути, ETA)
- Начать отсчёт GPS маршрута
-
Exit Actions:
- Остановить таймер
- Блокировать отмену заказа
State: In Transit
-
Entry Actions:
- Начать трекинг GPS в реальном времени
- Отправить push "Курьер выехал"
- Обновлять ETA каждые 30 секунд
- Если задержка > 10 мин → отправить уведомление (apologize)
- Отправить link на отслеживание (если поддерживается)
-
Exit Actions:
- Остановить GPS трекинг
- Отправить финальное уведомление
State: Delivered
-
Entry Actions:
- Отправить push "Заказ доставлен"
- Создать receipt
- Отправить email счёт (итоговый)
- Отправить SMS (спасибо за заказ)
- Запустить сбор отзыва (через 5 минут)
- Запустить таймер для вернуть-исков (если есть)
- Обновить статистику ресторана (доходы, количество заказов)
-
Exit Actions:
- Завершить трекинг
- Архивировать заказ
State: Cancelled
-
Entry Actions:
- Отправить push "Заказ отменён"
- Отправить email с причиной отмены
- Инициировать возврат платежа (если был)
- Отправить SMS курьеру (отмена)
- Отправить SMS ресторану (отмена)
- Запустить таймер возврата (5-7 дней)
- Обновить inventory (вернуть товары)
-
Exit Actions:
- Завершить возврат
- Архивировать
State: Return
-
Entry Actions:
- Создать RMA (Return Merchandise Authorization)
- Отправить push "Начат процесс возврата"
- Отправить email с инструкциями
- Запустить таймер возврата (14 дней)
- Отправить SMS курьеру (забрать заказ обратно)
- Подготовить этикетку для возврата
-
Exit Actions:
- Завершить таймер
- Обработать возврат платежа
- Архивировать RMA
5. Конечные состояния (Final States)
Конечные состояния в диаграмме:
- Delivered — заказ успешно доставлен
- Cancelled — заказ отменён
- Return — заказ вернулся (финальное состояние процесса возврата)
Все конечные состояния ведут в Archive:
Delivered ──[always]──────► Archive
Cancelled ──[always]──────► Archive
Return ────[return_processed]──► Archive
6. Дополнительные правила
Правила отмены:
- Заказ можно отменить из состояний: Created, Pending Payment, Paid, Accepted
- Из Cooking, Ready, In Transit нельзя отменить (только через support)
Правила возврата:
- Возврат возможен только из состояния In Transit (если не удалось доставить)
- Или из состояния Delivered (если клиент запросил возврат)
Таймауты:
- Pending Payment: 30 минут
- Paid (ожидание приёма): 5 минут
- Ready for Pickup: 30 минут
- Cooking: ETA + 10 минут
- In Transit: ETA + 15 минут
Состояния ошибок (опционально):
Можно добавить:
- Error — ошибка в обработке
- OnHold — заказ на удержании (проблема с платежом)
- Partially Delivered — частично доставлен
Эта диаграмма охватывает полный жизненный цикл заказа в системе доставки еды с учётом всех переходов, условий и действий.