
## Что создано: - 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>
17 KiB
17 KiB
ПРАВИЛА КАБИНЕТА ЛОГИСТИКИ (LOGIST)
⚠️ ВАЖНО: Это файл с техническими деталями кабинета логистики. Общие бизнес-правила находятся в 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 Навигация и роутинг
При входе в систему:
switch (user?.organization?.type) {
case 'LOGIST':
router.push('/logistics-requests') // Направляем на страницу заявок
break
}
Специальная логика роутинга:
📖 Бизнес-логика роутинга: См. rules-complete.md#4-система-ролей-и-доступов
2. 🎨 UI/UX КОМПОНЕНТЫ
2.1 Dashboard компоненты
Основные компоненты кабинета:
LogisticsRequestsDashboard
- главный компонент заявокRoutesManager
- управление маршрутамиDeliveryTracker
- отслеживание доставокLogisticsEconomicsPage
- экономическая аналитика
Wrapper-компоненты:
HomePageWrapper
- маршрутизация по типам организацийEconomicsPageWrapper
- адаптивная экономика по кабинетам
Специализированные компоненты:
LogisticsRequestCard
- карточка заявки на доставкуRouteCard
- карточка маршрутаDeliveryStatusTracker
- трекер статуса доставкиLogisticsStats
- статистика доставок
2.2 Карточка заявки на доставку
Структура карточки:
<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 Интерфейс отслеживания
<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-кабинет-логистики для правил workflow и процессов
3.1 Основные функции логистики
РОЛЬ В СИСТЕМЕ: Управление доставками и транспортировкой
КЛЮЧЕВЫЕ ФУНКЦИИ:
- ПОДТВЕРЖДЕНИЕ: Возможности доставки поставок
- ПЛАНИРОВАНИЕ: Оптимальных маршрутов
- УПРАВЛЕНИЕ: Транспортом и водителями
- ОТСЛЕЖИВАНИЕ: Мониторинг грузов в пути
3.2 Workflow для логистики
ЭТАП 1: Получение заявки
- Логистика получает уведомление о новой поставке
- Заявка появляется в разделе "Заявки" кабинета логистики
- Логист изучает детали поставки (объем, вес, маршрут)
ЭТАП 2: Подтверждение доставки
- Логист нажимает кнопку "Одобрить"
- Статус поставки меняется на
LOGISTICS_CONFIRMED
- Уведомления отправляются всем участникам
ЭТАП 3: Получение груза
- Логистика приезжает к поставщику
- Поставщик передает товар и документы
- В системе отмечается "Груз получен"
- Статус меняется на
IN_TRANSIT
ЭТАП 4: Доставка
- Логистика доставляет товар на фулфилмент-центр
- В кабинете логистики нажимают "Доставлено"
- Фулфилмент принимает товар и отмечает "Принято"
3.3 Система тарификации
ПАРАМЕТРЫ ТАРИФИКАЦИИ:
- Тариф до 1м³ - базовая стоимость для малых грузов
- Тариф свыше 1м³ - стоимость для крупных грузов
- Маршруты доставки - от точки отправления до точки назначения
- Описание услуг - дополнительные условия доставки
РАСЧЕТ СТОИМОСТИ:
- Автоматический расчет стоимости доставки по объему груза
- Отображение примерной стоимости при создании заказа
- Учет специфики маршрута и условий доставки
Пример интерфейса тарификации:
<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 Управление заявками
РАЗДЕЛЫ КАБИНЕТА ЛОГИСТИКИ:
- НОВЫЕ ЗАЯВКИ - поступившие заявки на доставку
- В РАБОТЕ - принятые к исполнению заявки
- ВЫПОЛНЕННЫЕ - завершенные доставки
- ОТКЛОНЕННЫЕ - заявки, которые не могут быть выполнены
ИНФОРМАЦИЯ О ЗАЯВКЕ:
- Детали груза (объем, вес, габариты)
- Маршрут доставки (откуда - куда)
- Срочность доставки
- Особые требования к транспортировке
- Контактная информация участников
Интерфейс управления заявками:
<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)
Получение заявок на доставку:
query GetLogisticsRequests {
logisticsRequests(where: { status: PENDING }) {
id
number
fromLocation
toLocation
weight
volume
status
supply {
id
totalAmount
organization {
name # Заказчик
}
}
}
}
Получение активных маршрутов:
query GetActiveRoutes {
routes(where: { status: ACTIVE }) {
id
name
driver {
name
phone
}
deliveries {
id
status
estimatedTime
}
}
}
Получение статистики:
query GetLogisticsStats {
logisticsStats {
totalDeliveries
activeDeliveries
completedToday
averageDeliveryTime
onTimeRate
}
}
4.2 Мутации (Mutations)
Подтверждение доставки:
mutation ConfirmLogistics($supplyId: ID!) {
confirmLogistics(supplyId: $supplyId) {
success
supply {
id
status # Изменится на LOGISTICS_CONFIRMED
}
}
}
Обновление статуса доставки:
mutation UpdateDeliveryStatus($deliveryId: ID!, $status: DeliveryStatus!) {
updateDeliveryStatus(id: $deliveryId, status: $status) {
success
delivery {
id
status
updatedAt
}
}
}
Создание маршрута:
mutation CreateRoute($input: RouteInput!) {
createRoute(input: $input) {
success
route {
id
name
driver {
id
name
}
deliveries {
id
fromLocation
toLocation
}
}
}
}
4.3 Подписки (Subscriptions)
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-поставок для бизнес-процессов
6.1 Обязательные проверки:
- Проверка типа организации:
organization.type === 'LOGIST'
- Валидация прав доступа на уровне GraphQL резолверов
- Проверка возможности доставки (вес, объем, расстояние)
- Контроль статусов перед изменением
6.2 Правила безопасности доступа:
Контроль на уровне компонентов:
{user?.organization?.type === "LOGIST" && (
<LogisticsRequestsDashboard />
)}
Проверки в GraphQL резолверах:
// Проверка что пользователь - логистика
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-критические-запреты
Последнее обновление: Август 2025 Связанные файлы:
- rules-complete.md - Общие бизнес-правила
- visual-design-rules.md - Визуальные правила