## 背景 #486 撤掉了「建 3D 资产」创建入口,理由是当时卡片上混着不可用与未实现的入口(#485)。撤掉在当时是对的:worker 镜像里没有 node 与 playwright,点进去走到出帧那一步必然抛错。 后端这一侧的能力一直在 main 上,五个端点都已部署;运行时依赖在 #517 补齐。所以现在缺的是前端把入口接回来。 ## 后端契约(已在 main,无需改动) 零成本、可随便调: - `POST /render3d/master-precheck`,body `{image_url, canvas_width?, canvas_height?}` —— 母版是否够格出 3D。**不产生任何按次计费调用**,适合直接挂在确认闸上 - `GET /render3d/characters/{character_id}/outfits/{outfit_id}` —— 状态与成本,无副作用,可轮询 按次计费,只认用户显式点击: - `POST /render3d/characters/{character_id}/outfits/{outfit_id}/build` —— 启动图生 3D - `POST .../approve` —— 人工放行,开始绑骨 - `POST .../discard` —— 弃掉重来 `GET` 返回的字段: ``` { asset_key, state, model_3d_url, review_model_url, error, cost: { model3d_credits, autorig_credits, total_credits, billing: "postpaid", scope: "per_outfit_once" } } ``` `state` 三个取值:`absent`(什么都没有,点「建」会开始花钱)、`awaiting_review`(已出模型,卡在人工确认闸上)、`ready`(已绑骨,渲帧可直接用)。 `cost` 恒在返回里,不只在 `absent` 时给 —— 前端拿它渲染扣费提示,按次计费的触发点绝不能出现在用户不知情的时候。**积分数字从这里读,不要在前端硬编码**:#486 之前的按钮写死了「30 积分」,而单价与档位都可能变。 ## 需要前端补的 1. 入口回到身份母版卡片,点击前先调 `master-precheck`,不过检就不给点、并显示原因 2. 扣费确认:金额取 `cost.total_credits`,明示 `scope=per_outfit_once`(同一造型只收一次) 3. `awaiting_review` 状态要有放行/弃掉两个动作,对应 `approve` / `discard`;这一步是人工闸,不能自动放行 4. 轮询 `GET` 拿 `state`,`error` 非空时展示后端给的文案,不要自己拼 5. 已有 `model_3d_url` 的造型保持现状 —— #486 没有删这条判定,不要重复实现 ## 不包含 - 不改后端端点与返回形状 - 不做多朝向出参的 UI:那条还缺一个设计决定(#192 子项 8),#449 只接通了入参一半 - 入口开放的前置条件见 #192 的四条判据,本 issue 只负责前端这一侧 ## 验收 - `absent` / `awaiting_review` / `ready` 三个状态各有对应 UI,且状态来自 `GET` 而不是前端自己推 - 扣费提示的数字来自 `cost`,grep 前端代码没有硬编码的积分数 - `master-precheck` 不过检时按钮不可点,且给出后端返回的原因 - 用一个真实造型走完 precheck → build → approve 一遍
背景
#486 撤掉了「建 3D 资产」创建入口,理由是当时卡片上混着不可用与未实现的入口(#485)。撤掉在当时是对的:worker 镜像里没有 node 与 playwright,点进去走到出帧那一步必然抛错。
后端这一侧的能力一直在 main 上,五个端点都已部署;运行时依赖在 #517 补齐。所以现在缺的是前端把入口接回来。
后端契约(已在 main,无需改动)
零成本、可随便调:
POST /render3d/master-precheck,body{image_url, canvas_width?, canvas_height?}—— 母版是否够格出 3D。不产生任何按次计费调用,适合直接挂在确认闸上GET /render3d/characters/{character_id}/outfits/{outfit_id}—— 状态与成本,无副作用,可轮询按次计费,只认用户显式点击:
POST /render3d/characters/{character_id}/outfits/{outfit_id}/build—— 启动图生 3DPOST .../approve—— 人工放行,开始绑骨POST .../discard—— 弃掉重来GET返回的字段:state三个取值:absent(什么都没有,点「建」会开始花钱)、awaiting_review(已出模型,卡在人工确认闸上)、ready(已绑骨,渲帧可直接用)。cost恒在返回里,不只在absent时给 —— 前端拿它渲染扣费提示,按次计费的触发点绝不能出现在用户不知情的时候。积分数字从这里读,不要在前端硬编码:#486 之前的按钮写死了「30 积分」,而单价与档位都可能变。需要前端补的
master-precheck,不过检就不给点、并显示原因cost.total_credits,明示scope=per_outfit_once(同一造型只收一次)awaiting_review状态要有放行/弃掉两个动作,对应approve/discard;这一步是人工闸,不能自动放行GET拿state,error非空时展示后端给的文案,不要自己拼model_3d_url的造型保持现状 —— fix(workflow-editor): align generation feedback and controls #486 没有删这条判定,不要重复实现不包含
验收
absent/awaiting_review/ready三个状态各有对应 UI,且状态来自GET而不是前端自己推cost,grep 前端代码没有硬编码的积分数master-precheck不过检时按钮不可点,且给出后端返回的原因