From f6a40414ab8bd3e587346e4622b215d74d868aab Mon Sep 17 00:00:00 2001 From: Bivekich Date: Thu, 7 Aug 2025 00:01:16 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA=D0=B0=20=D0=BA=D0=B5?= =?UTF-8?q?=D1=88=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20WB=20?= =?UTF-8?q?=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Удалена привязка к конкретной дате при поиске кеша - Теперь используется самый свежий кеш для организации независимо от даты - Это решает проблему с пустыми данными при переходе между днями 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- src/graphql/resolvers.ts | 63 ++++++++++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 19 deletions(-) diff --git a/src/graphql/resolvers.ts b/src/graphql/resolvers.ts index eb4294b..a34d7c5 100644 --- a/src/graphql/resolvers.ts +++ b/src/graphql/resolvers.ts @@ -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,