Files
claude_dev 212ad6426d feat(s2): 投研核心端到端跑通(IC 表 + tears 报告)
- Task 加 raw_result 字段;orchestrator get_raw_result(内存存 FactorReport)
- 路由 /factor/list、/task/{id}/ic-summary、/task/{id}/report/{factor}(query token 给 iframe)
- analyzer cfg=None 时加载 data_platform.yaml(修 API 路径 read_db_daily 崩)
- get_status 返回 error_msg(调试+前端 failed 展示)
- 前端 投研-新建(多因子/多标的/日期)+ 结果页(IC 表 + tears iframe)
- factor 冒烟通过:ma5 → IC 1D/5D/10D 真实数据
2026-07-07 06:28:01 +08:00

43 lines
1.2 KiB
Python

"""
Task state management for Sanguo Orchestrator
Defines Task state machine and transitions
"""
import enum
from dataclasses import dataclass
from typing import Any
class TaskState(enum.Enum):
"""Task execution states"""
PENDING = "pending"
RUNNING = "running"
DONE = "done"
FAILED = "failed"
@dataclass
class Task:
"""Represents a task in the orchestrator"""
task_id: str
task_type: str
status: TaskState = TaskState.PENDING
result_id: int | None = None
raw_result: Any = None # in-memory result object (e.g. FactorReport for factor tasks)
error_msg: str | None = None
stage: str = "" # Current stage (数据加载/算因子/回测中...)
def start(self):
"""Transition from PENDING to RUNNING"""
if self.status != TaskState.PENDING:
raise ValueError(f"不能从 {self.status.name} 启动")
self.status = TaskState.RUNNING
def complete(self, result_id: int):
"""Transition to DONE with result"""
self.status = TaskState.DONE
self.result_id = result_id
def fail(self, error_msg: str):
"""Transition to FAILED with error message"""
self.status = TaskState.FAILED
self.error_msg = error_msg