Files
ihaleist/server/scheduler.mjs
T
hikmettan d606d55e41 feat: geçmiş arşiv dolumu + arşiv sayacı
- scheduler: arşiv eşiğin altındaysa geniş geçmiş dolumu (180 gün/1500 kayıt),
  doluysa artımlı günlük tarama; ilk tur 90 sn sonra
- LiveStatsBar: 'Sonuç Arşivi' sayacı (kazanan firma kayıt sayısı)
- KİK: HTML entity çözümü tamamlandı
2026-08-28 10:42:33 +03:00

76 lines
2.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Sunucu içi zamanlayıcı — geçmiş sonuç ilanlarını periyodik olarak biriktirir.
* Container'da ayrı cron kurmaya gerek kalmaz; server/index.js başlatır.
*
* Env:
* SCAN_ENABLED=0 → kapat (varsayılan açık)
* SCAN_INTERVAL_SAAT=6 → tarama sıklığı (saat)
* SCAN_GUN=3 → her turda geriye kaç günü tara
* SCAN_LIMIT=300 → tur başına maksimum ihale
*/
import { spawn } from 'node:child_process';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import { historyStats } from './history-store.mjs';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
let calisiyor = false;
// Arşiv boş/küçükse geniş geçmiş dolumu, doluysa artımlı günlük tarama.
function tarataParams() {
const s = historyStats();
const mevcut = s.available ? (s.toplam || 0) : 0;
const esik = Number(process.env.SCAN_BACKFILL_ESIK || 2000);
if (mevcut < esik) {
return {
gun: process.env.SCAN_BACKFILL_GUN || '180',
limit: process.env.SCAN_BACKFILL_LIMIT || '1500',
tip: `geçmiş dolumu (arşivde ${mevcut} kayıt)`,
};
}
return {
gun: process.env.SCAN_GUN || '3',
limit: process.env.SCAN_LIMIT || '300',
tip: `artımlı güncelleme (arşivde ${mevcut} kayıt)`,
};
}
function tara() {
if (calisiyor) {
console.log('[scheduler] önceki tarama sürüyor, bu tur atlandı');
return;
}
calisiyor = true;
const { gun, limit, tip } = tarataParams();
console.log(`[scheduler] EKAP sonuç taraması — ${tip}: son ${gun} gün, limit ${limit}`);
const p = spawn(process.execPath, [path.join(__dirname, 'ekap-scan.mjs'), '--gun', gun, '--limit', limit], {
stdio: ['ignore', 'pipe', 'pipe'],
});
p.stdout.on('data', (d) => process.stdout.write(String(d)));
p.stderr.on('data', (d) => process.stderr.write(String(d)));
p.on('close', (code) => {
calisiyor = false;
console.log(`[scheduler] tarama bitti (çıkış kodu ${code})`);
});
p.on('error', (e) => {
calisiyor = false;
console.warn('[scheduler] tarama başlatılamadı:', e.message);
});
}
export function startScheduler() {
if (process.env.SCAN_ENABLED === '0') {
console.log('[scheduler] devre dışı (SCAN_ENABLED=0)');
return;
}
const saat = Number(process.env.SCAN_INTERVAL_SAAT || 6);
const ms = Math.max(1, saat) * 3600 * 1000;
console.log(`[scheduler] geçmiş sonuç taraması her ${saat} saatte bir çalışacak`);
// Açılıştan 90 sn sonra ilk tur (sunucu ısınsın), sonra periyodik
setTimeout(tara, 90 * 1000).unref?.();
setInterval(tara, ms).unref?.();
}