Заказы
Жизненный цикл заказа
NEW → PROCESSING → SENT → COMPLETED
↓ ↓
ERROR ARCHIVED
↓
CANCELLED
| Статус | Описание |
|---|---|
NEW | Заказ оформлен покупателем, ожидает обработки |
PROCESSING | Менеджер принял в работу |
SENT | Успешно передан в mphone (есть external_id) |
ERROR | Ошибка при передаче в mphone |
CANCELLED | Отменён |
COMPLETED | Выполнен и закрыт |
ARCHIVED | Перенесён в архив |
Оформление заказа покупателем
POST /api/v1/orders
Body:
{
"items": [{ "productId": 1, "quantity": 2 }],
"customerName": "Иван Петров",
"customerPhone": "+79001234567",
"customerEmail": "ivan@example.com",
"deliveryMethod": "courier",
"deliveryAddress": "Москва, ул. Пушкина, д. 1",
"comment": "Позвоните перед доставкой"
}
Перед созданием заказа клиент может валидировать корзину:
POST /api/v1/cart/validate
Body: [{ "productId": 1, "quantity": 2 }]
→ Возвращает актуальные цены и флаги наличия
Обработка заказов в Админ-панели
Список заказов
Страница /admin/orders — таблица заказов с фильтрами по статусу и дате.
Карточка заказа
Страница /admin/orders/{id}:
- Просмотр состава заказа
- Изменение статуса
- Добавление/удаление позиций
- Комментарий менеджера (
admin_comment) - Кнопка «Передать в mphone» (доступна для
NEW,PROCESSING)
Смена статуса
PATCH /api/v1/admin/orders/{id}
Body: { "status": "PROCESSING", "adminComment": "Взят в работу" }
Добавление позиции
POST /api/v1/admin/orders/{id}/items
Body: { "productId": 5, "quantity": 1 }
Удаление позиции
DELETE /api/v1/admin/orders/{id}/items/{itemId}
Стоимость доставки
Менеджер задаёт стоимость доставки отдельно — она хранится в поле delivery_cost и прибавляется к сумме заказа:
PATCH /api/v1/admin/orders/{id}/delivery-cost
Body: { "deliveryCost": 500 }
В карточке заказа доступна справочная таблица тарифов доставки по зонам и категориям товаров.
Удаление и массовая очистка
DELETE /api/v1/admin/orders/{id} # удалить один заказ (ADMIN/SUPER_ADMIN)
GET /api/v1/admin/orders/bulk-delete/preview # предпросмотр: сколько старых заказов будет удалено
DELETE /api/v1/admin/orders/bulk-delete # удалить заказы старше N дней
Массовое удаление и предпросмотр доступны в разделе «Заказы» в блоке очистки старых заказов.
Передача заказа в mphone
После нажатия «Передать в mphone» (или вызова POST /api/v1/admin/orders/{id}/submit):
AdminOrderServiceImpl.submitToExternal()вызываетMphoneApiClient.insertOrder()- При успехе:
status → SENT, сохраняетсяexternal_id - При ошибке:
status → ERROR, причина записывается в лог
Повторная попытка — снова нажать кнопку. Статус ERROR не является финальным.
Состав заказа
Каждая позиция (order_items) хранит:
- Снимок
product_name— не меняется, даже если товар переименован price_at_order— цена на момент заказаline_total—quantity × price_at_order
Это защищает от изменения суммы заказа при редактировании каталога.
Заказы авторизованных пользователей
Если покупатель авторизован, к заказу привязывается user_id. Просмотр своих заказов:
GET /api/v1/orders/my # список заказов текущего пользователя
GET /api/v1/orders/{id} # конкретный заказ