""" 任务持久化存储 使用 JSON 文件存储任务数据 """ import os import json import time from typing import Dict, List, Optional class TaskStore: def __init__(self, store_dir: str): self.store_dir = os.path.abspath(store_dir) os.makedirs(self.store_dir, exist_ok=True) def _task_path(self, task_id: str) -> str: return os.path.join(self.store_dir, f"{task_id}.json") def save(self, task: dict) -> None: task["updated_at"] = time.time() path = self._task_path(task["id"]) with open(path, "w", encoding="utf-8") as f: json.dump(task, f, ensure_ascii=False, indent=2) def load(self, task_id: str) -> Optional[dict]: path = self._task_path(task_id) if not os.path.exists(path): return None with open(path, "r", encoding="utf-8") as f: return json.load(f) def list_all(self) -> List[dict]: tasks = [] for filename in os.listdir(self.store_dir): if filename.endswith(".json"): task_id = filename[:-5] task = self.load(task_id) if task: tasks.append(task) tasks.sort(key=lambda t: t.get("created_at", 0), reverse=True) return tasks def append_log(self, task_id: str, log_line: str) -> None: task = self.load(task_id) if not task: return if "logs" not in task: task["logs"] = [] task["logs"].append({ "time": time.strftime("%Y-%m-%d %H:%M:%S"), "message": log_line, }) # 日志最多保留 500 条 if len(task["logs"]) > 500: task["logs"] = task["logs"][-500:] self.save(task)