From bf0619a03c3a342fafc58f50735540b31168a36f Mon Sep 17 00:00:00 2001 From: ThearchyHelios Date: Tue, 13 Oct 2026 15:38:27 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9B=AE=E5=BD=95=E6=B8=85=E5=8D=95=E7=9A=84?= =?UTF-8?q?=20last=5Fdraft=20=E6=94=B9=E5=9C=A8=E5=BA=93=E9=87=8C=E6=8C=91?= =?UTF-8?q?=EF=BC=9A=E6=AF=8F=E5=BC=A0=E8=A1=A8=E6=9C=80=E8=BF=91=E4=B8=80?= =?UTF-8?q?=E6=AC=A1=E8=B5=B7=E8=8D=89=E4=BB=BB=E5=8A=A1=E9=87=8C=E7=9A=84?= =?UTF-8?q?=E9=82=A3=E4=B8=80=E9=A1=B9=E7=94=A8=E7=AA=97=E5=8F=A3=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E5=8F=96=EF=BC=8C=E8=B5=B7=E8=8D=89=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E4=B8=AD=E6=B8=85=E5=8D=95=E9=A1=B5=E5=8F=8D=E5=A4=8D=E5=88=B7?= =?UTF-8?q?=E6=96=B0=E6=97=B6=E4=B8=8D=E5=86=8D=E6=8A=8A=E6=9C=80=E8=BF=91?= =?UTF-8?q?=E4=B8=80=E7=99=BE=E4=B8=AA=E4=BB=BB=E5=8A=A1=E7=9A=84=E9=80=90?= =?UTF-8?q?=E8=A1=A8=E8=AE=B0=E5=BD=95=E5=85=A8=E8=AF=BB=E5=87=BA=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/data/catalog_jobs.py | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/backend/app/data/catalog_jobs.py b/backend/app/data/catalog_jobs.py index f38c08db..4c580e8b 100644 --- a/backend/app/data/catalog_jobs.py +++ b/backend/app/data/catalog_jobs.py @@ -226,21 +226,19 @@ async def job_brief(session: AsyncSession, job: CatalogDraftJob | None) -> dict[ async def last_drafts(session: AsyncSession, source_id: str) -> dict[str, dict[str, Any]]: """每张表最近一次起草任务里的那一项:{表名: {status, job_id, finished_at, error, model_error}}。任务还在进行, - 就是进行中的状态。只看最近 LAST_DRAFT_JOBS 个任务。""" - ids = list((await session.execute( - select(CatalogDraftJob.id).where(CatalogDraftJob.source_id == source_id) - .order_by(CatalogDraftJob.created_at.desc()).limit(LAST_DRAFT_JOBS) - )).scalars()) - if not ids: - return {} - rank = {job_id: i for i, job_id in enumerate(ids)} - rows = (await session.execute(select(CatalogDraftTask).where(CatalogDraftTask.job_id.in_(ids)))).scalars() - out: dict[str, dict[str, Any]] = {} - for task in sorted(rows, key=lambda t: (rank[t.job_id], t.seq)): - out.setdefault(task.table_name, {"status": task.status, "job_id": task.job_id, - "finished_at": _iso(task.finished_at), "error": task.error, - "model_error": task.model_error}) - return out + 就是进行中的状态。只看最近 LAST_DRAFT_JOBS 个任务;每张表取哪一项在库里挑好(清单页起草时会反复取)。""" + recent = (select(CatalogDraftJob.id).where(CatalogDraftJob.source_id == source_id) + .order_by(CatalogDraftJob.created_at.desc()).limit(LAST_DRAFT_JOBS)).scalar_subquery() + rank = func.row_number().over(partition_by=CatalogDraftTask.table_name, + order_by=(CatalogDraftJob.created_at.desc(), CatalogDraftTask.seq)).label("rank") + inner = (select(CatalogDraftTask.table_name, CatalogDraftTask.status, CatalogDraftTask.job_id, + CatalogDraftTask.finished_at, CatalogDraftTask.error, CatalogDraftTask.model_error, rank) + .join(CatalogDraftJob, CatalogDraftJob.id == CatalogDraftTask.job_id) + .where(CatalogDraftJob.id.in_(recent))).subquery() + rows = (await session.execute(select(inner).where(inner.c.rank == 1))).mappings() + return {row["table_name"]: {"status": row["status"], "job_id": row["job_id"], + "finished_at": _iso(row["finished_at"]), "error": row["error"], + "model_error": row["model_error"]} for row in rows} # ==========================================================================