docs: обновить FULFILLMENT_DOMAIN.md с правилами V2 системы синхронизации
- Добавить архитектуру синхронизации компонентов V2 - Документировать единый источник данных fulfillmentConsumableInventory - Описать ключевые поля для связи данных (productId) - Добавить правила группировки и фильтрации - Документировать компоненты статистики Master-Detail 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -44,9 +44,14 @@ graph TD
|
|||||||
D --> H[Доставляют товары к ФФ]
|
D --> H[Доставляют товары к ФФ]
|
||||||
```
|
```
|
||||||
|
|
||||||
## 📦 УПРАВЛЕНИЕ РАСХОДНИКАМИ (ДВОЙНАЯ СИСТЕМА)
|
## 📦 УПРАВЛЕНИЕ РАСХОДНИКАМИ (ДВОЙНАЯ СИСТЕМА V2)
|
||||||
|
|
||||||
### FULFILLMENT_CONSUMABLES (Собственные расходники)
|
> **ВАЖНО:** Система полностью переведена на V2 архитектуру с улучшенной синхронизацией данных
|
||||||
|
|
||||||
|
### FULFILLMENT_CONSUMABLES (Собственные расходники) - V2 СИСТЕМА
|
||||||
|
|
||||||
|
**Таблица БД:** `fulfillmentConsumableInventory`
|
||||||
|
**GraphQL Query:** `GET_MY_FULFILLMENT_SUPPLIES`
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
interface FulfillmentConsumables {
|
interface FulfillmentConsumables {
|
||||||
@ -111,6 +116,114 @@ query GetSellerSuppliesOnWarehouse {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🚀 **V2 СИСТЕМА УПРАВЛЕНИЯ ДАННЫМИ**
|
||||||
|
|
||||||
|
### **АРХИТЕКТУРА СИНХРОНИЗАЦИИ КОМПОНЕНТОВ**
|
||||||
|
|
||||||
|
#### **1. ЕДИНЫЙ ИСТОЧНИК ДАННЫХ**
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Все компоненты фулфилмента используют одну таблицу БД
|
||||||
|
const dataSource = 'fulfillmentConsumableInventory'
|
||||||
|
|
||||||
|
// Связанные компоненты:
|
||||||
|
const components = [
|
||||||
|
'/fulfillment-warehouse', // Главный dashboard (карточка "РАСХОДНИКИ ФУЛФИЛМЕНТА")
|
||||||
|
'/fulfillment-warehouse/supplies', // Подраздел (карточка "ОСТАТОК" + таблица)
|
||||||
|
'/services', // Раздел услуг (вкладка "Расходники")
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **2. ОБЯЗАТЕЛЬНЫЕ ПРАВИЛА СИНХРОНИЗАЦИИ**
|
||||||
|
|
||||||
|
**GraphQL Queries - одинаковые настройки:**
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// ✅ ПРАВИЛЬНО - для всех связанных компонентов
|
||||||
|
useQuery(FULFILLMENT_SUPPLIES_QUERY, {
|
||||||
|
fetchPolicy: 'cache-and-network', // Всегда актуальные данные
|
||||||
|
pollInterval: 30000, // Обновление каждые 30 сек
|
||||||
|
errorPolicy: 'all', // Показывать частичные данные при ошибках
|
||||||
|
})
|
||||||
|
|
||||||
|
// ❌ НЕПРАВИЛЬНО - разные настройки создают рассинхронизацию
|
||||||
|
useQuery(QUERY_A, { fetchPolicy: 'cache-and-network' }) // компонент A
|
||||||
|
useQuery(QUERY_B, {}) // компонент B (default cache-first)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **3. КЛЮЧЕВЫЕ ПОЛЯ ДЛЯ СВЯЗИ ДАННЫХ**
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
interface FulfillmentConsumableV2 {
|
||||||
|
id: string // Уникальный ID записи инвентаря
|
||||||
|
productId: string // ← ОБЯЗАТЕЛЬНО! Для фильтрации истории поставок
|
||||||
|
fulfillmentCenterId: string // Привязка к конкретному ФФ
|
||||||
|
currentStock: number // Текущий остаток (основа для всех расчётов)
|
||||||
|
totalReceived: number // Общее количество поступлений
|
||||||
|
averageCost: Decimal // Средняя стоимость для расчёта общей стоимости
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **4. ПРАВИЛА ГРУППИРОВКИ И ФИЛЬТРАЦИИ**
|
||||||
|
|
||||||
|
**✅ ПРАВИЛЬНАЯ фильтрация истории поставок:**
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
const getSupplyHistory = (supply: Supply): Supply[] => {
|
||||||
|
// Фильтруем по стабильному productId
|
||||||
|
return allDeliveries.filter((delivery) => delivery.items?.some((item) => item.productId === supply.productId))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**❌ НЕПРАВИЛЬНАЯ фильтрация:**
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Никогда не используйте нестабильные поля для фильтрации
|
||||||
|
return supplies.filter(
|
||||||
|
(s) => s.name === supply.name && s.category === supply.category, // ← Может дать дубли!
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **5. АГРЕГАЦИЯ СТАТИСТИКИ**
|
||||||
|
|
||||||
|
**Master-Detail консистентность:**
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Главный dashboard - карточка "РАСХОДНИКИ ФУЛФИЛМЕНТА"
|
||||||
|
const masterValue = warehouseStats.fulfillmentSupplies.current
|
||||||
|
|
||||||
|
// Подраздел - карточка "ОСТАТОК"
|
||||||
|
const detailValue = supplies.reduce((sum, s) => sum + s.currentStock, 0)
|
||||||
|
|
||||||
|
// ОБЯЗАТЕЛЬНО: masterValue === detailValue
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **6. КОМПОНЕНТЫ СТАТИСТИКИ**
|
||||||
|
|
||||||
|
**Структура карточек статистики:**
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Главный раздел (/fulfillment-warehouse)
|
||||||
|
interface WarehouseStatsCards {
|
||||||
|
'РАСХОДНИКИ ФУЛФИЛМЕНТА': number // Общий остаток всех расходников ФФ
|
||||||
|
// ... другие карточки
|
||||||
|
}
|
||||||
|
|
||||||
|
// Подраздел (/fulfillment-warehouse/supplies)
|
||||||
|
interface SuppliesStatsCards {
|
||||||
|
'ВСЕГО ПОЗИЦИЙ': number // Количество уникальных товаров
|
||||||
|
ДОСТУПНО: number // Товары в наличии (currentStock > 0)
|
||||||
|
ОСТАТОК: number // ← Сумма всех currentStock (= карточке выше)
|
||||||
|
'НЕТ В НАЛИЧИИ': number // Товары с нулевыми остатками
|
||||||
|
'ОБЩАЯ СТОИМОСТЬ': string // Стоимость всех товаров на складе
|
||||||
|
'В ПУТИ': number // Товары со статусом в транспортировке
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 🔄 WORKFLOW ПОСТАВОК ДЛЯ ФУЛФИЛМЕНТА
|
## 🔄 WORKFLOW ПОСТАВОК ДЛЯ ФУЛФИЛМЕНТА
|
||||||
|
|
||||||
### РОЛЬ В 8-СТАТУСНОЙ СИСТЕМЕ:
|
### РОЛЬ В 8-СТАТУСНОЙ СИСТЕМЕ:
|
||||||
|
Reference in New Issue
Block a user