48 lines
1.2 KiB
Python
48 lines
1.2 KiB
Python
"""
|
|
Scheduler 内部数据模型
|
|
"""
|
|
|
|
import json
|
|
from dataclasses import dataclass, field
|
|
from typing import Any
|
|
|
|
from app.schemas.enums import JobStatus
|
|
|
|
|
|
@dataclass
|
|
class JobRecord:
|
|
"""调度器内部使用的作业记录"""
|
|
|
|
job_id: str
|
|
job_type: str
|
|
user_id: str
|
|
project_id: str = ""
|
|
status: JobStatus = field(default=JobStatus.PENDING)
|
|
progress: int = 0
|
|
message: str = "等待执行..."
|
|
completed: int = 0
|
|
total: int = 0
|
|
result: dict[str, Any] = field(default_factory=dict)
|
|
error: str | None = None
|
|
params: dict[str, Any] | Any = field(default_factory=dict)
|
|
created_at: str = ""
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class StateChange:
|
|
"""状态变更记录,供 Registry 批量写入"""
|
|
|
|
job_id: str
|
|
field_path: str # 如 "shots.0.status" 或 "status"
|
|
value: Any
|
|
|
|
def to_redis_command(self) -> tuple[str, str, str]:
|
|
key = f"job:{self.job_id}"
|
|
if isinstance(self.value, dict | list):
|
|
value = json.dumps(self.value, ensure_ascii=False)
|
|
elif self.value is None:
|
|
value = ""
|
|
else:
|
|
value = str(self.value)
|
|
return key, self.field_path, value
|