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

This commit is contained in:
Bivekich
2025-07-24 11:52:48 +03:00
parent a53f8b404b
commit 01704d7b20
2 changed files with 737 additions and 485 deletions

View File

@ -1168,7 +1168,7 @@ class WildberriesService {
dateFrom?: string
dateTo?: string
stockType?: '' | 'wb' | 'mp'
} = {}): Promise<WBStock[]> {
} = {}): Promise<StocksReportOfficesResponse> {
try {
console.log('WB Analytics API: Getting stocks report by offices...')
@ -1210,137 +1210,53 @@ class WildberriesService {
})
console.log('WB Analytics API: Response:', JSON.stringify(response, null, 2))
// Детальный анализ структуры ответа
console.log('\n=== ДЕТАЛЬНЫЙ АНАЛИЗ ОТВЕТА API ===')
if (response.data) {
console.log('✅ response.data существует')
if (response.data.regions) {
console.log('✅ response.data.regions существует, длина:', response.data.regions.length)
response.data.regions.forEach((region, regionIndex) => {
console.log(`\n📍 РЕГИОН ${regionIndex + 1}:`)
console.log(' - regionName:', region.regionName)
console.log(' - metrics:', region.metrics)
console.log(' - offices.length:', region.offices?.length || 0)
if (region.offices && region.offices.length > 0) {
region.offices.forEach((office, officeIndex) => {
console.log(`\n 🏢 СКЛАД ${officeIndex + 1}:`)
console.log(' - officeID:', office.officeID)
console.log(' - officeName:', office.officeName)
console.log(' - metrics:', office.metrics)
// Проверяем наличие метрик
if (office.metrics) {
console.log(' - stockCount:', office.metrics.stockCount || 0)
console.log(' - toClientCount:', office.metrics.toClientCount || 0)
console.log(' - fromClientCount:', office.metrics.fromClientCount || 0)
}
})
} else {
console.log(' ⚠️ Нет складов в этом регионе')
}
})
} else {
console.log('❌ response.data.regions отсутствует')
}
} else {
console.log('❌ response.data отсутствует')
}
console.log('=== КОНЕЦ АНАЛИЗА ===\n')
console.log('WB Analytics API: Processing response data...')
// Преобразуем данные Analytics API в формат WBStock
const stocks: WBStock[] = []
if (response.data?.regions) {
console.log(`WB Analytics API: Found ${response.data.regions.length} regions`)
// Получаем карточки товаров и остатки для сопоставления
console.log('WB Analytics API: Loading cards and current stocks for matching...')
const [cards, currentStocks] = await Promise.all([
WildberriesService.getAllCards(this.apiKey).catch(() => []),
this.getStocks().catch(() => [])
])
console.log(`WB Analytics API: Loaded ${cards.length} cards and ${currentStocks.length} stock records`)
const cardsMap = new Map(cards.map((card: WildberriesCard) => [card.nmID, card]))
// Создаем карту остатков по складам из текущих данных
const stocksByWarehouse = new Map<number, Record<string, unknown>[]>()
const typedCurrentStocks = currentStocks as Record<string, unknown>[]
typedCurrentStocks.forEach((stock: Record<string, unknown>) => {
const warehouseId = Number(stock.warehouseId || stock.warehouse) || 0
if (!stocksByWarehouse.has(warehouseId)) {
stocksByWarehouse.set(warehouseId, [])
}
stocksByWarehouse.get(warehouseId)!.push(stock)
})
response.data.regions.forEach(region => {
console.log(`WB Analytics API: Processing region "${region.regionName}" with ${region.offices.length} offices`)
region.offices.forEach(office => {
console.log(`WB Analytics API: Processing office "${office.officeName}" (ID: ${office.officeID})`)
console.log(`WB Analytics API: Office metrics:`, office.metrics)
// Получаем товары для этого склада WB
const warehouseStocks = stocksByWarehouse.get(office.officeID) || []
console.log(`WB Analytics API: Found ${warehouseStocks.length} stock records for warehouse ${office.officeID}`)
// Создаем записи для каждого товара на этом складе WB
// Если нет конкретных остатков, создаем на основе карточек товаров
if (warehouseStocks.length > 0) {
// Группируем по nmId
const stocksByNmId = new Map<number, Record<string, unknown>[]>()
warehouseStocks.forEach((stock: Record<string, unknown>) => {
const nmId = Number(stock.nmId) || 0
if (nmId > 0) {
if (!stocksByNmId.has(nmId)) {
stocksByNmId.set(nmId, [])
}
stocksByNmId.get(nmId)!.push(stock)
}
})
// Создаем записи для каждого товара
stocksByNmId.forEach((stockItems, nmId) => {
const firstStock = stockItems[0]
const card = cardsMap.get(nmId)
const stock: WBStock = {
nmId,
vendorCode: String(firstStock.vendorCode || firstStock.supplierArticle || ''),
title: String(firstStock.title || firstStock.subject || card?.title || `Товар ${nmId}`),
brand: String(firstStock.brand || card?.brand || ''),
price: Number(firstStock.price || firstStock.Price) || 0,
stocks: [{
warehouseId: office.officeID,
warehouseName: office.officeName,
quantity: Number(firstStock.quantity) || 0,
quantityFull: Number(firstStock.quantityFull) || 0,
inWayToClient: office.metrics.toClientCount, // Берем из Analytics API
inWayFromClient: office.metrics.fromClientCount // Берем из Analytics API
}],
totalQuantity: Number(firstStock.quantity) || 0,
totalReserved: office.metrics.toClientCount,
photos: Array.isArray(firstStock.photos) ? firstStock.photos : (card?.photos || []),
mediaFiles: Array.isArray(firstStock.mediaFiles) ? firstStock.mediaFiles : [],
characteristics: Array.isArray(firstStock.characteristics) ? firstStock.characteristics : (card?.characteristics || []),
subjectName: String(firstStock.subjectName || firstStock.subject || card?.subjectName || ''),
description: String(firstStock.description || card?.description || '')
}
stocks.push(stock)
})
} else {
console.log(`WB Analytics API: No stock records found for warehouse ${office.officeID}, creating entries for each product`)
// Создаем записи для каждого товара на этом складе WB
// Даже если нет точных остатков, показываем движение товаров
cardsMap.forEach((card, nmId) => {
const stock: WBStock = {
nmId,
vendorCode: String(card.vendorCode || ''),
title: String(card.title || `Товар ${nmId}`),
brand: String(card.brand || ''),
price: 0, // У карточки нет цены, используем 0
stocks: [{
warehouseId: office.officeID,
warehouseName: office.officeName,
quantity: office.metrics.stockCount, // Общее количество на складе
quantityFull: office.metrics.stockCount,
inWayToClient: office.metrics.toClientCount, // К клиенту
inWayFromClient: office.metrics.fromClientCount // От клиента
}],
totalQuantity: office.metrics.stockCount,
totalReserved: office.metrics.toClientCount,
photos: Array.isArray(card.photos) ? card.photos : [],
mediaFiles: Array.isArray(card.mediaFiles) ? card.mediaFiles : [],
characteristics: Array.isArray(card.characteristics) ? card.characteristics : [],
subjectName: String(card.subjectName || region.regionName),
description: String(card.description || `Регион: ${region.regionName}, Склад: ${office.officeName}`)
}
stocks.push(stock)
})
}
})
})
} else {
console.log('WB Analytics API: No regions data in response')
}
console.log(`WB Analytics API: Processed ${stocks.length} stock records`)
return stocks
console.log(`WB Analytics API: Returning raw response for processing in component`)
return response
} catch (error) {
console.error('WB Analytics API: Error getting stocks report:', error)
return []
return { data: { regions: [] } }
}
}