Обновлены модели и компоненты для управления поставками и расходниками. Добавлены новые поля в модели SupplyOrder и соответствующие резолверы для поддержки логистики. Реализованы компоненты уведомлений для отображения статуса логистических заявок и поставок. Оптимизирован интерфейс для улучшения пользовательского опыта, добавлены логи для диагностики запросов. Обновлены GraphQL схемы и мутации для поддержки новых функциональных возможностей.
This commit is contained in:
@ -11,9 +11,9 @@ import { Sidebar } from "@/components/dashboard/sidebar";
|
||||
import { useSidebar } from "@/hooks/useSidebar";
|
||||
import { useAuth } from "@/hooks/useAuth";
|
||||
import { GET_SUPPLY_ORDERS } from "@/graphql/queries";
|
||||
import {
|
||||
LOGISTICS_CONFIRM_ORDER,
|
||||
LOGISTICS_REJECT_ORDER
|
||||
import {
|
||||
LOGISTICS_CONFIRM_ORDER,
|
||||
LOGISTICS_REJECT_ORDER,
|
||||
} from "@/graphql/mutations";
|
||||
import { toast } from "sonner";
|
||||
import {
|
||||
@ -37,7 +37,15 @@ interface SupplyOrder {
|
||||
organizationId: string;
|
||||
partnerId: string;
|
||||
deliveryDate: string;
|
||||
status: "PENDING" | "SUPPLIER_APPROVED" | "LOGISTICS_CONFIRMED" | "SHIPPED" | "DELIVERED" | "CANCELLED";
|
||||
status:
|
||||
| "PENDING"
|
||||
| "SUPPLIER_APPROVED"
|
||||
| "CONFIRMED"
|
||||
| "LOGISTICS_CONFIRMED"
|
||||
| "SHIPPED"
|
||||
| "IN_TRANSIT"
|
||||
| "DELIVERED"
|
||||
| "CANCELLED";
|
||||
totalAmount: number;
|
||||
totalItems: number;
|
||||
createdAt: string;
|
||||
@ -89,7 +97,11 @@ export function LogisticsOrdersDashboard() {
|
||||
fetchPolicy: "cache-and-network",
|
||||
});
|
||||
|
||||
console.log(`DEBUG ЛОГИСТИКА: loading=${loading}, error=${error?.message}, totalOrders=${data?.supplyOrders?.length || 0}`);
|
||||
console.log(
|
||||
`DEBUG ЛОГИСТИКА: loading=${loading}, error=${
|
||||
error?.message
|
||||
}, totalOrders=${data?.supplyOrders?.length || 0}`
|
||||
);
|
||||
|
||||
// Мутации для действий логистики
|
||||
const [logisticsConfirmOrder] = useMutation(LOGISTICS_CONFIRM_ORDER, {
|
||||
@ -137,8 +149,15 @@ export function LogisticsOrdersDashboard() {
|
||||
// Фильтруем заказы где текущая организация является логистическим партнером
|
||||
const logisticsOrders: SupplyOrder[] = (data?.supplyOrders || []).filter(
|
||||
(order: SupplyOrder) => {
|
||||
const isLogisticsPartner = order.logisticsPartner?.id === user?.organization?.id;
|
||||
console.log(`DEBUG ЛОГИСТИКА: Заказ ${order.id.slice(-8)} - статус: ${order.status}, logisticsPartnerId: ${order.logisticsPartner?.id}, currentOrgId: ${user?.organization?.id}, isLogisticsPartner: ${isLogisticsPartner}`);
|
||||
const isLogisticsPartner =
|
||||
order.logisticsPartner?.id === user?.organization?.id;
|
||||
console.log(
|
||||
`DEBUG ЛОГИСТИКА: Заказ ${order.id.slice(-8)} - статус: ${
|
||||
order.status
|
||||
}, logisticsPartnerId: ${order.logisticsPartner?.id}, currentOrgId: ${
|
||||
user?.organization?.id
|
||||
}, isLogisticsPartner: ${isLogisticsPartner}`
|
||||
);
|
||||
return isLogisticsPartner;
|
||||
}
|
||||
);
|
||||
@ -155,6 +174,11 @@ export function LogisticsOrdersDashboard() {
|
||||
color: "bg-yellow-500/20 text-yellow-300 border-yellow-500/30",
|
||||
icon: AlertTriangle,
|
||||
},
|
||||
CONFIRMED: {
|
||||
label: "Требует подтверждения",
|
||||
color: "bg-yellow-500/20 text-yellow-300 border-yellow-500/30",
|
||||
icon: AlertTriangle,
|
||||
},
|
||||
LOGISTICS_CONFIRMED: {
|
||||
label: "Подтверждено",
|
||||
color: "bg-blue-500/20 text-blue-300 border-blue-500/30",
|
||||
@ -187,7 +211,7 @@ export function LogisticsOrdersDashboard() {
|
||||
icon: Truck,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
const config = statusMap[status as keyof typeof statusMap];
|
||||
if (!config) {
|
||||
console.warn(`Unknown status: ${status}`);
|
||||
@ -199,7 +223,7 @@ export function LogisticsOrdersDashboard() {
|
||||
</Badge>
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
const { label, color, icon: Icon } = config;
|
||||
return (
|
||||
<Badge className={`${color} border flex items-center gap-1 text-xs`}>
|
||||
@ -247,7 +271,9 @@ export function LogisticsOrdersDashboard() {
|
||||
return (
|
||||
<div className="h-screen flex overflow-hidden">
|
||||
<Sidebar />
|
||||
<main className={`flex-1 ${getSidebarMargin()} px-4 py-3 flex flex-col transition-all duration-300 overflow-hidden`}>
|
||||
<main
|
||||
className={`flex-1 ${getSidebarMargin()} px-4 py-3 flex flex-col transition-all duration-300 overflow-hidden`}
|
||||
>
|
||||
<div className="flex-1 overflow-y-auto flex items-center justify-center">
|
||||
<div className="text-white">Загрузка заказов...</div>
|
||||
</div>
|
||||
@ -260,9 +286,13 @@ export function LogisticsOrdersDashboard() {
|
||||
return (
|
||||
<div className="h-screen flex overflow-hidden">
|
||||
<Sidebar />
|
||||
<main className={`flex-1 ${getSidebarMargin()} px-4 py-3 flex flex-col transition-all duration-300 overflow-hidden`}>
|
||||
<main
|
||||
className={`flex-1 ${getSidebarMargin()} px-4 py-3 flex flex-col transition-all duration-300 overflow-hidden`}
|
||||
>
|
||||
<div className="flex-1 overflow-y-auto flex items-center justify-center">
|
||||
<div className="text-red-300">Ошибка загрузки заказов: {error.message}</div>
|
||||
<div className="text-red-300">
|
||||
Ошибка загрузки заказов: {error.message}
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
@ -272,7 +302,9 @@ export function LogisticsOrdersDashboard() {
|
||||
return (
|
||||
<div className="h-screen flex overflow-hidden">
|
||||
<Sidebar />
|
||||
<main className={`flex-1 ${getSidebarMargin()} px-4 py-3 flex flex-col transition-all duration-300 overflow-hidden`}>
|
||||
<main
|
||||
className={`flex-1 ${getSidebarMargin()} px-4 py-3 flex flex-col transition-all duration-300 overflow-hidden`}
|
||||
>
|
||||
<div className="flex-1 overflow-y-auto space-y-6">
|
||||
{/* Заголовок */}
|
||||
<div className="flex items-center justify-between">
|
||||
@ -296,7 +328,13 @@ export function LogisticsOrdersDashboard() {
|
||||
<div>
|
||||
<p className="text-white/60 text-sm">Требуют подтверждения</p>
|
||||
<p className="text-xl font-bold text-white">
|
||||
{logisticsOrders.filter(order => order.status === "SUPPLIER_APPROVED").length}
|
||||
{
|
||||
logisticsOrders.filter(
|
||||
(order) =>
|
||||
order.status === "SUPPLIER_APPROVED" ||
|
||||
order.status === "CONFIRMED"
|
||||
).length
|
||||
}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@ -310,7 +348,11 @@ export function LogisticsOrdersDashboard() {
|
||||
<div>
|
||||
<p className="text-white/60 text-sm">Подтверждено</p>
|
||||
<p className="text-xl font-bold text-white">
|
||||
{logisticsOrders.filter(order => order.status === "LOGISTICS_CONFIRMED").length}
|
||||
{
|
||||
logisticsOrders.filter(
|
||||
(order) => order.status === "LOGISTICS_CONFIRMED"
|
||||
).length
|
||||
}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@ -324,7 +366,11 @@ export function LogisticsOrdersDashboard() {
|
||||
<div>
|
||||
<p className="text-white/60 text-sm">В пути</p>
|
||||
<p className="text-xl font-bold text-white">
|
||||
{logisticsOrders.filter(order => order.status === "SHIPPED").length}
|
||||
{
|
||||
logisticsOrders.filter(
|
||||
(order) => order.status === "SHIPPED"
|
||||
).length
|
||||
}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@ -338,7 +384,11 @@ export function LogisticsOrdersDashboard() {
|
||||
<div>
|
||||
<p className="text-white/60 text-sm">Доставлено</p>
|
||||
<p className="text-xl font-bold text-white">
|
||||
{logisticsOrders.filter(order => order.status === "DELIVERED").length}
|
||||
{
|
||||
logisticsOrders.filter(
|
||||
(order) => order.status === "DELIVERED"
|
||||
).length
|
||||
}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@ -355,7 +405,8 @@ export function LogisticsOrdersDashboard() {
|
||||
Нет логистических заказов
|
||||
</h3>
|
||||
<p className="text-white/60">
|
||||
Заказы поставок, требующие логистического сопровождения, будут отображаться здесь
|
||||
Заказы поставок, требующие логистического сопровождения,
|
||||
будут отображаться здесь
|
||||
</p>
|
||||
</div>
|
||||
</Card>
|
||||
@ -384,19 +435,29 @@ export function LogisticsOrdersDashboard() {
|
||||
<div className="flex items-center space-x-2">
|
||||
<Avatar className="w-8 h-8">
|
||||
<AvatarFallback className="bg-blue-500 text-white text-sm">
|
||||
{getInitials(order.partner.name || order.partner.fullName || "П")}
|
||||
{getInitials(
|
||||
order.partner.name ||
|
||||
order.partner.fullName ||
|
||||
"П"
|
||||
)}
|
||||
</AvatarFallback>
|
||||
</Avatar>
|
||||
<span className="text-white/60 text-sm">→</span>
|
||||
<Avatar className="w-8 h-8">
|
||||
<AvatarFallback className="bg-green-500 text-white text-sm">
|
||||
{getInitials(order.organization.name || order.organization.fullName || "ФФ")}
|
||||
{getInitials(
|
||||
order.organization.name ||
|
||||
order.organization.fullName ||
|
||||
"ФФ"
|
||||
)}
|
||||
</AvatarFallback>
|
||||
</Avatar>
|
||||
</div>
|
||||
<div className="min-w-0">
|
||||
<h3 className="text-white font-medium text-sm truncate">
|
||||
{order.partner.name || order.partner.fullName} → {order.organization.name || order.organization.fullName}
|
||||
{order.partner.name || order.partner.fullName} →{" "}
|
||||
{order.organization.name ||
|
||||
order.organization.fullName}
|
||||
</h3>
|
||||
<p className="text-white/60 text-xs">
|
||||
Поставщик → Фулфилмент
|
||||
@ -426,7 +487,8 @@ export function LogisticsOrdersDashboard() {
|
||||
{getStatusBadge(order.status)}
|
||||
|
||||
{/* Кнопки действий для логистики */}
|
||||
{order.status === "SUPPLIER_APPROVED" && (
|
||||
{(order.status === "SUPPLIER_APPROVED" ||
|
||||
order.status === "CONFIRMED") && (
|
||||
<div className="flex items-center space-x-2">
|
||||
<Button
|
||||
size="sm"
|
||||
@ -459,7 +521,7 @@ export function LogisticsOrdersDashboard() {
|
||||
{expandedOrders.has(order.id) && (
|
||||
<>
|
||||
<Separator className="my-4 bg-white/10" />
|
||||
|
||||
|
||||
{/* Сумма заказа */}
|
||||
<div className="mb-4 p-3 bg-white/5 rounded">
|
||||
<div className="flex items-center justify-between">
|
||||
@ -490,7 +552,8 @@ export function LogisticsOrdersDashboard() {
|
||||
</h4>
|
||||
<div className="bg-white/5 rounded p-3">
|
||||
<p className="text-white">
|
||||
{order.organization.name || order.organization.fullName}
|
||||
{order.organization.name ||
|
||||
order.organization.fullName}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@ -589,4 +652,4 @@ export function LogisticsOrdersDashboard() {
|
||||
</main>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user