import cron from 'node-cron' // scripts/ 下的可选脚本模块 (部署容器可能缺失或依赖不全): 惰性加载, // 单个 fetcher 缺失只降级对应任务, 不拖垮 cron 整体注册。 async function importNewsFetcher() { const mod = await import('../scripts/fetchers/news.fetcher.js') return { fetchNewsList: mod.fetchNewsList, persistNews: mod.persistNews } } async function alertError(taskName, message) { try { const { insertCronAlert } = await import('../scripts/lib/cron-alert.js') await insertCronAlert(taskName, message) } catch (e) { console.error('[cron] 报警写入失败(忽略):', e.message) } } // 每天 6:00 (Asia/Shanghai) 拉取新闻, 出错生成报警 function scheduleNews() { cron.schedule('0 6 * * *', async () => { console.log('[cron] 6:00 触发') try { const { fetchNewsList, persistNews } = await importNewsFetcher() const list = await fetchNewsList() const r = await persistNews(list) console.log('[cron] 新闻入库: 新增 ' + r.inserted + ' / 跳过 ' + r.skipped) } catch (e) { console.error('[cron] 任务失败:', e.message) await alertError('新闻拉取', e.message) } }, { timezone: 'Asia/Shanghai' }) console.log('[cron] 已注册: 每天 06:00 拉取新闻') } // 每小时兜底: 任务自动归档扫描 (T-ARC-02; 项目加载时另有读时惰性执行) function scheduleAutoArchive() { cron.schedule('30 * * * *', async () => { try { const { runAutoArchiveSweep } = await import('./task-domain/archive.js') const n = await runAutoArchiveSweep() if (n > 0) console.log('[cron] 自动归档:', n, '条') } catch (e) { console.error('[cron] 自动归档失败:', e.message) await alertError('任务自动归档', e.message) } }, { timezone: 'Asia/Shanghai' }) console.log('[cron] 已注册: 每小时 30 分 任务自动归档扫描') } scheduleNews() scheduleAutoArchive()