auto-sync: 2026-05-17 13:04:56
This commit is contained in:
@@ -110,5 +110,65 @@ class Queries:
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def task_detail(self, task_id: str) -> Optional[Dict[str, Any]]:
|
||||
"""任务详情聚合(含关联数据)"""
|
||||
conn = self._conn()
|
||||
try:
|
||||
row = conn.execute("SELECT * FROM tasks WHERE id=?", (task_id,)).fetchone()
|
||||
if not row:
|
||||
return None
|
||||
task = dict(row)
|
||||
# 关联评论数 + 产出数
|
||||
task["comments_count"] = conn.execute(
|
||||
"SELECT COUNT(*) FROM comments WHERE task_id=?", (task_id,)
|
||||
).fetchone()[0]
|
||||
task["outputs_count"] = conn.execute(
|
||||
"SELECT COUNT(*) FROM outputs WHERE task_id=?", (task_id,)
|
||||
).fetchone()[0]
|
||||
# 最新审查状态
|
||||
rev_row = conn.execute(
|
||||
"SELECT verdict FROM reviews WHERE task_id=? ORDER BY created_at DESC LIMIT 1",
|
||||
(task_id,),
|
||||
).fetchone()
|
||||
task["review_status"] = rev_row["verdict"] if rev_row else None
|
||||
# 最新事件
|
||||
evt_row = conn.execute(
|
||||
"SELECT detail FROM events WHERE task_id=? ORDER BY created_at DESC LIMIT 1",
|
||||
(task_id,),
|
||||
).fetchone()
|
||||
task["latest_event_detail"] = evt_row["detail"] if evt_row else None
|
||||
return task
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def task_events(self, task_id: str, limit: int = 50) -> List[Dict[str, Any]]:
|
||||
"""任务事件列表"""
|
||||
conn = self._conn()
|
||||
try:
|
||||
rows = conn.execute(
|
||||
"SELECT * FROM events WHERE task_id=? ORDER BY created_at DESC LIMIT ?",
|
||||
(task_id, limit),
|
||||
).fetchall()
|
||||
return [dict(r) for r in rows]
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def task_experiences(self, task_id: str) -> List[Dict[str, Any]]:
|
||||
"""任务关联经验"""
|
||||
conn = self._conn()
|
||||
try:
|
||||
rows = conn.execute(
|
||||
"""SELECT e.*, GROUP_CONCAT(et.tag) as tags
|
||||
FROM experiences e
|
||||
LEFT JOIN experience_tags et ON e.id = et.experience_id
|
||||
WHERE e.source_task_id=?
|
||||
GROUP BY e.id
|
||||
ORDER BY e.created_at DESC""",
|
||||
(task_id,),
|
||||
).fetchall()
|
||||
return [dict(r) for r in rows]
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
def db_size_bytes(self) -> int:
|
||||
return self.db_path.stat().st_size if self.db_path.exists() else 0
|
||||
|
||||
Reference in New Issue
Block a user