diff --git a/backend/app/api/v1/endpoints/platform.py b/backend/app/api/v1/endpoints/platform.py index f3387b3..34a77ba 100644 --- a/backend/app/api/v1/endpoints/platform.py +++ b/backend/app/api/v1/endpoints/platform.py @@ -2305,7 +2305,10 @@ async def model_eval_delete(task_id: str, current_user: dict = Depends(get_curre pending = _require_approval_or_admin("eval", task_id, current_user, f"删除评测任务 {task_id}") if pending: return pending - get_platform_store().delete_eval_task(task_id) + try: + get_platform_store().delete_eval_task(task_id) + except KeyError: + raise fail(404, "eval task not found") return ok({"deleted": task_id}) diff --git a/backend/app/db/platform_store.py b/backend/app/db/platform_store.py index 2474354..ce35551 100644 --- a/backend/app/db/platform_store.py +++ b/backend/app/db/platform_store.py @@ -2515,12 +2515,18 @@ class PlatformStore: def eval_tasks(self) -> list[dict[str, Any]]: with self.connect() as conn: - rows = conn.execute("SELECT * FROM eval_tasks ORDER BY create_time DESC").fetchall() + # 评测任务采用软删除,普通列表不得再次返回已删除记录。 + rows = conn.execute( + "SELECT * FROM eval_tasks WHERE deleted_at IS NULL ORDER BY create_time DESC" + ).fetchall() return [self._enrich_eval_payload(conn, self._json_payload_row(row)) for row in rows] def eval_task(self, task_id: str) -> dict[str, Any]: with self.connect() as conn: - row = conn.execute("SELECT * FROM eval_tasks WHERE id=?", (task_id,)).fetchone() + row = conn.execute( + "SELECT * FROM eval_tasks WHERE id=? AND deleted_at IS NULL", + (task_id,), + ).fetchone() if not row: raise KeyError(task_id) payload = self._enrich_eval_payload(conn, self._json_payload_row(row)) @@ -2591,7 +2597,13 @@ class PlatformStore: def delete_eval_task(self, task_id: str) -> None: with self.connect() as conn: - conn.execute("UPDATE eval_tasks SET deleted_at=?, deleted_by=? WHERE id=?", (utcnow(), "system", task_id)) + result = conn.execute( + "UPDATE eval_tasks SET deleted_at=?, deleted_by=? " + "WHERE id=? AND deleted_at IS NULL RETURNING id", + (utcnow(), "system", task_id), + ) + if not result.fetchone(): + raise KeyError(task_id) def running_eval_tasks(self) -> list[dict[str, Any]]: """Return eval tasks that have been submitted to a compute node and are still running."""