fix(api): GET /task 合并内存 running/pending 任务(任务中心看到刚提交的,治只查DB看不到运行中) [nas]
CI/CD / test (push) Successful in 13s
CI/CD / nas-deploy (push) Successful in 26s
CI/CD / nas-verify (push) Successful in 11s

This commit is contained in:
2026-08-13 14:00:45 +08:00
parent 728b8ccec9
commit b99e58bca1
+43 -5
View File
@@ -324,14 +324,50 @@ def factor_report(task_id: str, factor: str, token: str = Query(...)):
@router.get("/task", dependencies=[Depends(verify_token)])
def list_tasks(type: str | None = None, status: str | None = None):
"""List historical tasks (from the results DB)."""
"""List tasks: 内存中 running/pending + DB done/failed(历史)。
running/pending 任务还没存 DB(done 才 save_result),光查 DB 看不到刚提交的
→ 任务中心(GitHub Actions 模式)必须合并内存 active + DB 已完成。
"""
from sanguo_backtest.result_store import list_results
orch = get_orchestrator()
items = []
active: list[dict] = []
seen: set[str] = set()
# 1) 内存 active 任务 (running/pending,未存 DB)
for tid, task in list(getattr(orch.pool, "_tasks", {}).items()):
st = task.status.value if hasattr(task.status, "value") else str(task.status)
if st not in ("running", "pending"):
continue
if status and st != status:
continue
ttype = getattr(task, "task_type", "") or ""
if type and ttype != type:
continue
spec = getattr(orch, "_pending", {}).get(tid, {}) or {}
strat = spec.get("strategy", "")
if not strat and spec.get("strategy_class"):
strat = getattr(spec["strategy_class"], "__name__", str(spec["strategy_class"]))
active.append({
"id": 0,
"task_id": tid,
"type": ttype,
"status": st,
"strategy": strat,
"symbol": spec.get("symbol", "") or spec.get("benchmark", ""),
"start": spec.get("start", ""),
"end": spec.get("end", ""),
})
seen.add(tid)
# 2) DB 已持久化任务 (done/failed)
db_items: list[dict] = []
for r in list_results(type_filter=type, db_path=orch.db_path):
if r.task_id in seen:
continue
if status and r.status != status:
continue
items.append({
db_items.append({
"id": r.id,
"task_id": r.task_id,
"type": r.type,
@@ -341,8 +377,10 @@ def list_tasks(type: str | None = None, status: str | None = None):
"start": r.start,
"end": r.end,
})
items.reverse() # newest first
return {"tasks": items}
active.reverse() # 最新提交的 running 在最上
db_items.reverse() # DB newest first
return {"tasks": active + db_items}
@router.get("/task/{task_id}/optimization-results", dependencies=[Depends(verify_token)])