Добавлен новый статус для отслеживания товаров, находящихся в пути от клиента. Обновлен компонент WBWarehouseDashboard для отображения статистики по товарам и улучшения логики обработки данных. Оптимизирована интеграция с API Wildberries, включая детальный анализ ответов и обработку ошибок. Обновлены стили и структура кода для повышения удобства использования.
This commit is contained in:
@ -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: [] } }
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user