From d2b4164d7d1a12e86432e6f76153cfc6986e7eed Mon Sep 17 00:00:00 2001 From: Bivekich Date: Thu, 7 Aug 2025 00:00:55 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85?= =?UTF-8?q?=20WB=20=D1=81=D0=BA=D0=BB=D0=B0=D0=B4=D0=BE=D0=B2=20=D0=B8=20?= =?UTF-8?q?=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80=D0=B0=20=D0=B8?= =?UTF-8?q?=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Исправлен парсинг данных WB API: данные теперь извлекаются из analytics.data.regions вместо analytics.regions - Обновлена логика сохранения аналитических данных в кеш (analyticsResults вместо пустого analyticsData) - Улучшена обработка кеша: добавлены детальные логи и проверки валидности данных - Переработана структура интерфейса WildberriesWarehouseTab: убран дебаг блок с JSON, исправлены проблемы с высотой и скроллингом - Установлена максимальная высота таблицы (60vh) с вертикальным скроллом - Упрощена flex-структура компонентов для корректного отображения 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../wb-warehouse/wb-warehouse-dashboard.tsx | 99 +++++++++++++------ .../wildberries-warehouse-tab.tsx | 48 +++------ 2 files changed, 82 insertions(+), 65 deletions(-) diff --git a/src/components/wb-warehouse/wb-warehouse-dashboard.tsx b/src/components/wb-warehouse/wb-warehouse-dashboard.tsx index bb1f8ef..a322f95 100644 --- a/src/components/wb-warehouse/wb-warehouse-dashboard.tsx +++ b/src/components/wb-warehouse/wb-warehouse-dashboard.tsx @@ -78,7 +78,8 @@ export function WBWarehouseDashboard() { refetch: refetchCache, } = useQuery(GET_WB_WAREHOUSE_DATA, { skip: !hasWBApiKey, - fetchPolicy: 'cache-and-network', + fetchPolicy: 'no-cache', // Всегда получаем свежие данные с сервера + errorPolicy: 'all', }) const [saveCache] = useMutation(SAVE_WB_WAREHOUSE_CACHE) @@ -112,18 +113,23 @@ export function WBWarehouseDashboard() { // Получаем аналитические данные для данного nmId const analytics = analyticsMap.get(card.nmID) - if (analytics && Array.isArray(analytics)) { - analytics.forEach((item: any) => { - if (item.stocks && Array.isArray(item.stocks)) { - item.stocks.forEach((stockItem: any) => { - stock.stocks.push({ - warehouseId: stockItem.warehouseId || 0, - warehouseName: String(stockItem.warehouseName || 'Неизвестный склад'), - quantity: Number(stockItem.quantity) || 0, - quantityFull: Number(stockItem.quantityFull) || 0, - inWayToClient: Number(stockItem.inWayToClient) || 0, - inWayFromClient: Number(stockItem.inWayFromClient) || 0, - }) + const regionsData = analytics?.data?.regions || analytics?.regions + + if (analytics && regionsData && Array.isArray(regionsData)) { + // Парсим новый формат данных: regions -> offices -> metrics + regionsData.forEach((region: any) => { + if (region.offices && Array.isArray(region.offices)) { + region.offices.forEach((office: any) => { + if (office.metrics) { + stock.stocks.push({ + warehouseId: office.officeID || 0, + warehouseName: String(office.officeName || 'Неизвестный склад'), + quantity: Number(office.metrics.stockCount) || 0, + quantityFull: Number(office.metrics.stockCount) || 0, + inWayToClient: Number(office.metrics.toClientCount) || 0, + inWayFromClient: Number(office.metrics.fromClientCount) || 0, + }) + } }) } }) @@ -182,20 +188,34 @@ export function WBWarehouseDashboard() { // Загрузка данных из кеша const loadWarehouseDataFromCache = (cacheData: any) => { try { - const parsedData = typeof cacheData.data === 'string' ? JSON.parse(cacheData.data) : cacheData.data + console.warn('WB Warehouse: Loading from cache, cacheData:', { + hasData: !!cacheData?.data, + totalProducts: cacheData?.totalProducts, + totalStocks: cacheData?.totalStocks, + dataType: typeof cacheData?.data, + }) - const cachedStocks = parsedData.stocks || [] - const cachedWarehouses = parsedData.warehouses || [] - const cachedAnalytics = parsedData.analyticsData || [] + const parsedData = typeof cacheData.data === 'string' ? JSON.parse(cacheData.data) : cacheData.data + + console.warn('WB Warehouse: Parsed cache data:', { + hasStocks: !!parsedData?.stocks, + stocksLength: parsedData?.stocks?.length || 0, + hasWarehouses: !!parsedData?.warehouses, + warehousesLength: parsedData?.warehouses?.length || 0, + }) + + const cachedStocks = parsedData?.stocks || [] + const cachedWarehouses = parsedData?.warehouses || [] + const cachedAnalytics = parsedData?.analyticsData || [] setStocks(cachedStocks) setWarehouses(cachedWarehouses) setAnalyticsData(cachedAnalytics) // Обновляем статистику из кеша - setTotalProducts(cacheData.totalProducts) - setTotalStocks(cacheData.totalStocks) - setTotalReserved(cacheData.totalReserved) + setTotalProducts(cacheData.totalProducts || 0) + setTotalStocks(cacheData.totalStocks || 0) + setTotalReserved(cacheData.totalReserved || 0) const totalFromClientCount = (cachedStocks || []).reduce( (sum: number, item: WBStock) => @@ -210,9 +230,17 @@ export function WBWarehouseDashboard() { setActiveWarehouses(warehousesWithStock.size) console.warn('WB Warehouse: Data loaded from cache:', cachedStocks?.length || 0, 'items') - toast.success(`Загружено из кеша: ${cachedStocks?.length || 0} товаров`) + + if (cachedStocks?.length > 0) { + toast.success(`Загружено из кеша: ${cachedStocks.length} товаров`) + } else { + console.warn('WB Warehouse: Cache is empty, will try to load from API') + toast.info('Кеш пуст, загружаем данные из API...') + loadWarehouseDataFromAPI() + return + } } catch (error) { - console.error('WB Warehouse: Error parsing cache data:', error) + console.error('WB Warehouse: Error parsing cache data:', error, 'cacheData:', cacheData) toast.error('Ошибка загрузки данных из кеша') // Если кеш поврежден, загружаем из API loadWarehouseDataFromAPI() @@ -300,7 +328,7 @@ export function WBWarehouseDashboard() { data: JSON.stringify({ stocks: combinedStocks, warehouses: extractedWarehouses, - analyticsData: analyticsData, + analyticsData: analyticsResults, }), totalProducts: stats.totalProducts, totalStocks: stats.totalStocks, @@ -335,17 +363,30 @@ export function WBWarehouseDashboard() { return } - // Сначала пытаемся получить данные из кеша + // Получаем данные (либо из кеша, либо загружаем из API если кеш устарел) try { + console.warn('WB Warehouse: Starting data load, hasWBApiKey:', hasWBApiKey) const result = await refetchCache() const cacheResponse = result.data?.getWBWarehouseData + + console.warn('WB Warehouse: Cache response:', { + success: cacheResponse?.success, + fromCache: cacheResponse?.fromCache, + hasCache: !!cacheResponse?.cache, + message: cacheResponse?.message, + }) - if (cacheResponse?.success && cacheResponse?.fromCache && cacheResponse?.cache) { - // Данные найдены в кеше + if (cacheResponse?.success && cacheResponse?.fromCache === true && cacheResponse?.cache) { + // Данные найдены в актуальном кеше + console.warn('WB Warehouse: Using fresh cache data') loadWarehouseDataFromCache(cacheResponse.cache) + } else if (cacheResponse?.success && cacheResponse?.fromCache === false) { + // Кеш устарел или отсутствует, загружаем из API + console.warn('WB Warehouse: Cache expired/missing, loading from API:', cacheResponse.message) + await loadWarehouseDataFromAPI() } else { - // Кеша нет или он устарел, загружаем из API - console.warn('WB Warehouse: No cache found, loading from API') + // Ошибка при получении кеша + console.warn('WB Warehouse: Cache check failed, loading from API. Response:', cacheResponse) await loadWarehouseDataFromAPI() } } catch (error) { @@ -390,7 +431,7 @@ export function WBWarehouseDashboard() { -
+
diff --git a/src/components/wb-warehouse/wildberries-warehouse-tab.tsx b/src/components/wb-warehouse/wildberries-warehouse-tab.tsx index 205a3d4..3804687 100644 --- a/src/components/wb-warehouse/wildberries-warehouse-tab.tsx +++ b/src/components/wb-warehouse/wildberries-warehouse-tab.tsx @@ -97,7 +97,7 @@ export function WildberriesWarehouseTab({ } return ( -
+
{/* Статистика */} - {/* Аналитика по складам WB */} - {initialized && analyticsData.length > 0 && ( - -

- - Аналитика по складам WB -

-
- {analyticsData.slice(0, 6).map((item, index) => ( -
-
Склад {index + 1}
-
- {JSON.stringify(item).length > 50 - ? `${JSON.stringify(item).substring(0, 50)}...` - : JSON.stringify(item)} -
-
- ))} -
-
- )} - {/* Основной контент */} - -
+ +

@@ -155,13 +133,13 @@ export function WildberriesWarehouseTab({

{/* Контент с таблицей */} -
+
{!initialized || loading || cacheLoading ? (
) : filteredStocks.length === 0 ? ( -
+

{searchTerm ? 'Товары не найдены' : 'Нет данных о товарах'}

@@ -173,16 +151,14 @@ export function WildberriesWarehouseTab({
) : ( -
-
- {/* Заголовок таблицы */} - +
+ {/* Заголовок таблицы */} + - {/* Строки товаров */} - {filteredStocks.map((item) => ( - - ))} -
+ {/* Строки товаров */} + {filteredStocks.map((item) => ( + + ))}
)}