57 lines
1.7 KiB
Python
57 lines
1.7 KiB
Python
"""
|
|
任务持久化存储
|
|
使用 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)
|