Refactor: Replace wholesaler with supplier terminology and add fulfillment consumables logic

This commit is contained in:
Veronika Smirnova
2025-07-30 17:03:31 +03:00
parent e351752b09
commit 3e7ea13026
31 changed files with 3343 additions and 1538 deletions

View File

@ -4,7 +4,7 @@ import React, { useState, useMemo, useCallback } from "react";
import { Sidebar } from "@/components/dashboard/sidebar";
import { useSidebar } from "@/hooks/useSidebar";
import { useQuery } from "@apollo/client";
import { GET_MY_SUPPLIES } from "@/graphql/queries";
import { GET_MY_FULFILLMENT_SUPPLIES } from "@/graphql/queries";
import {
Package,
Wrench,
@ -87,14 +87,14 @@ export function FulfillmentSuppliesPage() {
loading,
error,
refetch,
} = useQuery(GET_MY_SUPPLIES, {
} = useQuery(GET_MY_FULFILLMENT_SUPPLIES, {
fetchPolicy: "cache-and-network",
onError: (error) => {
toast.error("Ошибка загрузки расходников: " + error.message);
toast.error("Ошибка загрузки расходников фулфилмента: " + error.message);
},
});
const supplies: Supply[] = suppliesData?.mySupplies || [];
const supplies: Supply[] = suppliesData?.myFulfillmentSupplies || [];
// Логирование для отладки
console.log("🔥🔥🔥 FULFILLMENT SUPPLIES PAGE DATA 🔥🔥🔥", {
@ -142,17 +142,17 @@ export function FulfillmentSuppliesPage() {
// Суммируем поставленное количество (заказано = поставлено)
acc[key].quantity += supply.quantity;
// Суммируем отправленное количество
acc[key].shippedQuantity += supply.shippedQuantity || 0;
// Остаток = Поставлено - Отправлено
// Если ничего не отправлено, то остаток = поставлено
acc[key].currentStock = acc[key].quantity - acc[key].shippedQuantity;
// Рассчитываем общую стоимость (количество × цена)
acc[key].totalCost += supply.quantity * supply.price;
// Средневзвешенная цена за единицу
if (acc[key].quantity > 0) {
acc[key].price = acc[key].totalCost / acc[key].quantity;
@ -265,7 +265,7 @@ export function FulfillmentSuppliesPage() {
const blob = new Blob([csv], { type: "text/csv;charset=utf-8;" });
const link = document.createElement("a");
link.href = URL.createObjectURL(blob);
link.download = `расходники_фф_${
link.download = `расходники_фулфилмента_${
new Date().toISOString().split("T")[0]
}.csv`;
link.click();

View File

@ -15,7 +15,8 @@ import {
GET_MY_COUNTERPARTIES,
GET_SUPPLY_ORDERS,
GET_WAREHOUSE_PRODUCTS,
GET_MY_SUPPLIES, // Добавляем импорт для загрузки расходников
GET_MY_SUPPLIES, // Расходники селлеров
GET_MY_FULFILLMENT_SUPPLIES, // Расходники фулфилмента
} from "@/graphql/queries";
import { toast } from "sonner";
import {
@ -198,7 +199,7 @@ export function FulfillmentWarehouseDashboard() {
fetchPolicy: "cache-and-network",
});
// Загружаем расходники фулфилмента
// Загружаем расходники селлеров
const {
data: suppliesData,
loading: suppliesLoading,
@ -208,6 +209,16 @@ export function FulfillmentWarehouseDashboard() {
fetchPolicy: "cache-and-network",
});
// Загружаем расходники фулфилмента
const {
data: fulfillmentSuppliesData,
loading: fulfillmentSuppliesLoading,
error: fulfillmentSuppliesError,
refetch: refetchFulfillmentSupplies,
} = useQuery(GET_MY_FULFILLMENT_SUPPLIES, {
fetchPolicy: "cache-and-network",
});
// Получаем данные магазинов, заказов и товаров
const allCounterparties = counterpartiesData?.myCounterparties || [];
const sellerPartners = allCounterparties.filter(
@ -215,7 +226,9 @@ export function FulfillmentWarehouseDashboard() {
);
const supplyOrders: SupplyOrder[] = ordersData?.supplyOrders || [];
const allProducts = productsData?.warehouseProducts || [];
const mySupplies = suppliesData?.mySupplies || []; // Добавляем расходники
const mySupplies = suppliesData?.mySupplies || []; // Расходники селлеров
const myFulfillmentSupplies =
fulfillmentSuppliesData?.myFulfillmentSupplies || []; // Расходники фулфилмента
// Логирование для отладки
console.log("🏪 Данные склада фулфилмента:", {
@ -391,37 +404,47 @@ export function FulfillmentWarehouseDashboard() {
0
);
// Подсчитываем расходники ФФ (расходники, которые получил фулфилмент-центр)
const fulfillmentConsumablesOrders = supplyOrders.filter((order) => {
// Заказы где текущий фулфилмент-центр является получателем
const isRecipient =
order.fulfillmentCenter?.id === user?.organization?.id;
// НО создатель заказа НЕ мы (т.е. селлер создал заказ для нас)
const isCreatedByOther =
order.organization?.id !== user?.organization?.id;
// И статус DELIVERED (получено)
const isDelivered = order.status === "DELIVERED";
return isRecipient && isCreatedByOther && isDelivered;
});
// Подсчитываем общее количество расходников ФФ из доставленных заказов
const totalFulfillmentSupplies = fulfillmentConsumablesOrders.reduce(
(sum, order) => sum + (order.totalItems || 0),
// Подсчитываем расходники фулфилмента из нового резолвера
// Основное значение = текущий остаток на складе
const totalFulfillmentSupplies = myFulfillmentSupplies.reduce(
(sum: number, supply: any) => sum + (supply.currentStock || 0),
0
);
// Подсчитываем изменения за сегодня (расходники ФФ, полученные сегодня)
// Дополнительные значения - динамика за сегодня
const today = new Date();
today.setHours(0, 0, 0, 0);
const fulfillmentSuppliesReceivedToday = fulfillmentConsumablesOrders
.filter((order) => {
const orderDate = new Date(order.updatedAt || order.createdAt);
orderDate.setHours(0, 0, 0, 0);
return orderDate.getTime() === today.getTime();
// Поставлено сегодня (дополнительное значение +)
const fulfillmentSuppliesReceivedToday = myFulfillmentSupplies
.filter((supply: any) => {
const supplyDate = new Date(supply.updatedAt || supply.createdAt);
supplyDate.setHours(0, 0, 0, 0);
return (
supplyDate.getTime() === today.getTime() &&
supply.status === "available"
);
})
.reduce((sum, order) => sum + (order.totalItems || 0), 0);
.reduce(
(sum: number, supply: any) => sum + (supply.quantity || 0), // Поставленное количество
0
);
// Использовано сегодня (дополнительное значение -)
const fulfillmentSuppliesUsedToday = myFulfillmentSupplies
.filter((supply: any) => {
const supplyDate = new Date(supply.updatedAt || supply.createdAt);
supplyDate.setHours(0, 0, 0, 0);
return supplyDate.getTime() === today.getTime();
})
.reduce(
(sum: number, supply: any) => sum + (supply.usedStock || 0), // Использованное количество
0
);
// Итоговое изменение = поставлено - использовано
const fulfillmentSuppliesChange =
fulfillmentSuppliesReceivedToday - fulfillmentSuppliesUsedToday;
return {
products: {
@ -441,8 +464,8 @@ export function FulfillmentWarehouseDashboard() {
change: 0, // Нет реальных данных об изменениях возвратов
},
fulfillmentSupplies: {
current: totalFulfillmentSupplies, // Реальное количество расходников ФФ
change: fulfillmentSuppliesReceivedToday, // Расходники ФФ, полученные сегодня
current: totalFulfillmentSupplies, // Основное значение: текущий остаток на складе
change: fulfillmentSuppliesChange, // Дополнительное значение: поставлено - использовано за сегодня
},
sellerSupplies: {
current: totalSellerSupplies, // Реальное количество расходников селлера из базы
@ -1245,7 +1268,7 @@ export function FulfillmentWarehouseDashboard() {
description="К обработке"
/>
<StatCard
title="Расходники ФФ"
title="Расходники фулфилмента"
icon={Wrench}
current={warehouseStats.fulfillmentSupplies.current}
change={warehouseStats.fulfillmentSupplies.change}