
- Обновлена форма создания поставок расходников фулфилмента для использования v2 GraphQL API - Заменена мутация CREATE_SUPPLY_ORDER на CREATE_FULFILLMENT_CONSUMABLE_SUPPLY - Обновлена структура input данных под новый формат v2 - Сделано поле логистики опциональным - Добавлено поле notes для комментариев к поставке - Обновлены refetchQueries на новые v2 запросы - Исправлены TypeScript ошибки в интерфейсах - Удалена дублирующая страница consumables-v2 - Сохранен оригинальный богатый UI интерфейс формы (819 строк) - Подтверждена работа с новой таблицей FulfillmentConsumableSupplyOrder Технические изменения: - src/components/fulfillment-supplies/create-fulfillment-consumables-supply-v2.tsx - основная форма - src/components/fulfillment-supplies/fulfillment-supplies-layout.tsx - обновлена навигация - Добавлены недостающие поля quantity и ordered в интерфейсы продуктов - Исправлены импорты и зависимости Результат: форма полностью интегрирована с v2 системой поставок, которая использует отдельные таблицы для каждого типа поставок согласно новой архитектуре. 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
348 lines
14 KiB
Markdown
348 lines
14 KiB
Markdown
# 🚚 WORKFLOW ЦЕПОЧКИ ПОСТАВОК SFERA v2.0
|
||
|
||
> **⚠️ ВАЖНО:** Этот документ описывает НОВУЮ архитектуру системы поставок с разделением на отдельные типы. Для старой системы см. SUPPLY_CHAIN_WORKFLOW.md
|
||
|
||
## 🎯 ОБЗОР НОВОЙ СИСТЕМЫ
|
||
|
||
Система поставок SFERA v2.0 включает **5 типов поставок**, разделенных на две категории:
|
||
|
||
### 📦 **ПОСТАВКИ НА ФУЛФИЛМЕНТ**
|
||
- `GoodsSupplyOrder` - товары селлера → склад ФФ
|
||
- `FulfillmentConsumableSupplyOrder` - расходники ФФ → склад ФФ
|
||
- `SellerConsumableSupplyOrder` - расходники селлера → склад ФФ
|
||
|
||
### 🛒 **ПОСТАВКИ НА МАРКЕТПЛЕЙСЫ**
|
||
- `OzonSupplyOrder` - готовые продукты → Ozon
|
||
- `WildberriesSupplyOrder` - готовые продукты → Wildberries
|
||
|
||
---
|
||
|
||
## 🔄 WORKFLOW ПО ТИПАМ ПОСТАВОК
|
||
|
||
### 1️⃣ **WORKFLOW: Поставки расходников ФФ**
|
||
|
||
```mermaid
|
||
graph TD
|
||
A[ФФ создает заказ расходников] --> B[PENDING]
|
||
B --> C{Поставщик одобряет?}
|
||
C -->|Да| D[SUPPLIER_APPROVED]
|
||
C -->|Нет| X[CANCELLED]
|
||
D --> E{Логистика назначена?}
|
||
E -->|Да| F[LOGISTICS_CONFIRMED]
|
||
E -->|Нет| D
|
||
F --> G[Поставщик отгружает]
|
||
G --> H[SHIPPED]
|
||
H --> I[IN_TRANSIT]
|
||
I --> J[ФФ принимает на склад]
|
||
J --> K[DELIVERED]
|
||
|
||
style A fill:#e1f5fe
|
||
style K fill:#c8e6c9
|
||
style X fill:#ffcdd2
|
||
```
|
||
|
||
**Участники:**
|
||
- 🏭 **Фулфилмент** - создатель, получатель
|
||
- 🏪 **Поставщик (WHOLESALE)** - одобрение, отгрузка
|
||
- 🚛 **Логистика (LOGIST)** - доставка
|
||
|
||
**Особенности:**
|
||
- ✅ ФФ видит все детали + устанавливает цены продажи селлерам
|
||
- ✅ Поставщик видит товары/количества, НЕ видит цены продажи ФФ
|
||
- ✅ Показывается сразу после создания
|
||
|
||
### 2️⃣ **WORKFLOW: Поставки товаров селлера**
|
||
|
||
```mermaid
|
||
graph TD
|
||
A[Селлер создает заказ товаров] --> B[PENDING]
|
||
B --> C{Поставщик одобряет?}
|
||
C -->|Да| D[SUPPLIER_APPROVED]
|
||
C -->|Нет| X[CANCELLED]
|
||
D --> E{Логистика назначена?}
|
||
E -->|Да| F[LOGISTICS_CONFIRMED]
|
||
E -->|Нет| D
|
||
F --> G[Поставщик отгружает]
|
||
G --> H[SHIPPED]
|
||
H --> I[IN_TRANSIT]
|
||
I --> J[ФФ принимает + обрабатывает]
|
||
J --> K[DELIVERED]
|
||
|
||
style A fill:#fff3e0
|
||
style K fill:#c8e6c9
|
||
style X fill:#ffcdd2
|
||
```
|
||
|
||
**Участники:**
|
||
- 🛒 **Селлер** - создатель, владелец товара
|
||
- 🏪 **Поставщик (WHOLESALE)** - поставка
|
||
- 🚛 **Логистика (LOGIST)** - доставка
|
||
- 🏭 **Фулфилмент** - получатель, обработка
|
||
|
||
**Особенности:**
|
||
- ✅ Селлер видит свои товары + рецептуры + закупочные цены
|
||
- ✅ ФФ видит товары + рецептуры + услуги, НЕ видит закупочные цены селлера
|
||
- ✅ Поставщик видит товары + количества, НЕ видит рецептуры
|
||
- ✅ Расходники селлера идут **в состав продукта**, не отслеживаются отдельно
|
||
|
||
### 3️⃣ **WORKFLOW: Поставки расходников селлера**
|
||
|
||
```mermaid
|
||
graph TD
|
||
A[Селлер заказывает свои расходники] --> B[PENDING]
|
||
B --> C{Поставщик одобряет?}
|
||
C -->|Да| D[SUPPLIER_APPROVED]
|
||
C -->|Нет| X[CANCELLED]
|
||
D --> E{Логистика назначена?}
|
||
E -->|Да| F[LOGISTICS_CONFIRMED]
|
||
E -->|Нет| D
|
||
F --> G[Поставщик отгружает]
|
||
G --> H[SHIPPED]
|
||
H --> I[IN_TRANSIT]
|
||
I --> J[ФФ принимает НА ХРАНЕНИЕ]
|
||
J --> K[DELIVERED]
|
||
|
||
style A fill:#f3e5f5
|
||
style K fill:#c8e6c9
|
||
style X fill:#ffcdd2
|
||
```
|
||
|
||
**Участники:**
|
||
- 🛒 **Селлер** - создатель, владелец расходников
|
||
- 🏪 **Поставщик (WHOLESALE)** - поставка
|
||
- 🚛 **Логистика (LOGIST)** - доставка
|
||
- 🏭 **Фулфилмент** - хранитель (НЕ владелец)
|
||
|
||
**Особенности:**
|
||
- ✅ Селлер видит свои расходники + закупочные цены
|
||
- ✅ ФФ видит факт хранения + количества, НЕ видит закупочные цены селлера
|
||
- ✅ Срок хранения + права доступа настраиваются
|
||
- ✅ Используются селлером в рецептурах своих товаров
|
||
|
||
---
|
||
|
||
## 📊 СТАТУСЫ И ПЕРЕХОДЫ
|
||
|
||
### **SupplyOrderStatus (поставки НА фулфилмент)**
|
||
|
||
| Статус | Описание | Ответственный | Действия |
|
||
|--------|----------|---------------|----------|
|
||
| `PENDING` | Ожидает одобрения поставщика | Поставщик | Одобрить/Отклонить |
|
||
| `SUPPLIER_APPROVED` | Одобрено поставщиком | Логистика | Назначить маршрут |
|
||
| `LOGISTICS_CONFIRMED` | Логистика подтверждена | Поставщик | Отгрузить товар |
|
||
| `SHIPPED` | Отгружено | Система | Автоматический переход |
|
||
| `IN_TRANSIT` | В пути | Логистика | Отслеживание доставки |
|
||
| `DELIVERED` | Доставлено | ФФ | Принять на склад |
|
||
| `CANCELLED` | Отменено | Любой участник | Указать причину |
|
||
|
||
### **MarketplaceSupplyStatus (поставки НА маркетплейсы)**
|
||
|
||
| Статус | Описание | Ответственный | Действия |
|
||
|--------|----------|---------------|----------|
|
||
| `PLANNED` | Запланирована | ФФ | Подготовить товары |
|
||
| `PREPARED` | Подготовлена | ФФ | Отгрузить |
|
||
| `SHIPPED_TO_MARKETPLACE` | Отгружена | Маркетплейс | Принять товар |
|
||
| `ACCEPTED_BY_MARKETPLACE` | Принята | Система | Обновить остатки |
|
||
| `CANCELLED` | Отменена | ФФ/Маркетплейс | Указать причину |
|
||
|
||
---
|
||
|
||
## 🎭 РОЛИ И ПРАВА ДОСТУПА
|
||
|
||
### 🏭 **ФУЛФИЛМЕНТ**
|
||
|
||
**Может создавать:**
|
||
- ✅ Поставки расходников ФФ
|
||
- ✅ Поставки на маркетплейсы
|
||
|
||
**Может видеть:**
|
||
- ✅ Свои поставки расходников: все детали + цены продажи
|
||
- ✅ Товарные поставки селлеров: товары + рецептуры, НЕ закупочные цены
|
||
- ✅ Расходники селлеров на хранении: количества, НЕ закупочные цены
|
||
|
||
### 🛒 **СЕЛЛЕР**
|
||
|
||
**Может создавать:**
|
||
- ✅ Товарные поставки
|
||
- ✅ Поставки расходников селлера
|
||
|
||
**Может видеть:**
|
||
- ✅ Свои товарные поставки: все детали + рецептуры + закупочные цены
|
||
- ✅ Свои расходники: все детали + закупочные цены
|
||
- ❌ Чужие поставки
|
||
- ❌ Поставки расходников ФФ
|
||
|
||
### 🏪 **ПОСТАВЩИК (WHOLESALE)**
|
||
|
||
**Может видеть:**
|
||
- ✅ Заказы к себе: товары + количества
|
||
- ❌ Рецептуры товаров
|
||
- ❌ Цены продажи ФФ селлерам
|
||
- ❌ Услуги ФФ
|
||
|
||
### 🚛 **ЛОГИСТИКА (LOGIST)**
|
||
|
||
**Может видеть:**
|
||
- ✅ Маршруты + объемы + вес
|
||
- ❌ Коммерческие данные (цены, услуги)
|
||
- ❌ Рецептуры товаров
|
||
|
||
---
|
||
|
||
## 🌐 ИНТЕРФЕЙСЫ СИСТЕМЫ
|
||
|
||
### 📦 **Кабинет фулфилмента**
|
||
|
||
**URL:** `/fulfillment-supplies/`
|
||
|
||
**Вкладки:**
|
||
- `ff-consumables` - поставки расходников ФФ (создание + просмотр)
|
||
- `seller-consumables` - расходники селлеров на хранении
|
||
- `goods?status=new` - новые товарные поставки
|
||
- `goods?status=receiving` - товары в приемке
|
||
- `goods?status=accepted` - принятые товары
|
||
|
||
### 🛒 **Кабинет селлера**
|
||
|
||
**URL:** `/seller-supplies/`
|
||
|
||
**Вкладки:**
|
||
- `my-goods` - мои товарные поставки
|
||
- `my-consumables` - мои расходники
|
||
- `create-goods` - создать поставку товаров
|
||
- `create-consumables` - заказать расходники
|
||
|
||
### 🛍️ **Кабинет маркетплейсов**
|
||
|
||
**URL:** `/marketplace-supplies/`
|
||
|
||
**Вкладки:**
|
||
- `ozon` - поставки на Ozon
|
||
- `wildberries` - поставки на Wildberries
|
||
- `create-ozon` - создать поставку на Ozon
|
||
- `create-wildberries` - создать поставку на WB
|
||
|
||
---
|
||
|
||
## ⚡ ОСОБЕННОСТИ РЕАЛИЗАЦИИ
|
||
|
||
### 🔄 **Дополнение данных по этапам**
|
||
|
||
Каждая поставка - это **одна запись**, которая дополняется участниками:
|
||
|
||
```typescript
|
||
// Создание (селлер/ФФ)
|
||
supply = {
|
||
id: "...",
|
||
status: "PENDING",
|
||
sellerId: "...", // кто создал
|
||
requestedDate: "...", // когда нужно
|
||
items: [...] // что заказано
|
||
}
|
||
|
||
// Одобрение (поставщик)
|
||
supply = {
|
||
...supply,
|
||
status: "SUPPLIER_APPROVED",
|
||
supplierId: "...", // кто одобрил
|
||
approvedAt: "...", // когда одобрил
|
||
packagesCount: 5, // уточненные параметры
|
||
estimatedVolume: 2.5
|
||
}
|
||
|
||
// Назначение логистики (ФФ)
|
||
supply = {
|
||
...supply,
|
||
status: "LOGISTICS_CONFIRMED",
|
||
logisticsPartnerId: "...", // кто повезет
|
||
routeId: "...", // маршрут
|
||
logisticsCost: 1500 // стоимость
|
||
}
|
||
```
|
||
|
||
### 🔐 **Фильтрация по безопасности**
|
||
|
||
Каждый resolver применяет фильтрацию по роли:
|
||
|
||
```typescript
|
||
// Пример: поставки расходников ФФ
|
||
const supplies = await prisma.fulfillmentConsumableSupplyOrder.findMany({
|
||
where: {
|
||
// Только свои поставки для ФФ
|
||
fulfillmentCenterId: user.organizationId
|
||
}
|
||
})
|
||
|
||
// Фильтрация полей по роли
|
||
return supplies.map(supply =>
|
||
SupplyDataFilter.filterByRole(supply, user.organizationType)
|
||
)
|
||
```
|
||
|
||
### 📈 **Масштабируемость**
|
||
|
||
Новые типы поставок добавляются независимо:
|
||
|
||
```typescript
|
||
// Будущее: Поставки на Яндекс.Маркет
|
||
interface YandexMarketSupplyOrder {
|
||
// специфичные поля для Яндекс.Маркета
|
||
}
|
||
|
||
// Отдельные операции
|
||
createYandexMarketSupply()
|
||
myYandexMarketSupplies()
|
||
```
|
||
|
||
---
|
||
|
||
## ✅ ПРЕИМУЩЕСТВА НОВОЙ АРХИТЕКТУРЫ
|
||
|
||
### 🎯 **Четкое разделение ответственности**
|
||
- Каждый тип поставки имеет свою логику
|
||
- Независимая разработка и тестирование
|
||
- Простота добавления новых типов
|
||
|
||
### 🔒 **Надежная безопасность**
|
||
- Раздельные правила доступа для каждого типа
|
||
- Невозможно случайно показать чужие данные
|
||
- Гранулярные права по ролям
|
||
|
||
### 📈 **Масштабируемость**
|
||
- Легко добавлять новые маркетплейсы
|
||
- Независимые схемы для разных процессов
|
||
- Оптимизация каждого типа отдельно
|
||
|
||
### 🛡️ **Безопасная миграция**
|
||
- Поэтапное внедрение без остановки системы
|
||
- Система откатов на каждом этапе
|
||
- Сохранение работоспособности старой системы
|
||
|
||
---
|
||
|
||
## 🚀 ПЛАН ВНЕДРЕНИЯ
|
||
|
||
### **Phase 1:** FulfillmentConsumableSupplyOrder ⏳
|
||
- Новая модель данных
|
||
- GraphQL операции
|
||
- Интерфейс создания и просмотра
|
||
- Тестирование
|
||
|
||
### **Phase 2:** SellerConsumableSupplyOrder
|
||
- Аналогично Phase 1
|
||
- Интеграция с системой хранения
|
||
|
||
### **Phase 3:** GoodsSupplyOrder
|
||
- Самый сложный тип с рецептурами
|
||
- Миграция существующих товарных поставок
|
||
|
||
### **Phase 4:** Поставки на маркетплейсы
|
||
- Отдельная система для Ozon/WB
|
||
- API интеграции с маркетплейсами
|
||
|
||
### **Phase 5:** Очистка и оптимизация
|
||
- Миграция старых данных
|
||
- Удаление устаревшего кода (с одобрения)
|
||
- Финальная оптимизация
|
||
|
||
**Следующий шаг:** Начало реализации Phase 1 - FulfillmentConsumableSupplyOrder |