Заказы и жизненный цикл¶
Заказ — центральная сущность системы. Клиент формирует заказ из товаров, посредник проверяет, организует оплату, выкуп, консолидацию и передачу в доставку.
Типы заказов¶
Тип (orders.type) |
Описание |
|---|---|
standard |
Обычный: клиент сам добавляет товары |
self_buyout |
Самовыкуп: клиент отправляет на склад посредника (код клиента + адрес склада) |
free |
Свободный: товары добавляет посредник на этапе «Проверка» |
Статусы заказа¶
flowchart TD
draft[Черновик] --> check[Проверка]
check --> await_pay[Ожидает оплаты]
await_pay --> buyout[Выкуп товаров]
buyout --> consolidation[Консолидация]
consolidation --> prepare_ship[Подготовка к отправке]
prepare_ship --> ready_ship[Готов к отгрузке]
ready_ship --> in_transit[В пути]
in_transit --> arrived[Прибыл]
arrived --> accepted[Принят]
check -.->|отмена| canceled[Отменён]
Переходы линейные (OrderFlowService::advanceTo), реализованы стейт-машиной (spatie/laravel-model-states). Каждый переход блокируется, если есть необработанные товары (unprocessedReason()): check → await_process, buyout → await_buyout, consolidation → await_arrival.
Над товарами в карточке заказа показывается баннер-инструкция по текущему статусу (STATUS_BANNERS / App\Support\OrderBanners) с подсказками и кнопкой перехода на следующий этап.
Жизненный цикл¶
sequenceDiagram
participant C as Клиент
participant A as Посредник
C->>C: Создаёт заказ (черновик), добавляет товары
C->>A: «Отправить на проверку»
A->>A: Проверяет товары (check_status), правит цену/кол-во (agent_*)
A->>C: Выдаёт реквизиты / счёт
C->>C: «Оплатить с баланса» (или «Запросить пополнение»)
Note over C,A: Списание → заказ переходит в «Выкуп»
A->>A: Выкуп на площадках (buyout_status, частичный/отмена)
A->>A: Консолидация (arrival_status, группы)
A->>A: Создаёт отгрузку → расчёт доставки
C->>C: Оплачивает доставку
A->>A: Формирует груз → в пути → прибыл
C->>C: «Принять» → заказ «Принят»
Позиции, статусы и группы¶
Статусы позиции (order_items)¶
- Проверка (
check_status):await_process→checked/canceled. - Выкуп (
buyout_status):await_buyout→bought/partial(+buyout_qty) /canceled(+причина). - Прибытие (
arrival_status):await_arrival→arrived/partial(+arrival_qty). Частичное прибытие ≤ выкуплено. - Возврат логистический (
goods_return_status):none/processing/returned— это движение товара, не денег.
Отмена выкупа ≠ возврат денег
«Оформление возврата» (return-item) — логистика, без денег. «Вернуть деньги клиенту» (refund-money) — денежное движение через RefundService. Невыкупленная часть к возврату сразу; выкупленная-неприбывшая — после финализации прибытия.
Группы консолидации (item_groups)¶
На статусах buyout+ товары авто-группируются по площадке ссылки (1688/Taobao/Tmall/Poizon/…). Заголовок группы богатый: ИД заказа, магазин/продавец, выкупной аккаунт, фактически оплачено, доставка на группу (+чекбокс), трек-номера, Кредит и Скидка (тройной переключатель: выкл/на контроле/выполнено), авто-цвет.
Название, категории и переопределения¶
- Название заказа (
orders.title) — задаётся клиентом/посредником (эндпоинтorders.title); показывается в списках вместо/вместе с номером. Если не задано — берётся имя первого товара. - Категории товаров (
product_categories+order_items.product_category) — системные (одежда/обувь/стройматериалы и пр.) и свои у посредника. - Ручные переопределения по заказу (
orders.manual_commission_pct/manual_rate) — индивидуальные комиссия и курс на конкретный заказ поверх тарифа. orders.seen_at— отметка «просмотрен посредником»;auto_group_disabled— отключить автогруппировку товаров;order_items.client_comment— комментарий клиента к позиции.
Доп. услуги к позициям¶
К отдельным товарам можно заказать доп. услуги (фото/видео/обмер/пересчёт) с загрузкой медиа и тарификацией по валюте заказа. Подробно — в разделе Доп. услуги к товарам.
Расчёт заказа¶
OrdersController::orderCalc через CommissionService (по тарифу клиента) + RateService:
positions/qty, стоимость товаров / доставки / услуг;- комиссия
commission_pct+commission_cny(ступенчатая, первый заказ); total_cny, расчётный курсrate,total_rub;- «К возврату клиенту» (
refund_due_cny) — товары + доставка пропорционально непривезённому.
Расчёт идёт по эффективным значениям (agent_* ?? client); если посредник переопределил — клиентское показывается зачёркнутым. При оплате создаётся неизменяемый снимок (order_calc_snapshots).
История и журнал¶
order_status_history— смена статусов (таймлайн «История заказа» в правой панели).order_activities— журнал событий (правки, статусы, отгрузки, грузы, оплаты, возвраты): кто / когда / что.
Импорт товаров (XLS/CSV)¶
Двухшаговый мастер (maatwebsite/excel): загрузка → парсинг в сессию → превью с авто-подбором маппинга колонок (двухпроходный: точное совпадение, затем вхождение ≥ 4 символов) → выбор маппинга (name/price/qty/url/size/color/image/…) → commit. Поддержаны Excel-формулы (WithCalculatedFormulas) и заголовки не в первой строке. Доступен и клиенту, и посреднику (общие компоненты AddItemForm/ImportItemsWizard).