# 📦 НОВЫЕ ПРАВИЛА ФУЛФИЛМЕНТ - СКЛАД И РАСХОДНИКИ > **Создано на основе глубокого анализа кода разделов склада и расходников кабинета фулфилмент** > > **Дата анализа**: 19.08.2025 > **Статус**: ✅ Актуально для текущей версии системы --- ## 📋 СОДЕРЖАНИЕ 1. [🏗️ Архитектурные основы](#1-🏗️-архитектурные-основы) 2. [📊 Раздел "Склад" - детальный план](#2-📊-раздел-склад---детальный-план) 3. [🔧 Подраздел "Расходники фулфилмента" - детальный план](#3-🔧-подраздел-расходники-фулфилмента---детальный-план) 4. [🔄 Интеграция между разделами](#4-🔄-интеграция-между-разделами) 5. [📈 GraphQL API структура](#5-📈-graphql-api-структура) 6. [⚡ Real-time обновления](#6-⚡-real-time-обновления) 7. [🎨 UI/UX компоненты](#7-🎨-uiux-компоненты) 8. [🚀 Оптимизация производительности](#8-🚀-оптимизация-производительности) --- ## 1. 🏗️ АРХИТЕКТУРНЫЕ ОСНОВЫ ### 1.1 Маршруты и страницы ```typescript // Основные маршруты фулфилмент склада /fulfillment-warehouse/ → Главный дашборд склада /fulfillment-warehouse/supplies → Расходники фулфилмента ``` ### 1.2 Модульная архитектура dashboard склада Компонент `FulfillmentWarehouseDashboard` реализован по **MODULAR_ARCHITECTURE_PATTERN**: ``` src/components/fulfillment-warehouse/fulfillment-warehouse-dashboard/ ├── index.tsx # Главный оркестратор (1,322 строки) ├── types/index.ts # TypeScript интерфейсы (223 строки) ├── hooks/ # Бизнес-логика (4 хука) │ ├── useWarehouseData.ts # GraphQL запросы и real-time │ ├── useStoreData.ts # Критическая логика группировки данных │ ├── useTableState.ts # Управление состоянием таблиц │ └── useWarehouseStats.ts # Статистика и расчеты ├── blocks/ # UI компоненты-блоки │ ├── WarehouseStatsBlock.tsx # Статистические карты │ ├── StoreDataTableBlock.tsx # Таблица данных магазинов │ ├── SummaryRowBlock.tsx # Строка итогов │ └── TableHeadersBlock.tsx # Заголовки с сортировкой └── components/ # Переиспользуемые компоненты └── StatCard.tsx # Универсальная статистическая карта ``` ### 1.3 Основные типы данных #### 3-уровневая иерархия складских данных: ```typescript // 🔵 УРОВЕНЬ 1: Магазины (StoreData) interface StoreData { id: string name: string logo?: string avatar?: string products: number // Готовые продукты goods: number // Товары в обработке defects: number // Брак sellerSupplies: number // Расходники селлеров pvzReturns: number // Возвраты с ПВЗ items: ProductItem[] // Детализация по товарам } // 🟢 УРОВЕНЬ 2: Товары (ProductItem) interface ProductItem { id: string name: string article: string productQuantity: number productPlace?: string // ... места и количества для каждого типа variants?: ProductVariant[] // Варианты товара } // 🟠 УРОВЕНЬ 3: Варианты товаров (ProductVariant) interface ProductVariant { id: string name: string // Размер, характеристика, вариант упаковки productQuantity: number productPlace?: string // ... аналогично ProductItem } ``` --- ## 2. 📊 РАЗДЕЛ "СКЛАД" - ДЕТАЛЬНЫЙ ПЛАН ### 2.1 Главный дашборд (`/fulfillment-warehouse`) #### 2.1.1 📈 Статистические карты (WarehouseStatsBlock) **6 основных метрик склада:** 1. **🔵 Продукты** (`products`) - Готовые к отправке товары - Иконка: `Box` - Показывает: текущий остаток + изменения за сутки + прибыло/убыло 2. **📦 Товары** (`goods`) - На складе и в обработке - Иконка: `Package` - Группировка по магазинам селлеров 3. **⚠️ Брак** (`defects`) - Требует утилизации - Иконка: `AlertTriangle` - Цветовая индикация (красный) 4. **🔄 Возвраты с ПВЗ** (`pvzReturns`) - К обработке - Иконка: `RotateCcw` - Статус: требует сортировки 5. **👥 Расходники селлеров** (`sellerSupplies`) - Материалы клиентов - Иконка: `Users` - **КРИТИЧНО**: Группировка по ВЛАДЕЛЬЦУ, не по названию 6. **🔧 Расходники фулфилмента** (`fulfillmentSupplies`) - Операционные материалы - Иконка: `Wrench` - Кликабельно → переход на `/fulfillment-warehouse/supplies` #### 2.1.2 🗂️ Детализация по магазинам (3-уровневая таблица) **Ключевые особенности:** 1. **Поиск и фильтрация** - Поиск по названию магазина - Сортировка по всем столбцам - Показать/скрыть изменения за сутки 2. **Строка итогов** - Автоматический подсчет всех категорий - Движения товаров (прибыло/убыло) - Обновляется в real-time 3. **3-уровневая иерархия** ``` 🔵 Магазин ├─ 🟢 Товар 1 │ ├─ 🟠 Размер S │ ├─ 🟠 Размер M │ └─ 🟠 Размер L └─ 🟢 Товар 2 └─ 🟠 Единственный размер ``` 4. **Критическая группировка данных** ```typescript // ⚠️ ВАЖНО: Товары группируются по НАЗВАНИЮ с суммированием // ⚠️ ВАЖНО: Расходники группируются по СЕЛЛЕРУ-ВЛАДЕЛЬЦУ! // Группировка товаров по названию const productGroups = sellerProducts.reduce((acc, product) => { const key = product.name || 'Без названия' // Суммируем количества acc[key].productQuantity += product.productQuantity || 0 }, {}) // Группировка расходников по владельцу const sellerSuppliesForThisSeller = sellerSupplies.filter(supply => supply.type === 'SELLER_CONSUMABLES' && supply.sellerId === sellerId ) ``` ### 2.2 GraphQL интеграция #### 2.2.1 Используемые запросы 1. `GET_MY_COUNTERPARTIES` - партнеры (селлеры) 2. `GET_SUPPLY_ORDERS` - заказы поставок 3. `GET_WAREHOUSE_PRODUCTS` - товары на складе 4. `GET_SELLER_SUPPLIES_ON_WAREHOUSE` - расходники селлеров 5. `GET_MY_FULFILLMENT_SUPPLIES` - расходники фулфилмента 6. `GET_FULFILLMENT_WAREHOUSE_STATS` - статистика с изменениями 7. `GET_SUPPLY_MOVEMENTS` - движения товаров (прибыло/убыло) #### 2.2.2 Стратегия кеширования ```typescript // Разные стратегии для разных типов данных fetchPolicy: 'cache-and-network' // Контрагенты, товары, расходники fetchPolicy: 'no-cache' // Статистика (всегда актуальная) pollInterval: 30000 // Обновление каждые 30 сек pollInterval: 60000 // Данные партнеров реже ``` --- ## 3. 🔧 ПОДРАЗДЕЛ "РАСХОДНИКИ ФУЛФИЛМЕНТА" - ДЕТАЛЬНЫЙ ПЛАН ### 3.1 Страница расходников (`/fulfillment-warehouse/supplies`) #### 3.1.1 📊 Статистика расходников (SuppliesStats) **6 основных показателей:** 1. **📦 Всего позиций** - общее количество видов расходников 2. **✅ Доступно** - расходники в наличии (currentStock > 0) 3. **⚠️ Мало на складе** - требует пополнения (currentStock ≤ minStock) 4. **❌ Нет в наличии** - необходим срочный заказ 5. **💰 Общая стоимость** - суммарная стоимость всех расходников 6. **🚚 В пути** - расходники в доставке + количество категорий #### 3.1.2 🎛️ Система фильтрации и поиска ```typescript interface FilterState { search: string // Поиск по названию и описанию category: string // Фильтр по категории status: string // Статус: available/unavailable supplier: string // Поставщик lowStock: boolean // Показать только заканчивающиеся } interface SortState { field: 'name' | 'category' | 'status' | 'currentStock' | 'price' | 'supplier' direction: 'asc' | 'desc' } ``` #### 3.1.3 📋 Режимы отображения 1. **Grid View** (сетка карточек) - Визуальные карточки с прогресс-барами - Индикаторы состояния остатков - Статусные бейджи 2. **List View** (табличный вид) - Компактное представление - Сортировка по столбцам - Массовые операции 3. **Analytics View** (аналитический режим) - **Статус**: Планируется к реализации - Графики потребления - Прогнозирование остатков #### 3.1.4 📊 Группировка данных ```typescript type GroupBy = 'none' | 'category' | 'status' | 'supplier' // Группировка по категориям, статусу или поставщику const groupedSupplies = useMemo(() => { if (groupBy === 'none') return { 'Все расходники': filteredSupplies } return filteredSupplies.reduce((acc, supply) => { let key: string if (groupBy === 'status') { key = supply.currentStock > 0 ? 'Доступен' : 'Недоступен' } else { key = supply[groupBy] || 'Без категории' } if (!acc[key]) acc[key] = [] acc[key].push(supply) return acc }, {}) }, [filteredSupplies, groupBy]) ``` ### 3.2 ⚡ Критическая логика консолидации #### 3.2.1 Объединение одинаковых расходников ```typescript // НОВОЕ: Группировка по артикулу СФ (более точно) const consolidatedSupplies = useMemo(() => { const grouped = supplies.reduce((acc, supply) => { const key = supply.article // Группировка по артикулу if (!acc[key]) { acc[key] = { ...supply, currentStock: 0, quantity: 0, shippedQuantity: 0, } } // Учитываем принятые поставки (все варианты статусов) if (supply.status === 'доставлено' || supply.status === 'На складе' || supply.status === 'in-stock') { const actualQuantity = supply.actualQuantity ?? supply.quantity acc[key].quantity += actualQuantity acc[key].shippedQuantity += supply.shippedQuantity || 0 acc[key].currentStock += actualQuantity - (supply.shippedQuantity || 0) } return acc }, {} as Record) return Object.values(grouped) }, [supplies]) ``` #### 3.2.2 Статусы расходников ```typescript const STATUS_CONFIG = { available: { label: 'Доступен', color: 'bg-green-500/20 text-green-300', icon: CheckCircle, }, unavailable: { label: 'Недоступен', color: 'bg-red-500/20 text-red-300', icon: AlertTriangle, }, } as const const getStatusConfig = (supply: Supply): StatusConfig => { return supply.currentStock > 0 ? STATUS_CONFIG.available : STATUS_CONFIG.unavailable } ``` ### 3.3 🎨 UI компоненты расходников #### 3.3.1 SupplyCard - карточка расходника **Основные элементы:** - Заголовок с названием и статусным бейджем - Прогресс-бар остатков с цветовой индикацией - Метрики: цена, общая стоимость - Категория и количество поставок - Информация о поставщике и дате создания ```typescript // Цветовая индикация прогресс-бара остатков const stockPercentage = supply.minStock > 0 ? (supply.currentStock / supply.minStock) * 100 : 100 // Цвета: зеленый (>50%), желтый (20-50%), красный (<20%) const color = stockPercentage > 50 ? '#10b981' : stockPercentage > 20 ? '#f59e0b' : '#ef4444' ``` #### 3.3.2 SuppliesHeader - заголовок с управлением **Функциональность:** - Переключение режимов отображения (grid/list/analytics) - Управление группировкой данных - Панель фильтров (сворачиваемая) - Экспорт данных в CSV - Обновление данных #### 3.3.3 SuppliesList - табличное представление **Возможности:** - Сортировка по всем столбцам - Развертывание деталей поставок - Информация о владельцах расходников - Компактное отображение больших объемов данных --- ## 4. 🔄 ИНТЕГРАЦИЯ МЕЖДУ РАЗДЕЛАМИ ### 4.1 Связи данных ```mermaid graph LR A[Главный склад] --> B[Статистика фулфилмента] B --> C[Страница расходников] C --> D[Детали поставок] A --> E[Расходники селлеров] E --> F[Группировка по владельцу] ``` ### 4.2 Переходы между разделами 1. **Со склада на расходники**: Клик по карте "Расходники фулфилмента" 2. **Навигация через сайдбар**: Двухуровневое меню 3. **Real-time синхронизация**: Обновления отражаются во всех разделах ### 4.3 Общие компоненты - `Sidebar` - единая боковая навигация - `AuthGuard` - проверка доступа - `StatCard` - унифицированные статистические карты - Glass-morphism дизайн - единый стиль --- ## 5. 📈 GRAPHQL API СТРУКТУРА ### 5.1 Ключевые запросы #### GET_MY_FULFILLMENT_SUPPLIES ```graphql query GetMyFulfillmentSupplies { myFulfillmentSupplies { id name description article price quantity actualQuantity # Фактически поставленное shippedQuantity # Отправленное количество currentStock # = actualQuantity - shippedQuantity minStock unit category status # доставлено/На складе/in-stock supplier createdAt updatedAt } } ``` #### GET_FULFILLMENT_WAREHOUSE_STATS ```graphql query GetFulfillmentWarehouseStats { fulfillmentWarehouseStats { products { current: Int change: Int # Изменение за сутки percentChange: Float } goods { current change percentChange } defects { current change percentChange } pvzReturns { current change percentChange } fulfillmentSupplies { current change percentChange } sellerSupplies { current change percentChange } } } ``` #### GET_SELLER_SUPPLIES_ON_WAREHOUSE ```graphql query GetSellerSuppliesOnWarehouse { sellerSuppliesOnWarehouse { id name type # MUST be 'SELLER_CONSUMABLES' currentStock sellerOwner { # ⚠️ КРИТИЧНО для группировки id name fullName } } } ``` ### 5.2 Стратегии оптимизации 1. **Кеширование**: `cache-and-network` для стабильных данных 2. **Polling**: 30-60 секунд для разных типов данных 3. **No-cache**: Для критически важной статистики 4. **Batch запросы**: Группировка связанных запросов --- ## 6. ⚡ REAL-TIME ОБНОВЛЕНИЯ ### 6.1 WebSocket события ```typescript useRealtime({ onEvent: (evt) => { switch (evt.type) { case 'supply-order:new': case 'supply-order:updated': refetchOrders() refetchStats() refetchWarehouse() refetchSellerSupplies() refetchFulfillmentSupplies() break case 'warehouse:changed': refetchStats() refetchFulfillmentSupplies() break } } }) ``` ### 6.2 Частота обновлений - **Статистика**: Каждые 30 секунд + события - **Товары на складе**: 30 секунд - **Расходники**: 30 секунд + manual refresh - **Контрагенты**: 60 секунд (стабильные данные) --- ## 7. 🎨 UI/UX КОМПОНЕНТЫ ### 7.1 Дизайн-система **Glass-morphism стиль:** - `glass-card` - основной класс для карточек - Полупрозрачные фоны с размытием - Градиенты blue-to-purple - Белый текст с различной прозрачностью ### 7.2 Цветовая кодировка ```typescript // Статусы остатков const STOCK_COLORS = { high: '#10b981', // Зеленый (>50%) medium: '#f59e0b', // Желтый (20-50%) low: '#ef4444', // Красный (<20%) empty: '#6b7280', // Серый (0) } // Типы товаров const TYPE_COLORS = { products: 'blue', // Готовые продукты goods: 'green', // Товары в обработке defects: 'red', // Брак supplies: 'purple', // Расходники returns: 'orange', // Возвраты } ``` ### 7.3 Иконки и индикаторы - `Box` - готовые продукты - `Package` - товары в обработке - `AlertTriangle` - брак и предупреждения - `RotateCcw` - возвраты - `Users` - расходники селлеров - `Wrench` - расходники фулфилмента - `TrendingUp/Down` - изменения показателей --- ## 8. 🚀 ОПТИМИЗАЦИЯ ПРОИЗВОДИТЕЛЬНОСТИ ### 8.1 React оптимизации ```typescript // Мемоизация блоков export const WarehouseStatsBlock = React.memo(...) // Оптимизированные вычисления const storeData = useMemo(() => { // Сложная логика группировки выполняется только при изменении зависимостей }, [sellerPartners, allProducts, sellerSupplies]) // Callback оптимизации const handleSort = useCallback((field: StoreDataField) => { // Предотвращаем лишние рендеры }, []) ``` ### 8.2 Производительность запросов 1. **Селективное обновление**: Обновляем только измененные блоки 2. **Параллельные запросы**: Используем `Promise.all` для refetch 3. **Оптимистичные обновления**: UI реагирует до получения ответа 4. **Виртуализация**: Планируется для больших списков ### 8.3 Состояние загрузки ```typescript // Умная индикация загрузки const loading = counterpartiesLoading || ordersLoading || /* ... */ // Скелетоны для разных состояний if (loading && storeData.length === 0) { return } // Частичная загрузка данных if (loading) { return } ``` --- ## 🎯 ЗАКЛЮЧЕНИЕ Разделы склада и расходников фулфилмента представляют собой комплексную систему управления складскими операциями с: ### ✅ **Реализованные возможности:** - 3-уровневая иерархия данных (магазины → товары → варианты) - Real-time обновления через WebSocket - Модульная архитектура с разделением ответственности - Сложная система группировки и фильтрации данных - Статистические dashboards с движениями товаров - Экспорт данных и аналитика ### 🔧 **Критически важные особенности:** - Расходники селлеров группируются по ВЛАДЕЛЬЦУ (не по названию) - Товары группируются по названию с суммированием количества - Консолидация расходников по артикулу СФ - Строгая валидация типа `SELLER_CONSUMABLES` ### 🚀 **Технические преимущества:** - GraphQL с оптимизированным кешированием - React мемоизация и performance оптимизации - Glass-morphism дизайн с единым стилем - Responsive layout для разных устройств **Архитектура готова к масштабированию и дальнейшему развитию функциональности.**