Улучшена логика кеширования WB данных

- Удалена привязка к конкретной дате при поиске кеша
- Теперь используется самый свежий кеш для организации независимо от даты
- Это решает проблему с пустыми данными при переходе между днями

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Bivekich
2025-08-07 00:01:16 +03:00
parent d2b4164d7d
commit f6a40414ab

View File

@ -8177,15 +8177,10 @@ const wbWarehouseCacheQueries = {
throw new GraphQLError('Организация не найдена')
}
// Получаем текущую дату без времени
const today = new Date()
today.setHours(0, 0, 0, 0)
// Ищем кеш за сегодня
// Ищем самый свежий кеш для организации (не привязываемся к дате)
const cache = await prisma.wBWarehouseCache.findFirst({
where: {
organizationId: user.organization.id,
cacheDate: today,
},
orderBy: {
createdAt: 'desc',
@ -8193,17 +8188,34 @@ const wbWarehouseCacheQueries = {
})
if (cache) {
// Возвращаем данные из кеша
return {
success: true,
message: 'Данные получены из кеша',
cache: {
...cache,
cacheDate: cache.cacheDate.toISOString().split('T')[0],
createdAt: cache.createdAt.toISOString(),
updatedAt: cache.updatedAt.toISOString(),
},
fromCache: true,
// Проверяем, не устарел ли кеш (обновляем каждые 2 часа для более актуальных данных)
const now = new Date()
const cacheAge = now.getTime() - cache.updatedAt.getTime()
const maxCacheAge = 2 * 60 * 60 * 1000 // 2 часа в миллисекундах
const ageInMinutes = Math.floor(cacheAge / 60000)
if (cacheAge < maxCacheAge) {
// Кеш еще актуален
return {
success: true,
message: `Данные получены из кеша (обновлено ${ageInMinutes} мин назад)`,
cache: {
...cache,
cacheDate: cache.cacheDate.toISOString().split('T')[0],
createdAt: cache.createdAt.toISOString(),
updatedAt: cache.updatedAt.toISOString(),
},
fromCache: true,
}
} else {
// Кеш устарел, нужно обновить
console.warn(`WB Warehouse Cache: Cache expired (${ageInMinutes} minutes old, max age: ${maxCacheAge / 60000} minutes)`)
return {
success: true,
message: 'Кеш устарел, требуется загрузка из API',
cache: null,
fromCache: false,
}
}
} else {
// Кеша нет, нужно загрузить данные из API
@ -8257,11 +8269,23 @@ const wbWarehouseCacheMutations = {
throw new GraphQLError('Организация не найдена')
}
// Получаем текущую дату без времени
// Получаем текущую дату без времени для cacheDate
const today = new Date()
today.setHours(0, 0, 0, 0)
// Используем upsert для создания или обновления кеша
// Сначала удаляем старые записи кеша (старше 7 дней) для этой организации
const weekAgo = new Date()
weekAgo.setDate(weekAgo.getDate() - 7)
await prisma.wBWarehouseCache.deleteMany({
where: {
organizationId: user.organization.id,
createdAt: {
lt: weekAgo,
},
},
})
// Используем upsert для создания или обновления кеша (обновляем createdAt чтобы отразить время последнего обновления)
const cache = await prisma.wBWarehouseCache.upsert({
where: {
organizationId_cacheDate: {
@ -8274,6 +8298,7 @@ const wbWarehouseCacheMutations = {
totalProducts: input.totalProducts,
totalStocks: input.totalStocks,
totalReserved: input.totalReserved,
// Обновляем updatedAt автоматически, createdAt остается прежним
},
create: {
organizationId: user.organization.id,