From cb0290726259655273e191b0b5c70967a4e53266 Mon Sep 17 00:00:00 2001 From: zyc <1439655764@qq.com> Date: Tue, 30 Jun 2026 10:24:10 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=95=86=E5=93=81=E4=B8=89=E8=A7=86?= =?UTF-8?q?=E5=9B=BE=E5=9B=9E=E5=A1=AB=E5=8F=AA=E5=8F=96=E5=95=86=E5=93=81?= =?UTF-8?q?=E4=B8=89=E8=A7=86=E5=9B=BE,=E6=8E=92=E9=99=A4=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E4=B8=89=E8=A7=86=E5=9B=BE=20(ZWQ=20row25+row28)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 上一版回填用 category=tri_view||名字含三视图,把「角色/人物三视图」也捞进了商品三视图面板 → 商品库点「AI生成三视图」显示的是该商品视频项目里的角色三视图,而非商品本身三视图(row28)。 修正:回填过滤排除任何 metadata.triview_of(角色三视图必有、指向其立绘)及 kind=person/scene, 只保留商品三视图(category=tri_view 且无 triview_of / view=three_view / 名字含「商品三视图」)。 这样既同步回填视频项目生成的商品三视图(row25),又不与角色三视图混(row28)。 后端商品三视图本就带 view=three_view+product_id(services.py 注释明说供商品库回填),纯前端修。 构建: tsc --noEmit=0, npm run build=0 Co-Authored-By: Claude Opus 4.8 --- core/frontend/src/routes/products.tsx | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/core/frontend/src/routes/products.tsx b/core/frontend/src/routes/products.tsx index cceb70d..2bc3487 100644 --- a/core/frontend/src/routes/products.tsx +++ b/core/frontend/src/routes/products.tsx @@ -675,15 +675,19 @@ export function ProductDetailPage({ product, projects, initialTab = "assets", na return () => { alive = false; }; }, [product?.id, assetReload]); - // ZWQ#row24/三视图同步:该商品已存在的三视图资产(在【视频项目】基础资产阶段生成、 - // 或此前在商品库生成并落库的 tri_view)回填到三视图面板,避免「明明已生成却显示尚未生成」。 - // 判定与后端 is_triview 对齐:category=tri_view / metadata.view=three_view / 名字含三视图。 + // ZWQ#row25/三视图同步:该商品已存在的「商品三视图」资产(在【视频项目】基础资产阶段生成、 + // 或此前在商品库生成并落库)回填到三视图面板,避免「明明已生成却显示尚未生成」。 + // ⚠️ row28:必须只取「商品」三视图,排除「角色/人物三视图」——二者 category 都是 tri_view、名字都含「三视图」, + // 唯一可靠区分是 metadata.triview_of(角色三视图指向其立绘 asset id;商品三视图没有)+ kind=person。 + // 漏掉这层过滤就会把角色三视图塞进商品三视图面板(row28「商品三视图显示成角色三视图」)。 useEffect(() => { - const triAssets = productAssets.filter( - (a) => a.category === "tri_view" || a.asset_type === "tri_view" - || (a.metadata as { view?: string } | undefined)?.view === "three_view" - || (a.name || "").includes("三视图") - ); + const triAssets = productAssets.filter((a) => { + const m = (a.metadata as { triview_of?: unknown; kind?: string; view?: string } | undefined) || {}; + if (m.triview_of) return false; // 角色/人物/模特三视图:绝不进商品三视图面板 + if (m.kind === "person" || m.kind === "scene") return false; + return a.category === "tri_view" || a.asset_type === "tri_view" + || m.view === "three_view" || (a.name || "").includes("商品三视图"); + }); if (!triAssets.length) return; const serverVersions: TriVersion[] = triAssets .map((a) => ({ id: a.id, url: a.files?.[0]?.preview_url || "", asset: a, createdAt: a.created_at || "" }))