from __future__ import annotations from datetime import datetime, timezone from pathlib import Path from app.core.db import get_db from app.core.files import tail_lines from app.services.runtime_settings_service import get_runtime_settings from app.services.settings_service import get_settings_payload from app.services.worker_control_service import detect_worker_runtime def get_detect_status() -> dict: queries = { "pending": "select count(*) from domains where detect_status = 0", "completed": "select count(*) from domains where detect_status = 1", "running": "select count(*) from domains where detect_status = 2", "blacklisted": "select count(*) from domains where detect_status = 3", "failed": "select count(*) from domains where detect_status = 4", } progress: dict[str, int] = {} with get_db() as conn: with conn.cursor() as cur: for key, query in queries.items(): cur.execute(query) progress[key] = cur.fetchone()[0] settings_payload = get_settings_payload() worker_log = Path(__file__).resolve().parents[3] / "domainCheck" / "detect_worker.log" if not worker_log.exists(): worker_log = Path(__file__).resolve().parents[3] / "domainCheck" / "logs" / "detect_worker.log" worker_online = False last_log_time = None if worker_log.exists(): modified = datetime.fromtimestamp(worker_log.stat().st_mtime, tz=timezone.utc) last_log_time = modified.isoformat() worker_online = (datetime.now(timezone.utc) - modified).total_seconds() < 180 recent_lines = tail_lines("detect_worker.log", max_lines=80) recent_proxy_warning = next( (line for line in reversed(recent_lines) if "代理" in line or "Redis订阅失败" in line), "", ) runtime = detect_worker_runtime() runtime_settings = get_runtime_settings() worker_online = worker_online or runtime.get("running", False) return { "worker_online": worker_online, "worker_mode": runtime.get("mode", "windows-local"), "worker_service_name": runtime_settings.get("worker_service_name", ""), "api_service_name": runtime_settings.get("api_service_name", ""), "worker_process_count": runtime.get("process_count", 0), "worker_latest_start_time": runtime.get("latest_start_time", ""), "worker_runtime_message": runtime.get("message", ""), "thread_count": settings_payload["thread_count"], "proxy_enable": settings_payload["proxy_config"].get("proxy_enable", False), "allow_direct": settings_payload["proxy_config"].get("allow_direct", False), "proxy_pool_count": len(settings_payload["proxy_config"].get("proxy_urls", [])), "available_proxy_count": 0, "last_worker_log_time": last_log_time, "progress": progress, "recent_warning": recent_proxy_warning, }