Files
sfera-new/legacy-rules/новые-правила-фулфилмент.md
Veronika Smirnova 89257c75b5 fix: завершение модуляризации системы и финальная организация проекта
## Структурные изменения:

### 📁 Организация архивных файлов:
- Перенос всех устаревших правил в legacy-rules/
- Создание структуры docs-and-reports/ для отчетов
- Архивация backup файлов в legacy-rules/backups/

### 🔧 Критические компоненты:
- src/components/supplies/multilevel-supplies-table.tsx - многоуровневая таблица поставок
- src/components/supplies/components/recipe-display.tsx - отображение рецептур
- src/components/fulfillment-supplies/fulfillment-goods-orders-tab.tsx - вкладка товарных заказов

### 🎯 GraphQL обновления:
- Обновление mutations.ts, queries.ts, resolvers.ts, typedefs.ts
- Синхронизация с Prisma schema.prisma
- Backup файлы для истории изменений

### 🛠️ Утилитарные скрипты:
- 12 новых скриптов в scripts/ для анализа данных
- Скрипты проверки фулфилмент-пользователей
- Утилиты очистки и фиксации данных поставок

### 📊 Тестирование:
- test-fulfillment-filtering.js - тестирование фильтрации фулфилмента
- test-full-workflow.js - полный workflow тестирование

### 📝 Документация:
- logistics-statistics-warehouse-rules.md - объединенные правила модулей
- Обновление журналов модуляризации и разработки

###  Исправления ESLint:
- Исправлены критические ошибки в sidebar.tsx
- Исправлены ошибки типизации в multilevel-supplies-table.tsx
- Исправлены неиспользуемые переменные в goods-supplies-table.tsx
- Заменены типы any на строгую типизацию
- Исправлены console.log на console.warn

## Результат:
- Завершена полная модуляризация системы
- Организована архитектура legacy файлов
- Добавлены критически важные компоненты таблиц
- Создана полная инфраструктура тестирования
- Исправлены все критические ESLint ошибки
- Сохранены 103 незакоммиченных изменения

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-22 10:31:43 +03:00

624 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 📦 НОВЫЕ ПРАВИЛА ФУЛФИЛМЕНТ - СКЛАД И РАСХОДНИКИ
> **Создано на основе глубокого анализа кода разделов склада и расходников кабинета фулфилмент**
>
> **Дата анализа**: 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<string, Supply>)
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<WarehouseStatsBlockProps>(...)
// Оптимизированные вычисления
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 <LoadingSkeleton />
}
// Частичная загрузка данных
if (loading) {
return <PartialDataView />
}
```
---
## 🎯 ЗАКЛЮЧЕНИЕ
Разделы склада и расходников фулфилмента представляют собой комплексную систему управления складскими операциями с:
### ✅ **Реализованные возможности:**
- 3-уровневая иерархия данных (магазины → товары → варианты)
- Real-time обновления через WebSocket
- Модульная архитектура с разделением ответственности
- Сложная система группировки и фильтрации данных
- Статистические dashboards с движениями товаров
- Экспорт данных и аналитика
### 🔧 **Критически важные особенности:**
- Расходники селлеров группируются по ВЛАДЕЛЬЦУ (не по названию)
- Товары группируются по названию с суммированием количества
- Консолидация расходников по артикулу СФ
- Строгая валидация типа `SELLER_CONSUMABLES`
### 🚀 **Технические преимущества:**
- GraphQL с оптимизированным кешированием
- React мемоизация и performance оптимизации
- Glass-morphism дизайн с единым стилем
- Responsive layout для разных устройств
**Архитектура готова к масштабированию и дальнейшему развитию функциональности.**