From fc4a4e81d4ddb5a4e9af3ec33f8d88f51ff5ce60 Mon Sep 17 00:00:00 2001 From: Sisyphus Date: Wed, 22 Jul 2026 11:41:49 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E4=B8=AD=E7=94=B5=E5=BB=BA):=20=E8=B7=A8?= =?UTF-8?q?=E5=A4=A9=E9=A6=96=E6=AC=A1=E8=BF=90=E8=A1=8C=E5=9B=9E=E6=BA=AF?= =?UTF-8?q?=203=20=E5=A4=A9,=20=E8=A1=A5=E6=8A=93=E5=89=8D=E4=B8=80?= =?UTF-8?q?=E5=A4=A9=E5=90=8E=E5=8D=8A=E5=A4=A9=E5=8F=91=E5=B8=83=E7=9A=84?= =?UTF-8?q?=E5=85=AC=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bug 复现: state 文件按日期存放, 跨天首次运行 sinceDate=今天, 漏掉前一天 8:00 CST 之后才发布的公告 (用户实例: 2409490555 中电建水电十四局橡胶电缆, 7/21 22:45 发布). 修复: 新增 BACKFILL_DAYS=3 配置, state 为空时 sinceDate = today - 3 天, 新增'跨天补抓'日志分支. 验证: 删 state 后重跑拉到 80 条 / 28 条招采公告, 全部下载成功. 本地 + 生产 scp 同步部署, 4 个关键词全流程测试通过. --- scripts/tender-fetcher/fetch-v1.2.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/scripts/tender-fetcher/fetch-v1.2.js b/scripts/tender-fetcher/fetch-v1.2.js index 2c272e4..9189cf0 100755 --- a/scripts/tender-fetcher/fetch-v1.2.js +++ b/scripts/tender-fetcher/fetch-v1.2.js @@ -36,6 +36,8 @@ const TYPES = ['招采公告']; // 可选:留空则从上次抓取日期继续;有值则从指定日期开始 const START_DATE = ''; const END_DATE = new Date().toISOString().split('T')[0]; // 今天 +// 跨天首次运行(state 为空)时回溯 N 天, 避免错过前一天后半天发布的公告 +const BACKFILL_DAYS = 3; const OUTPUT_DIR = path.join(process.env.HOME, 'desktop/招标公告', END_DATE); const PDF_DIR = path.join(OUTPUT_DIR, 'pdf'); // PDF 附件 const HTML_DIR = path.join(OUTPUT_DIR, 'html'); // HTML 转换(待安装转换技能) @@ -346,12 +348,17 @@ async function main() { log(`========== 开始抓取: ${KEYWORD} ==========`); - // 确定起始日期(差量:上次运行日期 或 配置的 START_DATE) - const sinceDate = START_DATE || (state.lastRun ? state.lastRun.split('T')[0] : null) || END_DATE; + // 确定起始日期(差量:上次运行日期 或 配置的 START_DATE;跨天首次运行回溯 N 天) + const sinceDate = START_DATE || (state.lastRun ? state.lastRun.split('T')[0] : null) || (() => { + const d = new Date(Date.now() - BACKFILL_DAYS * 86400 * 1000); + return d.toISOString().split('T')[0]; + })(); if (START_DATE) { log(`指定日期范围: ${START_DATE} ~ ${END_DATE}`); } else if (state.lastRun) { log(`差量模式: 自 ${state.lastRun.substring(0, 10)} 以来新增`); + } else if (sinceDate !== END_DATE) { + log(`跨天补抓: ${sinceDate} ~ ${END_DATE}`); } else { log(`首次运行: ${sinceDate} ~ ${END_DATE}`); }