
## Что создано: - logist-cabinet-rules.md - технические правила кабинета логистики по стандартизированной структуре - Добавлена система тарификации с примерами UI - Интерфейсы управления заявками и отслеживания доставок - GraphQL API для логистики (queries, mutations, subscriptions) ## Что изменено в rules-complete.md: - Раздел 12 "Кабинет логистики" сокращен до краткого описания со ссылкой на специализированный файл - Убрано ~80 строк дублирующего контента - Сохранена вся бизнес-логика workflow и статусов ## Что обновлено в CLAUDE.md: - Добавлен logist-cabinet-rules.md в список кабинет-специфичных правил - Добавлены автоматические триггеры для логистических задач Файл следует стандартизированной структуре wholesale-cabinet-rules.md и обеспечивает модульность системы правил. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
514 lines
17 KiB
Markdown
514 lines
17 KiB
Markdown
# ПРАВИЛА КАБИНЕТА ЛОГИСТИКИ (LOGIST)
|
||
|
||
> ⚠️ **ВАЖНО**: Это файл с техническими деталями кабинета логистики.
|
||
> Общие бизнес-правила находятся в **[rules-complete.md](./rules-complete.md)**
|
||
|
||
## Когда использовать этот файл:
|
||
|
||
- Работа с компонентами `/logistics-requests`, `/routes`
|
||
- GraphQL запросы для логистики
|
||
- UI/UX специфика кабинета логистики
|
||
- Технические детали реализации доставок
|
||
|
||
## 1. 🚚 СТРУКТУРА КАБИНЕТА ЛОГИСТИКИ
|
||
|
||
### 1.1 Основные разделы
|
||
|
||
**ЛОГИСТИКА (`LOGIST`)** имеет доступ к следующим разделам:
|
||
|
||
- **Заявки** (`/logistics-requests`) - управление заявками на доставку
|
||
- **Маршруты** (`/routes`) - планирование маршрутов
|
||
- **В пути** (`/in-transit`) - отслеживание грузов
|
||
- **История** (`/delivery-history`) - архив доставок
|
||
- **Партнеры** (`/partners`) - управление контрагентами
|
||
- **Мессенджер** (`/messenger`) - связь с партнерами
|
||
- **Настройки** (`/settings`) - профиль и настройки
|
||
- **Экономика** (`/economics`) - финансовая аналитика
|
||
|
||
### 1.2 Навигация и роутинг
|
||
|
||
#### При входе в систему:
|
||
|
||
```typescript
|
||
switch (user?.organization?.type) {
|
||
case 'LOGIST':
|
||
router.push('/logistics-requests') // Направляем на страницу заявок
|
||
break
|
||
}
|
||
```
|
||
|
||
#### Специальная логика роутинга:
|
||
|
||
> 📖 **Бизнес-логика роутинга**: См. [rules-complete.md#4-система-ролей-и-доступов](./rules-complete.md#4--система-ролей-и-доступов)
|
||
|
||
## 2. 🎨 UI/UX КОМПОНЕНТЫ
|
||
|
||
### 2.1 Dashboard компоненты
|
||
|
||
#### Основные компоненты кабинета:
|
||
|
||
- `LogisticsRequestsDashboard` - главный компонент заявок
|
||
- `RoutesManager` - управление маршрутами
|
||
- `DeliveryTracker` - отслеживание доставок
|
||
- `LogisticsEconomicsPage` - экономическая аналитика
|
||
|
||
#### Wrapper-компоненты:
|
||
|
||
- `HomePageWrapper` - маршрутизация по типам организаций
|
||
- `EconomicsPageWrapper` - адаптивная экономика по кабинетам
|
||
|
||
#### Специализированные компоненты:
|
||
|
||
- `LogisticsRequestCard` - карточка заявки на доставку
|
||
- `RouteCard` - карточка маршрута
|
||
- `DeliveryStatusTracker` - трекер статуса доставки
|
||
- `LogisticsStats` - статистика доставок
|
||
|
||
### 2.2 Карточка заявки на доставку
|
||
|
||
#### Структура карточки:
|
||
|
||
```jsx
|
||
<div className="logistics-request-card glass-card">
|
||
<div className="flex items-start justify-between">
|
||
{/* Основная информация */}
|
||
<div className="flex-1">
|
||
<h4 className="text-white font-medium">Заявка #{request.number}</h4>
|
||
<p className="text-white/60 text-sm mt-1">
|
||
{request.fromLocation} → {request.toLocation}
|
||
</p>
|
||
</div>
|
||
|
||
{/* Статус */}
|
||
<Badge className={getStatusColor(request.status)}>{getStatusLabel(request.status)}</Badge>
|
||
</div>
|
||
|
||
{/* Детали доставки */}
|
||
<div className="mt-4 space-y-2">
|
||
<div className="flex justify-between text-sm">
|
||
<span className="text-white/60">Вес:</span>
|
||
<span className="text-white">{request.weight} кг</span>
|
||
</div>
|
||
<div className="flex justify-between text-sm">
|
||
<span className="text-white/60">Объем:</span>
|
||
<span className="text-white">{request.volume} м³</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
```
|
||
|
||
### 2.3 Интерфейс отслеживания
|
||
|
||
```jsx
|
||
<div className="delivery-tracker">
|
||
<div className="flex items-center justify-between mb-4">
|
||
<h3 className="text-white font-semibold">Статус доставки</h3>
|
||
<Badge className="bg-yellow-500/20 text-yellow-300">В пути</Badge>
|
||
</div>
|
||
|
||
{/* Прогресс доставки */}
|
||
<div className="relative">
|
||
<div className="absolute left-4 top-0 bottom-0 w-0.5 bg-white/20"></div>
|
||
{deliverySteps.map((step, index) => (
|
||
<div key={step.id} className="flex items-center gap-4 mb-4">
|
||
<div
|
||
className={`
|
||
w-8 h-8 rounded-full flex items-center justify-center
|
||
${step.completed ? 'bg-green-500' : 'bg-white/10'}
|
||
`}
|
||
>
|
||
{step.completed ? '✓' : index + 1}
|
||
</div>
|
||
<div>
|
||
<p className="text-white text-sm">{step.label}</p>
|
||
<p className="text-white/60 text-xs">{step.time}</p>
|
||
</div>
|
||
</div>
|
||
))}
|
||
</div>
|
||
</div>
|
||
```
|
||
|
||
## 3. 📊 ФУНКЦИОНАЛЬНЫЕ ВОЗМОЖНОСТИ
|
||
|
||
> 📖 **Бизнес-правила**: См. [rules-complete.md#12-кабинет-логистики](./rules-complete.md#12--кабинет-логистики) для правил workflow и процессов
|
||
|
||
### 3.1 Основные функции логистики
|
||
|
||
**РОЛЬ В СИСТЕМЕ**: Управление доставками и транспортировкой
|
||
|
||
**КЛЮЧЕВЫЕ ФУНКЦИИ**:
|
||
|
||
- **ПОДТВЕРЖДЕНИЕ**: Возможности доставки поставок
|
||
- **ПЛАНИРОВАНИЕ**: Оптимальных маршрутов
|
||
- **УПРАВЛЕНИЕ**: Транспортом и водителями
|
||
- **ОТСЛЕЖИВАНИЕ**: Мониторинг грузов в пути
|
||
|
||
### 3.2 Workflow для логистики
|
||
|
||
#### **ЭТАП 1: Получение заявки**
|
||
|
||
1. Логистика получает уведомление о новой поставке
|
||
2. Заявка появляется в разделе "Заявки" кабинета логистики
|
||
3. Логист изучает детали поставки (объем, вес, маршрут)
|
||
|
||
#### **ЭТАП 2: Подтверждение доставки**
|
||
|
||
4. Логист нажимает кнопку "Одобрить"
|
||
5. Статус поставки меняется на `LOGISTICS_CONFIRMED`
|
||
6. Уведомления отправляются всем участникам
|
||
|
||
#### **ЭТАП 3: Получение груза**
|
||
|
||
7. Логистика приезжает к поставщику
|
||
8. Поставщик передает товар и документы
|
||
9. В системе отмечается "Груз получен"
|
||
10. Статус меняется на `IN_TRANSIT`
|
||
|
||
#### **ЭТАП 4: Доставка**
|
||
|
||
11. Логистика доставляет товар на фулфилмент-центр
|
||
12. В кабинете логистики нажимают "Доставлено"
|
||
13. Фулфилмент принимает товар и отмечает "Принято"
|
||
|
||
### 3.3 Система тарификации
|
||
|
||
**ПАРАМЕТРЫ ТАРИФИКАЦИИ**:
|
||
|
||
- **Тариф до 1м³** - базовая стоимость для малых грузов
|
||
- **Тариф свыше 1м³** - стоимость для крупных грузов
|
||
- **Маршруты доставки** - от точки отправления до точки назначения
|
||
- **Описание услуг** - дополнительные условия доставки
|
||
|
||
**РАСЧЕТ СТОИМОСТИ**:
|
||
|
||
- Автоматический расчет стоимости доставки по объему груза
|
||
- Отображение примерной стоимости при создании заказа
|
||
- Учет специфики маршрута и условий доставки
|
||
|
||
#### Пример интерфейса тарификации:
|
||
|
||
```jsx
|
||
<div className="tariff-calculator glass-card p-4">
|
||
<h3 className="text-white font-semibold mb-4">Расчет стоимости доставки</h3>
|
||
|
||
<div className="space-y-3">
|
||
<div className="flex justify-between">
|
||
<span className="text-white/60">Объем груза:</span>
|
||
<span className="text-white font-medium">{volume} м³</span>
|
||
</div>
|
||
|
||
<div className="flex justify-between">
|
||
<span className="text-white/60">Базовый тариф:</span>
|
||
<span className="text-white">{volume <= 1 ? tariffUnder1m3 : tariffOver1m3} ₽/м³</span>
|
||
</div>
|
||
|
||
<div className="border-t border-white/10 pt-3">
|
||
<div className="flex justify-between text-lg">
|
||
<span className="text-white font-semibold">Итого:</span>
|
||
<span className="text-green-400 font-bold">{calculateTotal(volume, tariff)} ₽</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
```
|
||
|
||
### 3.4 Управление заявками
|
||
|
||
**РАЗДЕЛЫ КАБИНЕТА ЛОГИСТИКИ**:
|
||
|
||
- **НОВЫЕ ЗАЯВКИ** - поступившие заявки на доставку
|
||
- **В РАБОТЕ** - принятые к исполнению заявки
|
||
- **ВЫПОЛНЕННЫЕ** - завершенные доставки
|
||
- **ОТКЛОНЕННЫЕ** - заявки, которые не могут быть выполнены
|
||
|
||
**ИНФОРМАЦИЯ О ЗАЯВКЕ**:
|
||
|
||
- Детали груза (объем, вес, габариты)
|
||
- Маршрут доставки (откуда - куда)
|
||
- Срочность доставки
|
||
- Особые требования к транспортировке
|
||
- Контактная информация участников
|
||
|
||
#### Интерфейс управления заявками:
|
||
|
||
```jsx
|
||
<Tabs defaultValue="new" className="w-full">
|
||
<TabsList className="grid w-full grid-cols-4 bg-white/5">
|
||
<TabsTrigger value="new" className="data-[state=active]:bg-white/10">
|
||
Новые
|
||
<Badge className="ml-2 bg-blue-500/20">{newCount}</Badge>
|
||
</TabsTrigger>
|
||
<TabsTrigger value="in-progress" className="data-[state=active]:bg-white/10">
|
||
В работе
|
||
<Badge className="ml-2 bg-yellow-500/20">{inProgressCount}</Badge>
|
||
</TabsTrigger>
|
||
<TabsTrigger value="completed" className="data-[state=active]:bg-white/10">
|
||
Выполненные
|
||
</TabsTrigger>
|
||
<TabsTrigger value="rejected" className="data-[state=active]:bg-white/10">
|
||
Отклоненные
|
||
</TabsTrigger>
|
||
</TabsList>
|
||
|
||
<TabsContent value="new" className="mt-4">
|
||
<div className="grid gap-4">
|
||
{newRequests.map((request) => (
|
||
<LogisticsRequestCard key={request.id} request={request} />
|
||
))}
|
||
</div>
|
||
</TabsContent>
|
||
</Tabs>
|
||
```
|
||
|
||
## 4. 🛠️ GRAPHQL API
|
||
|
||
### 4.1 Основные запросы (Queries)
|
||
|
||
#### Получение заявок на доставку:
|
||
|
||
```graphql
|
||
query GetLogisticsRequests {
|
||
logisticsRequests(where: { status: PENDING }) {
|
||
id
|
||
number
|
||
fromLocation
|
||
toLocation
|
||
weight
|
||
volume
|
||
status
|
||
supply {
|
||
id
|
||
totalAmount
|
||
organization {
|
||
name # Заказчик
|
||
}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
#### Получение активных маршрутов:
|
||
|
||
```graphql
|
||
query GetActiveRoutes {
|
||
routes(where: { status: ACTIVE }) {
|
||
id
|
||
name
|
||
driver {
|
||
name
|
||
phone
|
||
}
|
||
deliveries {
|
||
id
|
||
status
|
||
estimatedTime
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
#### Получение статистики:
|
||
|
||
```graphql
|
||
query GetLogisticsStats {
|
||
logisticsStats {
|
||
totalDeliveries
|
||
activeDeliveries
|
||
completedToday
|
||
averageDeliveryTime
|
||
onTimeRate
|
||
}
|
||
}
|
||
```
|
||
|
||
### 4.2 Мутации (Mutations)
|
||
|
||
#### Подтверждение доставки:
|
||
|
||
```graphql
|
||
mutation ConfirmLogistics($supplyId: ID!) {
|
||
confirmLogistics(supplyId: $supplyId) {
|
||
success
|
||
supply {
|
||
id
|
||
status # Изменится на LOGISTICS_CONFIRMED
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
#### Обновление статуса доставки:
|
||
|
||
```graphql
|
||
mutation UpdateDeliveryStatus($deliveryId: ID!, $status: DeliveryStatus!) {
|
||
updateDeliveryStatus(id: $deliveryId, status: $status) {
|
||
success
|
||
delivery {
|
||
id
|
||
status
|
||
updatedAt
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
#### Создание маршрута:
|
||
|
||
```graphql
|
||
mutation CreateRoute($input: RouteInput!) {
|
||
createRoute(input: $input) {
|
||
success
|
||
route {
|
||
id
|
||
name
|
||
driver {
|
||
id
|
||
name
|
||
}
|
||
deliveries {
|
||
id
|
||
fromLocation
|
||
toLocation
|
||
}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 4.3 Подписки (Subscriptions)
|
||
|
||
```graphql
|
||
subscription DeliveryTracking($deliveryId: ID!) {
|
||
deliveryUpdates(deliveryId: $deliveryId) {
|
||
id
|
||
status
|
||
currentLocation
|
||
estimatedArrival
|
||
events {
|
||
type
|
||
timestamp
|
||
description
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
## 5. 📁 ТЕХНИЧЕСКИЕ КОМПОНЕНТЫ
|
||
|
||
### 5.1 Расположение компонентов
|
||
|
||
```
|
||
src/components/
|
||
├── logistics/ # Компоненты логистики
|
||
│ ├── logistics-requests-dashboard.tsx
|
||
│ ├── logistics-request-card.tsx
|
||
│ ├── route-manager.tsx
|
||
│ └── delivery-tracker.tsx
|
||
├── routes/ # Компоненты маршрутов
|
||
│ ├── route-card.tsx
|
||
│ ├── route-planner.tsx
|
||
│ └── driver-assignment.tsx
|
||
└── economics/ # Экономика
|
||
└── logistics-economics-page.tsx
|
||
```
|
||
|
||
### 5.2 Страницы (Pages)
|
||
|
||
```
|
||
src/app/
|
||
├── logistics-requests/
|
||
│ └── page.tsx # Страница заявок
|
||
├── routes/
|
||
│ └── page.tsx # Страница маршрутов
|
||
├── in-transit/
|
||
│ └── page.tsx # Активные доставки
|
||
└── delivery-history/
|
||
└── page.tsx # История доставок
|
||
```
|
||
|
||
## 6. 🚨 ТЕХНИЧЕСКИЕ ПРАВИЛА И ОГРАНИЧЕНИЯ
|
||
|
||
> 📖 **Workflow поставок**: См. [rules-complete.md#5-workflow-поставок](./rules-complete.md#5--workflow-поставок) для бизнес-процессов
|
||
|
||
### 6.1 Обязательные проверки:
|
||
|
||
- Проверка типа организации: `organization.type === 'LOGIST'`
|
||
- Валидация прав доступа на уровне GraphQL резолверов
|
||
- Проверка возможности доставки (вес, объем, расстояние)
|
||
- Контроль статусов перед изменением
|
||
|
||
### 6.2 Правила безопасности доступа:
|
||
|
||
#### Контроль на уровне компонентов:
|
||
|
||
```typescript
|
||
{user?.organization?.type === "LOGIST" && (
|
||
<LogisticsRequestsDashboard />
|
||
)}
|
||
```
|
||
|
||
#### Проверки в GraphQL резолверах:
|
||
|
||
```typescript
|
||
// Проверка что пользователь - логистика
|
||
if (context.user.organization.type !== 'LOGIST') {
|
||
throw new Error('Access denied: Logistics access required')
|
||
}
|
||
|
||
// Проверка доступа к заявкам
|
||
const request = await prisma.logisticsRequest.findFirst({
|
||
where: {
|
||
id: requestId,
|
||
organizationId: context.user.organizationId,
|
||
},
|
||
})
|
||
```
|
||
|
||
### 6.3 Запрещено:
|
||
|
||
- Изменять статусы поставок минуя workflow
|
||
- Подтверждать доставки без физического получения груза
|
||
- Показывать данные других логистических компаний
|
||
- Изменять данные после завершения доставки
|
||
|
||
### 6.4 Правила статусов доставки:
|
||
|
||
- `LOGISTICS_CONFIRMED` → только после проверки возможности
|
||
- `IN_TRANSIT` → только после физического получения груза
|
||
- `DELIVERED` → требует подтверждения от фулфилмента
|
||
|
||
### 6.5 Правила логистики
|
||
|
||
**ОБЯЗАТЕЛЬНО**:
|
||
|
||
- Своевременное подтверждение заявок
|
||
- Соблюдение сроков доставки
|
||
- Бережная транспортировка товаров
|
||
- Уведомление о статусе доставки
|
||
- Документальное оформление приема/передачи груза
|
||
|
||
**ЗАПРЕЩЕНО**:
|
||
|
||
- Принятие заявок без подтверждения возможности выполнения
|
||
- Нарушение сроков доставки без уведомления
|
||
- Повреждение товаров при транспортировке
|
||
- Передача груза без документального оформления
|
||
- Изменение маршрута без согласования
|
||
|
||
**ИНТЕГРАЦИЯ С ПАРТНЕРАМИ**:
|
||
|
||
- Логистика видит только партнеров-поставщиков и фулфилмент-центры
|
||
- Выбор логистики осуществляется из списка партнеров типа `LOGIST`
|
||
- Все взаимодействия фиксируются в системе уведомлений
|
||
|
||
> 📖 **Критические запреты**: См. [rules-complete.md#17-критические-запреты](./rules-complete.md#17--критические-запреты)
|
||
|
||
---
|
||
|
||
**Последнее обновление**: Август 2025
|
||
**Связанные файлы**:
|
||
|
||
- [rules-complete.md](./rules-complete.md) - Общие бизнес-правила
|
||
- [visual-design-rules.md](./visual-design-rules.md) - Визуальные правила
|