From aabf909c6147b008a52210b50369de82d41cbd2a Mon Sep 17 00:00:00 2001 From: shaw Date: Sat, 13 Sep 2025 22:24:56 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E9=99=90=E6=B5=81?= =?UTF-8?q?=E5=90=8E=E6=9C=AA=E8=87=AA=E5=8A=A8=E6=81=A2=E5=A4=8D=E8=B0=83?= =?UTF-8?q?=E5=BA=A6=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/claudeAccountService.js | 14 ++++++++++---- src/services/rateLimitCleanupService.js | 12 +++++++++--- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/services/claudeAccountService.js b/src/services/claudeAccountService.js index 008f13e7..94454200 100644 --- a/src/services/claudeAccountService.js +++ b/src/services/claudeAccountService.js @@ -1200,6 +1200,9 @@ class ClaudeAccountService { accountData.schedulable = 'true' delete accountData.rateLimitAutoStopped logger.info(`✅ Auto-resuming scheduling for account ${accountId} after rate limit cleared`) + logger.info(`📊 Account ${accountId} state after recovery: schedulable=${accountData.schedulable}`) + } else { + logger.info(`ℹ️ Account ${accountId} did not need auto-resume: autoStopped=${accountData.rateLimitAutoStopped}, schedulable=${accountData.schedulable}`) } await redis.setClaudeAccount(accountId, accountData) @@ -1220,10 +1223,13 @@ class ClaudeAccountService { return false } - // 检查是否有限流状态 - if (accountData.rateLimitStatus === 'limited' && accountData.rateLimitedAt) { - const now = new Date() + const now = new Date() + // 检查是否有限流状态(包括字段缺失但有自动停止标记的情况) + if ( + (accountData.rateLimitStatus === 'limited' && accountData.rateLimitedAt) || + (accountData.rateLimitAutoStopped === 'true' && accountData.rateLimitEndAt) + ) { // 优先使用 rateLimitEndAt(基于会话窗口) if (accountData.rateLimitEndAt) { const rateLimitEndAt = new Date(accountData.rateLimitEndAt) @@ -1235,7 +1241,7 @@ class ClaudeAccountService { } return true - } else { + } else if (accountData.rateLimitedAt) { // 兼容旧数据:使用1小时限流 const rateLimitedAt = new Date(accountData.rateLimitedAt) const hoursSinceRateLimit = (now - rateLimitedAt) / (1000 * 60 * 60) diff --git a/src/services/rateLimitCleanupService.js b/src/services/rateLimitCleanupService.js index 9423331b..b5f2325f 100644 --- a/src/services/rateLimitCleanupService.js +++ b/src/services/rateLimitCleanupService.js @@ -180,11 +180,17 @@ class RateLimitCleanupService { */ async cleanupClaudeAccounts(result) { try { - const accounts = await claudeAccountService.getAllAccounts() + // 使用原始数据而不是处理过的数据,避免字段被转换 + const redis = require('../models/redis') + const accounts = await redis.getAllClaudeAccounts() for (const account of accounts) { - // 只检查标记为限流的账号 - if (account.rateLimitStatus === 'limited' || account.rateLimitedAt) { + // 检查所有可能处于限流状态的账号,包括自动停止的账号 + if ( + account.rateLimitStatus === 'limited' || + account.rateLimitedAt || + account.rateLimitAutoStopped === 'true' + ) { result.checked++ try {