From e19a8d630b821c3a1248c4c4223087df0f8f32bf Mon Sep 17 00:00:00 2001 From: Alexey Pavlov Date: Tue, 30 Jun 2026 08:31:18 +0300 Subject: [PATCH] =?UTF-8?q?fix(auto-approve):=20=D0=BF=D1=83=D0=B1=D0=BB?= =?UTF-8?q?=D0=B8=D0=BA=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20=D1=87=D0=B5=D1=80?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=B8=D0=BA=D0=B8=20=D1=81=D1=82=D0=B0=D1=80?= =?UTF-8?q?=D1=88=D0=B5=20=D1=81=D0=B5=D0=B3=D0=BE=D0=B4=D0=BD=D1=8F=D1=88?= =?UTF-8?q?=D0=BD=D0=B8=D1=85=2007:00=20=D0=9C=D0=A1=D0=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Раньше правило было '< CURRENT_DATE' — черновики, созданные ночью после полуночи, считались сегодняшними и ждали лишние сутки (не публиковались на ближайшем 07:00). Теперь граница — сегодняшние 07:00 МСК: ночные и вечерние (17:00) попадают, дневная свежая партия — нет. Также пофикшен catch-up: вызывал несуществующий runAutoApprove() вместо runDraftAutoApprove(). --- draftAutoApprove.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/draftAutoApprove.js b/draftAutoApprove.js index 57b954c..78228b4 100644 --- a/draftAutoApprove.js +++ b/draftAutoApprove.js @@ -43,16 +43,16 @@ async function getTodaySlots() { async function runDraftAutoApprove() { try { - // Берём самые СТАРЫЕ черновики, созданные НЕ сегодня (по МСК). - // Раньше окно было «строго вчера» + LIMIT 4 — поэтому всё, что не одобрили - // на следующий день (дубли, излишки), оставалось в draft навсегда и копилось. - // Теперь дренируем backlog по 4 старейших в день, при этом сегодняшнюю свежую - // партию не трогаем (она станет доступна завтра). В связке с дедупом автогена - // (макс 4/день) это даёт устойчивое состояние без накопления. + // Берём черновики, созданные ДО сегодняшних 07:00 МСК (границы текущего цикла). + // Раньше было `< CURRENT_DATE` (строго прошлая календарная дата) — из-за этого + // черновики, сгенерённые ночью ПОСЛЕ полуночи (напр. в 01:00), считались + // «сегодняшними» и ждали ещё сутки. Новое правило: всё, что старше сегодняшних + // 07:00, публикуется на этом тике; свежую партию (генерация в 17:00) не трогаем — + // она старше 07:00 уже на следующий день. Дренаж backlog по 4 старейших/день. const { rows: drafts } = await query( `SELECT id, title, category, created_at FROM articles WHERE status='draft' - AND created_at AT TIME ZONE 'Europe/Moscow' < CURRENT_DATE::date + AND created_at < ((date_trunc('day', now() AT TIME ZONE 'Europe/Moscow') + INTERVAL '7 hours') AT TIME ZONE 'Europe/Moscow') ORDER BY created_at ASC LIMIT 4` ); @@ -125,11 +125,11 @@ function startDraftAutoApproveScheduler() { const { rows: missed } = await query(` SELECT COUNT(*) AS cnt FROM articles WHERE status='draft' - AND created_at AT TIME ZONE 'Europe/Moscow' < CURRENT_DATE::date + AND created_at < ((date_trunc('day', now() AT TIME ZONE 'Europe/Moscow') + INTERVAL '7 hours') AT TIME ZONE 'Europe/Moscow') `); if (parseInt(missed[0]?.cnt, 10) > 0) { - console.log('[DraftApprove] catch-up при старте: найдены пропущенные вчерашние черновики (' + missed[0].cnt + ' шт)'); - await runAutoApprove(); + console.log('[DraftApprove] catch-up при старте: найдены пропущенные черновики (' + missed[0].cnt + ' шт)'); + await runDraftAutoApprove(); } } catch (err) { console.error('[DraftApprove] catch-up error:', err.message); } }