Обновлены модели и компоненты для управления поставками и расходниками. Добавлены новые поля в модели SupplyOrder и соответствующие резолверы для поддержки логистики. Реализованы компоненты уведомлений для отображения статуса логистических заявок и поставок. Оптимизирован интерфейс для улучшения пользовательского опыта, добавлены логи для диагностики запросов. Обновлены GraphQL схемы и мутации для поддержки новых функциональных возможностей.

This commit is contained in:
Veronika Smirnova
2025-08-03 17:04:29 +03:00
parent a33adda9d7
commit 8407ca397c
34 changed files with 5382 additions and 1795 deletions

View File

@ -48,6 +48,65 @@ function PendingSuppliesNotification() {
);
}
// Компонент для отображения логистических заявок (только для логистики)
function LogisticsOrdersNotification() {
const { data: pendingData } = useQuery(GET_PENDING_SUPPLIES_COUNT, {
pollInterval: 30000, // Обновляем каждые 30 секунд
fetchPolicy: "cache-first",
errorPolicy: "ignore",
});
const logisticsCount =
pendingData?.pendingSuppliesCount?.logisticsOrders || 0;
if (logisticsCount === 0) return null;
return (
<div className="absolute -top-1 -right-1 bg-red-500 text-white text-xs rounded-full min-w-[18px] h-[18px] flex items-center justify-center font-bold animate-pulse">
{logisticsCount > 99 ? "99+" : logisticsCount}
</div>
);
}
// Компонент для отображения поставок фулфилмента (только поставки, не заявки на партнерство)
function FulfillmentSuppliesNotification() {
const { data: pendingData } = useQuery(GET_PENDING_SUPPLIES_COUNT, {
pollInterval: 30000, // Обновляем каждые 30 секунд
fetchPolicy: "cache-first",
errorPolicy: "ignore",
});
const suppliesCount = pendingData?.pendingSuppliesCount?.supplyOrders || 0;
if (suppliesCount === 0) return null;
return (
<div className="absolute -top-1 -right-1 bg-red-500 text-white text-xs rounded-full min-w-[18px] h-[18px] flex items-center justify-center font-bold animate-pulse">
{suppliesCount > 99 ? "99+" : suppliesCount}
</div>
);
}
// Компонент для отображения входящих заказов поставщика (только входящие заказы, не заявки на партнерство)
function WholesaleOrdersNotification() {
const { data: pendingData } = useQuery(GET_PENDING_SUPPLIES_COUNT, {
pollInterval: 30000, // Обновляем каждые 30 секунд
fetchPolicy: "cache-first",
errorPolicy: "ignore",
});
const ordersCount =
pendingData?.pendingSuppliesCount?.incomingSupplierOrders || 0;
if (ordersCount === 0) return null;
return (
<div className="absolute -top-1 -right-1 bg-red-500 text-white text-xs rounded-full min-w-[18px] h-[18px] flex items-center justify-center font-bold animate-pulse">
{ordersCount > 99 ? "99+" : ordersCount}
</div>
);
}
export function Sidebar() {
const { user, logout } = useAuth();
const router = useRouter();
@ -149,7 +208,7 @@ export function Sidebar() {
router.push("/supplies");
break;
case "WHOLESALE":
router.push("/supplies");
router.push("/supplier-orders");
break;
case "LOGIST":
router.push("/logistics-orders");
@ -202,7 +261,8 @@ export function Sidebar() {
const isSuppliesActive =
pathname.startsWith("/supplies") ||
pathname.startsWith("/fulfillment-supplies") ||
pathname.startsWith("/logistics");
pathname.startsWith("/logistics") ||
pathname.startsWith("/supplier-orders");
const isPartnersActive = pathname.startsWith("/partners");
return (
@ -475,8 +535,7 @@ export function Sidebar() {
>
<Truck className="h-4 w-4 flex-shrink-0" />
{!isCollapsed && <span className="ml-3">Мои поставки</span>}
{/* Уведомление о непринятых поставках */}
<PendingSuppliesNotification />
{/* Селлеры не получают уведомления о поставках - только отслеживают статус */}
</Button>
)}
@ -536,8 +595,8 @@ export function Sidebar() {
{!isCollapsed && (
<span className="ml-3">Входящие поставки</span>
)}
{/* Уведомление о непринятых поставках */}
<PendingSuppliesNotification />
{/* Уведомление только о поставках, не о заявках на партнерство */}
<FulfillmentSuppliesNotification />
</Button>
)}
@ -595,8 +654,8 @@ export function Sidebar() {
>
<Truck className="h-4 w-4 flex-shrink-0" />
{!isCollapsed && <span className="ml-3">Заявки</span>}
{/* Уведомление о непринятых поставках */}
<PendingSuppliesNotification />
{/* Уведомление только о входящих заказах поставок, не о заявках на партнерство */}
<WholesaleOrdersNotification />
</Button>
)}
@ -616,8 +675,8 @@ export function Sidebar() {
>
<Truck className="h-4 w-4 flex-shrink-0" />
{!isCollapsed && <span className="ml-3">Перевозки</span>}
{/* Уведомление о непринятых поставках */}
<PendingSuppliesNotification />
{/* Уведомление только о логистических заявках */}
<LogisticsOrdersNotification />
</Button>
)}