feat: 同IP默认账号配额改为 primaryCount × 2

- 动态计算该类型默认账号数量 primaryCount
- 前 primaryCount × 2 次在同IP的两个默认账号间轮询
- 超限后再去其他非默认账号
- 无默认账号时 threshold=0, 直接走轮询
This commit is contained in:
2026-05-15 06:51:15 +08:00
parent 37aa05b1e1
commit b7702d0285

View File

@@ -456,8 +456,15 @@ export async function getAndValidateCredential(cloudType: string, ipAddress?: st
const ipTodayCount = ipCountRow?.total || 0; const ipTodayCount = ipCountRow?.total || 0;
if (ipTodayCount < 3) { // How many primary accounts does this cloud type have?
// First 2 saves — use a primary account (is_primary=1), fallback to any healthy const primaryCountRow = db.prepare(
`SELECT COUNT(*) as c FROM cloud_configs WHERE cloud_type = ? AND is_primary = 1 AND is_active = 1`
).get(cloudType) as { c: number };
const primaryCount = primaryCountRow?.c || 0;
const primaryThreshold = primaryCount * 2; // Each primary account gets 2 uses per IP
if (ipTodayCount < primaryThreshold) {
// First N saves (primaryCount × 2) — use primary accounts (is_primary=1), fallback to any healthy
config = db.prepare( config = db.prepare(
`SELECT * FROM cloud_configs `SELECT * FROM cloud_configs
WHERE cloud_type = ? AND is_active = 1 WHERE cloud_type = ? AND is_active = 1
@@ -466,7 +473,7 @@ export async function getAndValidateCredential(cloudType: string, ipAddress?: st
LIMIT 1` LIMIT 1`
).get(cloudType) as CloudConfig | undefined; ).get(cloudType) as CloudConfig | undefined;
} else { } else {
// 3rd+ save — exclude accounts this IP has already used today, // After primary threshold — exclude accounts this IP has already used today,
// fall back to other available accounts round-robin // fall back to other available accounts round-robin
const usedConfigIds = db.prepare( const usedConfigIds = db.prepare(
`SELECT DISTINCT config_id FROM ip_daily_save_counts `SELECT DISTINCT config_id FROM ip_daily_save_counts