From adbc30fa780da47332cec77f4ed4f26d7df5f2f6 Mon Sep 17 00:00:00 2001 From: cfdaily Date: Sun, 17 May 2026 13:04:56 +0800 Subject: [PATCH] auto-sync: 2026-05-17 13:04:56 --- src/blackboard/queries.py | 60 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/src/blackboard/queries.py b/src/blackboard/queries.py index 3b7470d..847f0b3 100644 --- a/src/blackboard/queries.py +++ b/src/blackboard/queries.py @@ -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