V10.609 自動同步外部報價資料
All checks were successful
CD Pipeline / deploy (push) Successful in 1m5s

This commit is contained in:
OoO
2026-06-15 21:34:48 +08:00
parent df6714c3f7
commit a3ace326c8
7 changed files with 593 additions and 5 deletions

View File

@@ -2257,6 +2257,61 @@ def run_competitor_price_feeder_task():
logging.error(f"[Scheduler] [Feeder] event_router 失敗: {_router_e}")
def run_external_offer_sync_task():
"""
外部報價正規化同步任務(每 4 小時執行一次)
將已確認同款的既有比價快取自動同步到 external_offers讓 PChome 成長作戰清單
能吃共同資料層。CSV 僅保留備援,不是日常主流程。
"""
try:
from config import DATABASE_PATH
from sqlalchemy import create_engine
from services.external_market_offer_service import sync_legacy_momo_reference_offers
now_str = datetime.now(TAIPEI_TZ).strftime('%Y-%m-%d %H:%M')
limit = int(os.getenv("EXTERNAL_OFFER_SYNC_LIMIT", "1000"))
logging.info(f"[Scheduler] [ExternalOfferSync] 🚀 啟動外部報價自動同步 | {now_str}")
engine = create_engine(DATABASE_PATH)
try:
result = sync_legacy_momo_reference_offers(engine, limit=limit, dry_run=False)
finally:
engine.dispose()
stats = {
"status": "Success" if result.get("success") else "Skipped",
"candidate_count": result.get("candidate_count", 0),
"written_count": result.get("written_count", 0),
"source_code": result.get("source_code", "momo_reference"),
"message": result.get("message"),
}
logging.info(
"[Scheduler] [ExternalOfferSync] ✅ 完成 | candidates=%s written=%s status=%s",
stats["candidate_count"],
stats["written_count"],
result.get("status"),
)
_save_stats('external_offer_sync', stats)
except Exception as e:
import traceback as _tb
logging.error(f"[Scheduler] [ExternalOfferSync] 🚨 任務異常 | Error: {e}")
_save_stats('external_offer_sync', {"status": "Failed", "error": str(e)})
try:
from services.event_router import notify_failure
notify_failure(
task_name="run_external_offer_sync_task",
error=e,
source="Scheduler.ExternalOfferSync",
event_type="external_offer_sync_failure",
priority="P2",
title="外部報價自動同步異常",
trace=_tb.format_exc(),
)
except Exception as _router_e:
logging.error(f"[Scheduler] [ExternalOfferSync] event_router 失敗: {_router_e}")
def run_pchome_match_backfill_task():
"""
PChome 待比對商品補抓任務(每日執行)