
- Добавлены колонки Объём и Грузовые места между Цена товаров и Статус - Реализованы инпуты для ввода volume и packagesCount в статусе PENDING для роли WHOLESALE - Добавлена мутация UPDATE_SUPPLY_PARAMETERS с проверками безопасности - Скрыта строка Поставщик для роли WHOLESALE (поставщик знает свои данные) - Исправлено выравнивание таблицы при скрытии уровня поставщика - Реорганизованы документы: legacy-rules/, docs/, docs-and-reports/ ВНИМАНИЕ: Компонент multilevel-supplies-table.tsx (1697 строк) нарушает правило модульной архитектуры (>800 строк требует рефакторинга) 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
13 KiB
13 KiB
ПРАВИЛА ПАРАМЕТРОВ ПОСТАВКИ
📋 ОПРЕДЕЛЕНИЕ ПАРАМЕТРОВ ПОСТАВКИ
Параметры поставки - это все характеристики и данные, которые описывают конкретную поставку товаров в системе SFERA.
🎯 КЛАССИФИКАЦИЯ ПАРАМЕТРОВ ПОСТАВКИ
1. ОБЯЗАТЕЛЬНЫЕ ПАРАМЕТРЫ:
id
- Уникальный идентификатор поставкиdeliveryDate
- Дата поставки (когда товары должны быть доставлены)totalAmount
- Общая стоимость поставкиtotalItems
- Количество товаров в поставкеorganizationId
- Идентификатор заказчикаpartnerId
- Идентификатор поставщикаstatus
- Статус поставки (PENDING, APPROVED, SHIPPED и т.д.)
2. ЦЕНОВЫЕ ПАРАМЕТРЫ:
totalAmount
- Общая сумма поставкиgoodsPrice
- Стоимость товаров (расчетное поле)servicesPrice
- Стоимость услуг фулфилмента (расчетное поле)logisticsPrice
- Стоимость логистических услуг (расчетное поле)sellerConsumablesPrice
- Стоимость расходников селлера (расчетное поле)ffConsumablesPrice
- Стоимость расходников фулфилмента (расчетное поле)
3. ТОВАРНЫЕ ПАРАМЕТРЫ:
items[]
- Массив товаров с количествами и ценамиproductId
- ID товара в позицииquantity
- Количество каждого товараprice
- Цена за единицу товараtotalPrice
- Общая стоимость позицииservices[]
- Массив услуг для товараfulfillmentConsumables[]
- Расходники фулфилмента для товараsellerConsumables[]
- Расходники селлера для товараmarketplaceCardId
- ID карточки маркетплейса
4. ЛОГИСТИЧЕСКИЕ ПАРАМЕТРЫ:
packagesCount
- Количество грузовых местvolume
- Объём груза в м³routes[]
- Маршруты доставкиfromLocation
- Точка забора грузаtoLocation
- Точка доставкиfromAddress
- Полный адрес забораtoAddress
- Полный адрес доставкиdistance
- Расстояние маршрута в кмestimatedTime
- Время доставки в часахlogisticsPartnerId
- ID логистического партнера
5. УПРАВЛЕНЧЕСКИЕ ПАРАМЕТРЫ:
responsibleEmployee
- Ответственный сотрудникnotes
- Комментарии и дополнительная информацияcreatedAt
- Дата создания поставкиupdatedAt
- Дата последнего обновленияfulfillmentCenterId
- ID фулфилмент центраconsumableType
- Тип расходников
🔄 ЖИЗНЕННЫЙ ЦИКЛ ПАРАМЕТРОВ ПОСТАВКИ
Этап 1: Создание поставки (SELLER)
// Селлер указывает базовые параметры поставки
{
deliveryDate: "2025-08-25",
totalItems: 100,
items: [...products],
partnerId: "supplier-123",
organizationId: "seller-456"
}
Этап 2: Одобрение поставщиком (WHOLESALE)
// Поставщик может дополнить параметры поставки
{
status: "SUPPLIER_APPROVED",
packagesCount: 3, // Новый параметр
volume: 1.2, // Новый параметр
readyDate: "2025-08-24", // Новый параметр
notes: "Хрупкий груз" // Новый параметр
}
Этап 3: Логистическое планирование (LOGIST)
// Логистика использует параметры для расчетов
{
logisticsPrice: calculateByVolume(volume, distance),
routes: [
{
from: "Садовод",
to: "ФФ Центр",
packagesCount: 3,
volume: 1.2
}
]
}
🛡️ ПРАВИЛА БЕЗОПАСНОСТИ ПАРАМЕТРОВ
Видимость по ролям:
Параметр поставки | SELLER | WHOLESALE | FULFILLMENT | LOGIST |
---|---|---|---|---|
deliveryDate | ✅ | ✅ | ✅ | ✅ |
totalAmount | ✅ | ❌ | ❌ | ❌ |
productPrice | ✅ | ✅ | ❌ | ❌ |
packagesCount | ✅ | ✅ | ✅ | ✅ |
volume | ✅ | ✅ | ✅ | ✅ |
recipe | ✅ | ❌ | ✅ | ❌ |
logisticsPrice | ✅ | ❌ | ✅ | ✅ |
Права на изменение:
- SELLER: Может изменять до одобрения поставщиком
- WHOLESALE: Может добавлять логистические параметры при одобрении
- FULFILLMENT: Не может изменять, только просматривать
- LOGIST: Может добавлять маршруты и логистические расчеты
🎛️ UI КОМПОНЕНТЫ ДЛЯ ПАРАМЕТРОВ ПОСТАВКИ
Форма ввода параметров поставщиком:
<div className="supply-parameters-form">
<h3>Параметры поставки</h3>
{/* Основные параметры */}
<Input name="deliveryDate" label="Дата поставки" type="date" required />
<Input name="totalAmount" label="Общая стоимость" type="number" readOnly />
{/* Логистические параметры (опционально) */}
<Input name="packagesCount" label="Количество грузовых мест" type="number" />
<Input name="volume" label="Объём груза (м³)" type="number" step="0.01" />
{/* Дополнительные параметры */}
<Input name="readyDate" label="Дата готовности" type="date" />
<Textarea name="notes" label="Комментарии к поставке" />
</div>
Отображение в таблице заявок:
<Table>
<TableHeader>
<TableRow>
<TableHead>Дата поставки</TableHead>
<TableHead>Количество товаров</TableHead>
<TableHead>Стоимость товаров</TableHead>
{userRole !== 'WHOLESALE' && <TableHead>Общая стоимость</TableHead>}
<TableHead>Параметры логистики</TableHead>
<TableHead>Статус</TableHead>
</TableRow>
</TableHeader>
<TableBody>
{supplies.map(supply => (
<TableRow key={supply.id}>
<TableCell>{supply.deliveryDate}</TableCell>
<TableCell>{supply.totalItems}</TableCell>
<TableCell>{formatCurrency(supply.productPrice)}</TableCell>
{userRole !== 'WHOLESALE' && (
<TableCell>{formatCurrency(supply.totalAmount)}</TableCell>
)}
<TableCell>
{supply.packagesCount && `${supply.packagesCount} мест`}
{supply.volume && ` • ${supply.volume} м³`}
</TableCell>
<TableCell><StatusBadge status={supply.status} /></TableCell>
</TableRow>
))}
</TableBody>
</Table>
📊 ВАЛИДАЦИЯ ПАРАМЕТРОВ ПОСТАВКИ
Серверная валидация:
function validateSupplyParameters(params: SupplyParameters) {
// Обязательные параметры
if (!params.deliveryDate) throw new Error('Дата поставки обязательна')
if (!params.totalItems || params.totalItems <= 0) {
throw new Error('Количество товаров должно быть больше 0')
}
// Логистические параметры
if (params.packagesCount && params.packagesCount <= 0) {
throw new Error('Количество грузовых мест должно быть положительным')
}
if (params.volume && params.volume <= 0) {
throw new Error('Объём груза должен быть положительным')
}
// Даты
if (params.readyDate && params.deliveryDate) {
if (new Date(params.readyDate) > new Date(params.deliveryDate)) {
throw new Error('Дата готовности не может быть позже даты поставки')
}
}
}
🔍 ПОИСК И ФИЛЬТРАЦИЯ ПО ПАРАМЕТРАМ
GraphQL запрос с фильтрами:
query GetSuppliesByParameters(
$deliveryDateFrom: DateTime
$deliveryDateTo: DateTime
$minAmount: Float
$maxAmount: Float
$status: SupplyStatus
$hasLogisticsParams: Boolean
) {
mySupplyOrders(
filters: {
deliveryDate: { gte: $deliveryDateFrom, lte: $deliveryDateTo }
totalAmount: { gte: $minAmount, lte: $maxAmount }
status: $status
packagesCount: { isNull: $hasLogisticsParams }
}
) {
id
deliveryDate
totalAmount
totalItems
packagesCount
volume
status
}
}
📈 АНАЛИТИКА ПО ПАРАМЕТРАМ ПОСТАВКИ
Ключевые метрики:
- Средний объём поставки (в м³)
- Среднее количество грузовых мест
- Распределение по стоимости поставок
- Время цикла от создания до доставки
- Процент поставок с дополнительными параметрами
Все параметры поставки служат для оптимизации логистических процессов и обеспечения прозрачности цепочки поставок в экосистеме SFERA.