Refactor: Replace wholesaler with supplier terminology and add fulfillment consumables logic
This commit is contained in:
@ -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();
|
||||
|
@ -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}
|
||||
|
Reference in New Issue
Block a user