Files
HM_project_Viewer_Board/scripts/rebuild_hanmac_aggregate_cache_once.py
T

87 lines
3.2 KiB
Python

from __future__ import annotations
import argparse
import json
import sqlite3
import sys
from datetime import date
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
import main
def load_latest_payloads(years: list[int]) -> dict[int, dict[str, object]]:
conn = sqlite3.connect(main.DB_PATH)
conn.row_factory = sqlite3.Row
rows = conn.execute(
"""
SELECT params_json
FROM system_jobs
WHERE page_key = 'hanmac_browser'
AND job_type = 'hanmac_aggregate_cache'
AND status = 'done'
ORDER BY updated_at DESC
"""
).fetchall()
latest: dict[int, dict[str, object]] = {}
fallback: dict[str, object] = {}
for row in rows:
try:
payload = json.loads(row["params_json"] or "{}")
except Exception:
continue
if not isinstance(payload, dict):
continue
if not fallback and payload.get("host") and payload.get("user") and payload.get("password"):
fallback = payload
start_text = str(payload.get("start_date") or "")
for year in years:
if year not in latest and start_text.startswith(str(year)):
latest[year] = payload
return {year: dict(latest.get(year) or fallback) for year in years}
def rebuild_year(year: int, base_payload: dict[str, object], end_today: bool = False) -> dict[str, object]:
if not base_payload:
raise RuntimeError(f"{year}년 캐시를 만들 접속정보가 없습니다.")
end_date = date.today().isoformat() if end_today and year == date.today().year else f"{year}-12-31"
payload = {
**base_payload,
"database": main.normalize_text(base_payload.get("database")) or main.HANMAC_PRIMARY_MANHOUR_SCHEMA,
"view": "member",
"employment": main.normalize_text(base_payload.get("employment") or "all"),
"start_date": f"{year}-01-01",
"end_date": end_date,
}
result = main.get_hanmac_aggregate_summary(payload)
cache_key = main._hanmac_aggregate_cache_key(payload)
main._store_hanmac_aggregate_cache(cache_key, result)
diagnostics = result.get("source_diagnostics") or {}
return {
"year": year,
"start_date": result.get("start_date"),
"end_date": result.get("end_date"),
"row_count": len(result.get("rows") or []),
"cache_key": cache_key,
"joint_assignment_records": diagnostics.get("joint_assignment_records", 0),
"joint_assignment_regular_rows": diagnostics.get("joint_assignment_regular_rows", 0),
"joint_assignment_overtime_rows": diagnostics.get("joint_assignment_overtime_rows", 0),
}
def main_cli() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("--years", nargs="+", type=int, default=[2022, 2023, 2024, 2025, 2026])
parser.add_argument("--end-today", action="store_true")
args = parser.parse_args()
payloads = load_latest_payloads(args.years)
for year in args.years:
summary = rebuild_year(year, payloads.get(year) or {}, end_today=args.end_today)
print(json.dumps(summary, ensure_ascii=False, sort_keys=True))
if __name__ == "__main__":
main_cli()