From f198994400e0ec43d4a74cdd94f521374b2b1ea1 Mon Sep 17 00:00:00 2001 From: Veronika Smirnova Date: Sat, 26 Jul 2025 21:07:35 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D1=8B=20=D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BF=D0=BE=D1=81=D1=82=D0=B0=D0=B2=D0=BA=D0=B0?= =?UTF-8?q?=D0=BC=D0=B8:=20=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B=20=D1=81=D1=82=D0=B8=D0=BB=D0=B8=20=D0=B8=20=D0=BB=D0=BE?= =?UTF-8?q?=D0=B3=D0=B8=D0=BA=D0=B0=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B4=D0=BB=D1=8F=20=D0=B2?= =?UTF-8?q?=D0=BA=D0=BB=D0=B0=D0=B4=D0=BE=D0=BA=20=D0=B8=20=D0=BA=D0=B0?= =?UTF-8?q?=D1=80=D1=82=D0=BE=D1=87=D0=B5=D0=BA=20=D1=82=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D1=80=D0=BE=D0=B2.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=BD=D0=B0=20=D0=BD=D0=B0=D0=BB=D0=B8=D1=87=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B8=D0=B4=D0=B5=D0=BD=D1=82=D0=B8=D1=84=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0=D1=82=D0=BE=D1=80=D0=BE=D0=B2=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BE?= =?UTF-8?q?=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B8=20=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D1=85.=20=D0=9E=D0=BF=D1=82=D0=B8=D0=BC?= =?UTF-8?q?=D0=B8=D0=B7=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=20=D0=B8=D0=BD?= =?UTF-8?q?=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81=20=D1=81=20=D0=B8?= =?UTF-8?q?=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=D0=BC=20=D0=BD=D0=BE=D0=B2=D1=8B=D1=85=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD=D1=82=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B8=20=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D1=87=D0=B8=D1=82=D0=B0=D0=B5=D0=BC=D0=BE=D1=81=D1=82=D1=8C=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=B4=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fulfillment-supplies-dashboard.tsx | 22 +- .../fulfillment-goods-tab.tsx | 546 ++++++++++-------- .../fulfillment-supplies-tab.tsx | 43 +- .../marketplace-supplies-tab.tsx | 24 +- .../ozon-supplies-tab.tsx | 89 +-- .../wildberries-supplies-tab.tsx | 85 +-- .../fulfillment-warehouse-dashboard.tsx | 506 +++++++++------- .../fulfillment-goods-tab.tsx | 316 +++++----- .../fulfillment-supplies-tab.tsx | 15 +- .../real-supply-orders-tab.tsx | 17 +- .../ozon-supplies-tab.tsx | 51 +- .../wildberries-supplies-tab.tsx | 51 +- .../supplies/supplies-dashboard.tsx | 52 +- src/components/supplies/ui/stats-card.tsx | 16 +- src/components/supplies/ui/stats-grid.tsx | 8 +- 15 files changed, 989 insertions(+), 852 deletions(-) diff --git a/src/components/fulfillment-supplies/fulfillment-supplies-dashboard.tsx b/src/components/fulfillment-supplies/fulfillment-supplies-dashboard.tsx index 60dc166..7fae5bd 100644 --- a/src/components/fulfillment-supplies/fulfillment-supplies-dashboard.tsx +++ b/src/components/fulfillment-supplies/fulfillment-supplies-dashboard.tsx @@ -19,7 +19,7 @@ export function FulfillmentSuppliesDashboard() {
{/* Основной контент с табами */} @@ -29,26 +29,32 @@ export function FulfillmentSuppliesDashboard() { onValueChange={setActiveTab} className="h-full flex flex-col" > - + - Поставки на фулфилмент + + Поставки на фулфилмент + + Фулфилмент - Поставки на маркетплейсы + + Поставки на маркетплейсы + + Маркетплейсы @@ -57,7 +63,7 @@ export function FulfillmentSuppliesDashboard() { diff --git a/src/components/fulfillment-supplies/fulfillment-supplies/fulfillment-goods-tab.tsx b/src/components/fulfillment-supplies/fulfillment-supplies/fulfillment-goods-tab.tsx index d186051..ee6a2f2 100644 --- a/src/components/fulfillment-supplies/fulfillment-supplies/fulfillment-goods-tab.tsx +++ b/src/components/fulfillment-supplies/fulfillment-supplies/fulfillment-goods-tab.tsx @@ -421,6 +421,11 @@ export function FulfillmentGoodsTab() { ); const toggleSellerExpansion = (sellerId: string) => { + if (!sellerId) { + console.error("SellerId is undefined or null"); + return; + } + const newExpanded = new Set(expandedSellers); if (newExpanded.has(sellerId)) { newExpanded.delete(sellerId); @@ -431,6 +436,11 @@ export function FulfillmentGoodsTab() { }; const toggleSupplyExpansion = (supplyId: string) => { + if (!supplyId) { + console.error("SupplyId is undefined or null"); + return; + } + const newExpanded = new Set(expandedSupplies); if (newExpanded.has(supplyId)) { newExpanded.delete(supplyId); @@ -441,6 +451,11 @@ export function FulfillmentGoodsTab() { }; const toggleRouteExpansion = (routeId: string) => { + if (!routeId) { + console.error("RouteId is undefined or null"); + return; + } + const newExpanded = new Set(expandedRoutes); if (newExpanded.has(routeId)) { newExpanded.delete(routeId); @@ -451,6 +466,11 @@ export function FulfillmentGoodsTab() { }; const toggleSupplierExpansion = (supplierId: string) => { + if (!supplierId) { + console.error("SupplierId is undefined or null"); + return; + } + const newExpanded = new Set(expandedSuppliers); if (newExpanded.has(supplierId)) { newExpanded.delete(supplierId); @@ -634,34 +654,37 @@ export function FulfillmentGoodsTab() { }; return ( -
+
{/* Вкладки товаров */} - + - - Новые + + Новые + Н - - Приёмка + + Приёмка + П - - Принято + + Принято + Пр @@ -705,60 +728,66 @@ export function FulfillmentGoodsTab() { }; return ( -
+
{/* Статистика с кнопкой */} -
-
- -
-
- +
+
+ +
+
+
-

Поставок

-

+

+ Поставок +

+

{tabFilteredSupplies.length}

- -
-
- + +
+
+
-
-

Стоимость

-

+

+

+ Стоимость +

+

{formatCurrency(getTabTotalValue())}

- -
-
- + +
+
+
-

Товаров

-

+

+ Товаров +

+

{getTabTotalQuantity()} ед.

- -
-
- + +
+
+
-

Объём

-

+

Объём

+

{getTabTotalVolume().toFixed(1)} м³

@@ -768,29 +797,30 @@ export function FulfillmentGoodsTab() {
{/* Фильтры */} -
+
- + setSearchTerm(e.target.value)} - className="glass-input pl-10 text-white placeholder:text-white/40" + className="glass-input pl-8 xl:pl-10 text-white placeholder:text-white/40 text-xs xl:text-sm h-8 xl:h-auto" />
setSearchTerm(e.target.value)} - className="glass-input pl-10 text-white placeholder:text-white/40" + className="glass-input pl-8 xl:pl-10 text-white placeholder:text-white/40 text-xs xl:text-sm h-8 xl:h-auto" />
{/* Список поставок */}
-
+
{filteredSupplies.map((supply) => (
diff --git a/src/components/fulfillment-supplies/marketplace-supplies/wildberries-supplies-tab.tsx b/src/components/fulfillment-supplies/marketplace-supplies/wildberries-supplies-tab.tsx index 819933d..8d3058e 100644 --- a/src/components/fulfillment-supplies/marketplace-supplies/wildberries-supplies-tab.tsx +++ b/src/components/fulfillment-supplies/marketplace-supplies/wildberries-supplies-tab.tsx @@ -13,6 +13,8 @@ import { AlertCircle, Eye, Calendar, + Package2, + Box, } from "lucide-react"; // Мок данные для поставок на Wildberries @@ -139,60 +141,62 @@ export function WildberriesSuppliesTab() { }; return ( -
+
{/* Статистика с кнопкой */} -
-
- -
-
- +
+
+ +
+
+
-

Поставок

-

+

Поставок

+

{filteredSupplies.length}

- -
-
- + +
+
+
-
-

Стоимость

-

+

+

+ Стоимость +

+

{formatCurrency(getTotalValue())}

- -
-
- + +
+
+
-

Товаров

-

+

Товаров

+

{getTotalItems()}

- -
-
- + +
+
+
-

Коробок

-

+

Коробок

+

{getTotalBoxes()}

@@ -202,46 +206,47 @@ export function WildberriesSuppliesTab() {
{/* Фильтры */} -
+
- + setSearchTerm(e.target.value)} - className="glass-input pl-10 text-white placeholder:text-white/40" + className="glass-input pl-8 xl:pl-10 text-white placeholder:text-white/40 text-xs xl:text-sm h-8 xl:h-auto" />
{/* Список поставок */}
-
+
{filteredSupplies.map((supply) => (
diff --git a/src/components/fulfillment-warehouse/fulfillment-warehouse-dashboard.tsx b/src/components/fulfillment-warehouse/fulfillment-warehouse-dashboard.tsx index 1b80ac7..13bd585 100644 --- a/src/components/fulfillment-warehouse/fulfillment-warehouse-dashboard.tsx +++ b/src/components/fulfillment-warehouse/fulfillment-warehouse-dashboard.tsx @@ -20,6 +20,8 @@ import { ArrowUpDown, Store, Package2, + Eye, + EyeOff, } from "lucide-react"; // Типы данных @@ -57,6 +59,7 @@ export function FulfillmentWarehouseDashboard() { const [sortField, setSortField] = useState("name"); const [sortOrder, setSortOrder] = useState<"asc" | "desc">("asc"); const [expandedStores, setExpandedStores] = useState>(new Set()); + const [showAdditionalValues, setShowAdditionalValues] = useState(true); // Мок данные для статистики const warehouseStats: WarehouseStats = { @@ -324,6 +327,26 @@ export function FulfillmentWarehouseDashboard() { }`} /> )} + {field === "pvzReturns" && ( + + )}
); @@ -397,10 +420,30 @@ export function FulfillmentWarehouseDashboard() { className="p-4 border-b border-white/10 flex-shrink-0" style={{ maxHeight: "10vh" }} > -
+

Детализация по магазинам

+ + {/* Компактный поиск */} +
+ +
+ setSearchTerm(e.target.value)} + className="pl-8 h-8 text-sm glass-input text-white placeholder:text-white/40 flex-1" + /> + +
+
+
- - {/* Компактный поиск */} -
- - setSearchTerm(e.target.value)} - className="pl-8 h-8 text-sm glass-input text-white placeholder:text-white/40" - /> -
{/* Фиксированные заголовки таблицы */} @@ -475,26 +507,28 @@ export function FulfillmentWarehouseDashboard() {
-
- {/* Положительное изменение - всегда зеленое */} -
- - +{Math.abs(Math.floor(totals.productsChange * 0.6))} - + {showAdditionalValues && ( +
+ {/* Положительное изменение - всегда зеленое */} +
+ + +{Math.abs(Math.floor(totals.productsChange * 0.6))} + +
+ {/* Отрицательное изменение - всегда красное */} +
+ + -{Math.abs(Math.floor(totals.productsChange * 0.4))} + +
+ {/* Результирующее изменение */} +
+ + {Math.abs(totals.productsChange)} + +
- {/* Отрицательное изменение - всегда красное */} -
- - -{Math.abs(Math.floor(totals.productsChange * 0.4))} - -
- {/* Результирующее изменение */} -
- - {Math.abs(totals.productsChange)} - -
-
+ )}
@@ -517,26 +551,28 @@ export function FulfillmentWarehouseDashboard() {
-
- {/* Положительное изменение - всегда зеленое */} -
- - +{Math.abs(Math.floor(totals.goodsChange * 0.6))} - + {showAdditionalValues && ( +
+ {/* Положительное изменение - всегда зеленое */} +
+ + +{Math.abs(Math.floor(totals.goodsChange * 0.6))} + +
+ {/* Отрицательное изменение - всегда красное */} +
+ + -{Math.abs(Math.floor(totals.goodsChange * 0.4))} + +
+ {/* Результирующее изменение */} +
+ + {Math.abs(totals.goodsChange)} + +
- {/* Отрицательное изменение - всегда красное */} -
- - -{Math.abs(Math.floor(totals.goodsChange * 0.4))} - -
- {/* Результирующее изменение */} -
- - {Math.abs(totals.goodsChange)} - -
-
+ )}
@@ -562,26 +598,28 @@ export function FulfillmentWarehouseDashboard() {
-
- {/* Положительное изменение - всегда зеленое */} -
- - +{Math.abs(Math.floor(totals.defectsChange * 0.6))} - + {showAdditionalValues && ( +
+ {/* Положительное изменение - всегда зеленое */} +
+ + +{Math.abs(Math.floor(totals.defectsChange * 0.6))} + +
+ {/* Отрицательное изменение - всегда красное */} +
+ + -{Math.abs(Math.floor(totals.defectsChange * 0.4))} + +
+ {/* Результирующее изменение */} +
+ + {Math.abs(totals.defectsChange)} + +
- {/* Отрицательное изменение - всегда красное */} -
- - -{Math.abs(Math.floor(totals.defectsChange * 0.4))} - -
- {/* Результирующее изменение */} -
- - {Math.abs(totals.defectsChange)} - -
-
+ )}
@@ -608,32 +646,34 @@ export function FulfillmentWarehouseDashboard() {
-
- {/* Положительное изменение - всегда зеленое */} -
- - + - {Math.abs( - Math.floor(totals.sellerSuppliesChange * 0.6) - )} - + {showAdditionalValues && ( +
+ {/* Положительное изменение - всегда зеленое */} +
+ + + + {Math.abs( + Math.floor(totals.sellerSuppliesChange * 0.6) + )} + +
+ {/* Отрицательное изменение - всегда красное */} +
+ + - + {Math.abs( + Math.floor(totals.sellerSuppliesChange * 0.4) + )} + +
+ {/* Результирующее изменение */} +
+ + {Math.abs(totals.sellerSuppliesChange)} + +
- {/* Отрицательное изменение - всегда красное */} -
- - - - {Math.abs( - Math.floor(totals.sellerSuppliesChange * 0.4) - )} - -
- {/* Результирующее изменение */} -
- - {Math.abs(totals.sellerSuppliesChange)} - -
-
+ )}
@@ -659,26 +699,28 @@ export function FulfillmentWarehouseDashboard() {
-
- {/* Положительное изменение - всегда зеленое */} -
- - +{Math.abs(Math.floor(totals.pvzReturnsChange * 0.6))} - + {showAdditionalValues && ( +
+ {/* Положительное изменение - всегда зеленое */} +
+ + +{Math.abs(Math.floor(totals.pvzReturnsChange * 0.6))} + +
+ {/* Отрицательное изменение - всегда красное */} +
+ + -{Math.abs(Math.floor(totals.pvzReturnsChange * 0.4))} + +
+ {/* Результирующее изменение */} +
+ + {Math.abs(totals.pvzReturnsChange)} + +
- {/* Отрицательное изменение - всегда красное */} -
- - -{Math.abs(Math.floor(totals.pvzReturnsChange * 0.4))} - -
- {/* Результирующее изменение */} -
- - {Math.abs(totals.pvzReturnsChange)} - -
-
+ )}
@@ -716,28 +758,34 @@ export function FulfillmentWarehouseDashboard() {
{formatNumber(store.products)}
-
- {/* Положительное изменение - всегда зеленое */} -
- - + - {Math.abs(Math.floor(store.productsChange * 0.6))} - + {showAdditionalValues && ( +
+ {/* Положительное изменение - всегда зеленое */} +
+ + + + {Math.abs( + Math.floor(store.productsChange * 0.6) + )} + +
+ {/* Отрицательное изменение - всегда красное */} +
+ + - + {Math.abs( + Math.floor(store.productsChange * 0.4) + )} + +
+ {/* Результирующее изменение */} +
+ + {Math.abs(store.productsChange)} + +
- {/* Отрицательное изменение - всегда красное */} -
- - - - {Math.abs(Math.floor(store.productsChange * 0.4))} - -
- {/* Результирующее изменение */} -
- - {Math.abs(store.productsChange)} - -
-
+ )}
@@ -746,26 +794,28 @@ export function FulfillmentWarehouseDashboard() {
{formatNumber(store.goods)}
-
- {/* Положительное изменение - всегда зеленое */} -
- - +{Math.abs(Math.floor(store.goodsChange * 0.6))} - + {showAdditionalValues && ( +
+ {/* Положительное изменение - всегда зеленое */} +
+ + +{Math.abs(Math.floor(store.goodsChange * 0.6))} + +
+ {/* Отрицательное изменение - всегда красное */} +
+ + -{Math.abs(Math.floor(store.goodsChange * 0.4))} + +
+ {/* Результирующее изменение */} +
+ + {Math.abs(store.goodsChange)} + +
- {/* Отрицательное изменение - всегда красное */} -
- - -{Math.abs(Math.floor(store.goodsChange * 0.4))} - -
- {/* Результирующее изменение */} -
- - {Math.abs(store.goodsChange)} - -
-
+ )}
@@ -774,26 +824,34 @@ export function FulfillmentWarehouseDashboard() {
{formatNumber(store.defects)}
-
- {/* Положительное изменение - всегда зеленое */} -
- - +{Math.abs(Math.floor(store.defectsChange * 0.6))} - + {showAdditionalValues && ( +
+ {/* Положительное изменение - всегда зеленое */} +
+ + + + {Math.abs( + Math.floor(store.defectsChange * 0.6) + )} + +
+ {/* Отрицательное изменение - всегда красное */} +
+ + - + {Math.abs( + Math.floor(store.defectsChange * 0.4) + )} + +
+ {/* Результирующее изменение */} +
+ + {Math.abs(store.defectsChange)} + +
- {/* Отрицательное изменение - всегда красное */} -
- - -{Math.abs(Math.floor(store.defectsChange * 0.4))} - -
- {/* Результирующее изменение */} -
- - {Math.abs(store.defectsChange)} - -
-
+ )}
@@ -802,32 +860,34 @@ export function FulfillmentWarehouseDashboard() {
{formatNumber(store.sellerSupplies)}
-
- {/* Положительное изменение - всегда зеленое */} -
- - + - {Math.abs( - Math.floor(store.sellerSuppliesChange * 0.6) - )} - + {showAdditionalValues && ( +
+ {/* Положительное изменение - всегда зеленое */} +
+ + + + {Math.abs( + Math.floor(store.sellerSuppliesChange * 0.6) + )} + +
+ {/* Отрицательное изменение - всегда красное */} +
+ + - + {Math.abs( + Math.floor(store.sellerSuppliesChange * 0.4) + )} + +
+ {/* Результирующее изменение */} +
+ + {Math.abs(store.sellerSuppliesChange)} + +
- {/* Отрицательное изменение - всегда красное */} -
- - - - {Math.abs( - Math.floor(store.sellerSuppliesChange * 0.4) - )} - -
- {/* Результирующее изменение */} -
- - {Math.abs(store.sellerSuppliesChange)} - -
-
+ )}
@@ -836,32 +896,34 @@ export function FulfillmentWarehouseDashboard() {
{formatNumber(store.pvzReturns)}
-
- {/* Положительное изменение - всегда зеленое */} -
- - + - {Math.abs( - Math.floor(store.pvzReturnsChange * 0.6) - )} - + {showAdditionalValues && ( +
+ {/* Положительное изменение - всегда зеленое */} +
+ + + + {Math.abs( + Math.floor(store.pvzReturnsChange * 0.6) + )} + +
+ {/* Отрицательное изменение - всегда красное */} +
+ + - + {Math.abs( + Math.floor(store.pvzReturnsChange * 0.4) + )} + +
+ {/* Результирующее изменение */} +
+ + {Math.abs(store.pvzReturnsChange)} + +
- {/* Отрицательное изменение - всегда красное */} -
- - - - {Math.abs( - Math.floor(store.pvzReturnsChange * 0.4) - )} - -
- {/* Результирующее изменение */} -
- - {Math.abs(store.pvzReturnsChange)} - -
-
+ )}
diff --git a/src/components/supplies/fulfillment-supplies/fulfillment-goods-tab.tsx b/src/components/supplies/fulfillment-supplies/fulfillment-goods-tab.tsx index 9f51adc..7702ed8 100644 --- a/src/components/supplies/fulfillment-supplies/fulfillment-goods-tab.tsx +++ b/src/components/supplies/fulfillment-supplies/fulfillment-goods-tab.tsx @@ -2,13 +2,10 @@ import React, { useState } from "react"; import { Card } from "@/components/ui/card"; -import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { StatsCard } from "../ui/stats-card"; import { StatsGrid } from "../ui/stats-grid"; import { - ChevronDown, - ChevronRight, Calendar, Package, MapPin, @@ -371,32 +368,42 @@ export function FulfillmentGoodsTab() { {/* Таблица поставок товаров ФФ */}
- +
- - - - - - - - - - - + + + + @@ -408,43 +415,41 @@ export function FulfillmentGoodsTab() { return ( {/* Основная строка поставки */} - toggleSupplyExpansion(supply.id)} > - - - - - - - - - - - + {/* Развернутые уровни - аналогично оригинальному коду */} @@ -485,47 +490,39 @@ export function FulfillmentGoodsTab() { const isRouteExpanded = expandedRoutes.has(route.id); return ( - - toggleRouteExpansion(route.id)} + > + - - + - - - - - - - + {/* Остальные уровни развертывания аналогично */} @@ -595,73 +592,66 @@ export function FulfillmentGoodsTab() { expandedWholesalers.has(wholesaler.id); return ( - - + toggleWholesalerExpansion(wholesaler.id) + } + > + - - + - - - - - + - + toggleProductExpansion( + product.id + ) + } + > + - - + - - - - - - + {/* Параметры товара */} @@ -792,7 +784,7 @@ export function FulfillmentGoodsTab() { className="p-0" >
-
+

📋 Параметры товара: diff --git a/src/components/supplies/fulfillment-supplies/fulfillment-supplies-tab.tsx b/src/components/supplies/fulfillment-supplies/fulfillment-supplies-tab.tsx index ee04623..34accf4 100644 --- a/src/components/supplies/fulfillment-supplies/fulfillment-supplies-tab.tsx +++ b/src/components/supplies/fulfillment-supplies/fulfillment-supplies-tab.tsx @@ -10,7 +10,9 @@ interface FulfillmentSuppliesTabProps { defaultSubTab?: string; } -export function FulfillmentSuppliesTab({ defaultSubTab }: FulfillmentSuppliesTabProps) { +export function FulfillmentSuppliesTab({ + defaultSubTab, +}: FulfillmentSuppliesTabProps) { const [activeSubTab, setActiveSubTab] = useState("goods"); // Устанавливаем активную подвкладку при получении defaultSubTab @@ -28,24 +30,25 @@ export function FulfillmentSuppliesTab({ defaultSubTab }: FulfillmentSuppliesTab className="w-full h-full flex flex-col overflow-hidden" > {/* Подвкладки для ФФ */} - + Товар Расходники - Возвраты с ПВЗ + Возвраты с ПВЗ + Возвраты diff --git a/src/components/supplies/fulfillment-supplies/real-supply-orders-tab.tsx b/src/components/supplies/fulfillment-supplies/real-supply-orders-tab.tsx index 93ad62d..f72ccf5 100644 --- a/src/components/supplies/fulfillment-supplies/real-supply-orders-tab.tsx +++ b/src/components/supplies/fulfillment-supplies/real-supply-orders-tab.tsx @@ -15,8 +15,6 @@ import { DollarSign, Wrench, Package2, - ChevronDown, - ChevronRight, } from "lucide-react"; interface SupplyOrderItem { @@ -214,7 +212,7 @@ export function RealSupplyOrdersTab() { Пока нет заказов расходников

- Создайте первый заказ расходников через кнопку "Создать поставку" + Создайте первый заказ расходников через кнопку "Создать поставку"

@@ -257,16 +255,9 @@ export function RealSupplyOrdersTab() { onClick={() => toggleOrderExpansion(order.id)} >
- toggleRouteExpansion(route.id)} + > + - + toggleWarehouseExpansion(warehouse.id) + } + > + - toggleRouteExpansion(route.id)} + > + - + toggleWarehouseExpansion(warehouse.id) + } + > +
- Дата поставки + + № - Дата создания + + Дата поставки + Поставка ПланФактБрак - Цена товаров + + Создана - Услуги ФФ + + План - Логистика до ФФ + + Факт - Итого сумма + + Брак + + Цена товаров + Цена + + ФФ + + Логистика + + Итого + Статус
-
- - {supply.number} - -
+
+ + {supply.number} + -
- - +
+
+ + {formatDate(supply.deliveryDate)}
- + + {formatDate(supply.createdDate)} - + + {supply.plannedTotal} - + + {supply.actualTotal} + 0 ? "text-red-400" : "text-white" @@ -453,30 +458,30 @@ export function FulfillmentGoodsTab() { {supply.defectTotal} - + + {formatCurrency(supply.totalProductPrice)} - + + {formatCurrency(supply.totalFulfillmentPrice)} - + + {formatCurrency(supply.totalLogisticsPrice)} -
- - +
+
+ + {formatCurrency(supply.grandTotal)}
{getStatusBadge(supply.status)}{getStatusBadge(supply.status)}
+
- - - +
+ + Маршрут
+
+
- + {route.from} - + {route.to}
-
+
{route.fromAddress} → {route.toAddress}
- + + {route.wholesalers.reduce( (sum, w) => sum + @@ -537,8 +534,8 @@ export function FulfillmentGoodsTab() { )} - + + {route.wholesalers.reduce( (sum, w) => sum + @@ -550,8 +547,8 @@ export function FulfillmentGoodsTab() { )} - + + {route.wholesalers.reduce( (sum, w) => sum + @@ -563,29 +560,29 @@ export function FulfillmentGoodsTab() { )} - + + {formatCurrency(route.totalProductPrice)} - + + {formatCurrency( route.fulfillmentServicePrice )} - + + {formatCurrency(route.logisticsPrice)} - + + {formatCurrency(route.totalAmount)}
+
- - - +
+
+ + Оптовик
+
+
-
+
{wholesaler.name}
-
+
ИНН: {wholesaler.inn}
-
+
{wholesaler.address}
-
+
{wholesaler.contact}
- + + {wholesaler.products.reduce( (sum, p) => sum + p.plannedQty, 0 )} - + + {wholesaler.products.reduce( (sum, p) => sum + p.actualQty, 0 )} - + + {wholesaler.products.reduce( (sum, p) => sum + p.defectQty, 0 )} - + + {formatCurrency( wholesaler.products.reduce( (sum, p) => @@ -671,9 +661,12 @@ export function FulfillmentGoodsTab() { )} - + + {formatCurrency( wholesaler.totalAmount )} @@ -689,57 +682,53 @@ export function FulfillmentGoodsTab() { expandedProducts.has(product.id); return ( -
+
- - - +
+
+
+ + Товар
+
+
-
+
{product.name}
-
+
Артикул: {product.sku}
- + {product.category}
- + + {product.plannedQty} - + + {product.actualQty} + 0 ? "text-red-400" : "text-white" @@ -748,16 +737,16 @@ export function FulfillmentGoodsTab() { {product.defectQty} +
-
+
{formatCurrency( calculateProductTotal( product ) )}
-
+
{formatCurrency( product.productPrice )}{" "} @@ -765,15 +754,18 @@ export function FulfillmentGoodsTab() {
+ {getEfficiencyBadge( product.plannedQty, product.actualQty, product.defectQty )} - + + {formatCurrency( calculateProductTotal( product @@ -781,7 +773,7 @@ export function FulfillmentGoodsTab() { )}
-
- {isOrderExpanded ? ( - - ) : ( - - )} - - {order.id.slice(-8)} - -
+ + {order.id.slice(-8)} +
diff --git a/src/components/supplies/marketplace-supplies/ozon-supplies-tab.tsx b/src/components/supplies/marketplace-supplies/ozon-supplies-tab.tsx index 25c2349..e8c5c2b 100644 --- a/src/components/supplies/marketplace-supplies/ozon-supplies-tab.tsx +++ b/src/components/supplies/marketplace-supplies/ozon-supplies-tab.tsx @@ -2,13 +2,10 @@ import React, { useState } from "react"; import { Card } from "@/components/ui/card"; -import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { StatsCard } from "../ui/stats-card"; import { StatsGrid } from "../ui/stats-grid"; import { - ChevronDown, - ChevronRight, Calendar, Package, MapPin, @@ -481,23 +478,12 @@ export function OzonSuppliesTab() { const isRouteExpanded = expandedRoutes.has(route.id); return ( -
+
- Маршрут @@ -584,25 +570,14 @@ export function OzonSuppliesTab() { expandedWarehouses.has(warehouse.id); return ( -
+
- Склад Ozon @@ -675,7 +650,7 @@ export function OzonSuppliesTab() { key={product.id} className="border-b border-white/10 hover:bg-white/5 transition-colors bg-teal-500/10" > -
+
diff --git a/src/components/supplies/marketplace-supplies/wildberries-supplies-tab.tsx b/src/components/supplies/marketplace-supplies/wildberries-supplies-tab.tsx index 6868f7f..28fc77e 100644 --- a/src/components/supplies/marketplace-supplies/wildberries-supplies-tab.tsx +++ b/src/components/supplies/marketplace-supplies/wildberries-supplies-tab.tsx @@ -2,13 +2,10 @@ import React, { useState } from "react"; import { Card } from "@/components/ui/card"; -import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { StatsCard } from "../ui/stats-card"; import { StatsGrid } from "../ui/stats-grid"; import { - ChevronDown, - ChevronRight, Calendar, Package, MapPin, @@ -481,23 +478,12 @@ export function WildberriesSuppliesTab() { const isRouteExpanded = expandedRoutes.has(route.id); return ( -
+
- Маршрут @@ -584,25 +570,14 @@ export function WildberriesSuppliesTab() { expandedWarehouses.has(warehouse.id); return ( -
+
- Склад WB @@ -675,7 +650,7 @@ export function WildberriesSuppliesTab() { key={product.id} className="border-b border-white/10 hover:bg-white/5 transition-colors bg-yellow-500/10" > -
+
diff --git a/src/components/supplies/supplies-dashboard.tsx b/src/components/supplies/supplies-dashboard.tsx index 2a39038..952085c 100644 --- a/src/components/supplies/supplies-dashboard.tsx +++ b/src/components/supplies/supplies-dashboard.tsx @@ -23,9 +23,9 @@ export function SuppliesDashboard() { // Автоматически открываем нужную вкладку при загрузке useEffect(() => { - const tab = searchParams.get('tab'); - if (tab === 'consumables') { - setActiveTab('fulfillment'); // Устанавливаем основную вкладку "Поставки на ФФ" + const tab = searchParams.get("tab"); + if (tab === "consumables") { + setActiveTab("fulfillment"); // Устанавливаем основную вкладку "Поставки на ФФ" } }, [searchParams]); @@ -33,7 +33,7 @@ export function SuppliesDashboard() {
{/* Главные вкладки с кнопкой создания */} @@ -42,28 +42,34 @@ export function SuppliesDashboard() { onValueChange={setActiveTab} className="w-full h-full flex flex-col" > -
- +
+ - Поставки на ФФ + Поставки на ФФ + ФФ - Поставки на Маркетплейсы + Поставки на Маркетплейсы + МП -
- - + + - + diff --git a/src/components/supplies/ui/stats-card.tsx b/src/components/supplies/ui/stats-card.tsx index 0417fbc..9d51752 100644 --- a/src/components/supplies/ui/stats-card.tsx +++ b/src/components/supplies/ui/stats-card.tsx @@ -32,27 +32,29 @@ export function StatsCard({ return (
-
-
- +
+
+

{title}

{value}

{subtitle && ( -

{subtitle}

+

+ {subtitle} +

)}
@@ -60,7 +62,7 @@ export function StatsCard({ {trend && (