← Назад к вопросам

Спроектировать диаграмму состояний для сущности Заказ

1.0 Junior🔥 111 комментариев
#Нотации и диаграммы

Условие

Спроектируйте диаграмму состояний (State Machine Diagram) для сущности "Заказ" в системе доставки еды.

Возможные состояния:

  • Создан
  • Ожидает оплаты
  • Оплачен
  • Принят рестораном
  • Готовится
  • Готов к выдаче
  • Передан курьеру
  • В пути
  • Доставлен
  • Отменён
  • Возврат

Задача:

  1. Нарисуйте или опишите диаграмму состояний
  2. Укажите все переходы между состояниями
  3. Укажите условия переходов (guards)
  4. Опишите, какие действия происходят при входе/выходе из состояний
  5. Какие состояния являются конечными?

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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 StateTo StateConditionGuardAction
CreatedPending Paymentorder_confirmedtotal > 0Send invoice, email notification
Pending PaymentPaidpayment_successfulpayment_verifiedConfirm payment, notify kitchen
Pending PaymentCancelledpayment_failed OR timeouttimeout > 30minRefund money, notify customer
PaidAcceptedrestaurant_acceptedkitchen_capacity > 0Notify kitchen, start timer
PaidCancelledtimeout OR customer_canceltimeout > 5minRefund payment, notify restaurant
AcceptedCookingstart_cookingalwaysUpdate ETA, start timer
CookingReady for Pickupcooking_completealwaysNotify customer (push), pack order
Ready for PickupAssigned to Couriercourier_assignedcourier_availableGenerate tracking, notify both
Ready for PickupCancelledtimeouttimeout > 30minRefund, notify customer
Assigned to CourierIn Transitcourier_picked_upalwaysUpdate GPS tracking
In TransitDelivereddelivery_successfuldelivered_timestampComplete order, send receipt
In TransitReturndelivery_failedmax_attempts > 3 OR customer_refuseCreate RMA, start return
DeliveredArchivealwayspayment_completeFinal settlement
ReturnArchivereturn_processedalwaysComplete refund
CancelledArchivealwayspayment_refundedFinal 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)

Конечные состояния в диаграмме:

  1. Delivered — заказ успешно доставлен
  2. Cancelled — заказ отменён
  3. 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 — частично доставлен

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