fix(core): 商品详情页三视图改走 image_edit 参考真实主图 + 该商品 AI 素材归属

- 商品详情页「AI 生成三视图」原走独立生图老链路(纯文生图),只凭商品名脑补,
  出来通用图不像真品。改:前端传 reference_product;后端 run_standalone_image_task
  据此取商品主图走 image_edit(复用 build_product_triview_prompt_refs 锁包装),
  取不到主图优雅回落文生图。图片创作页(自由创作)不带标记,不受影响。
- 商品详情页素材区改为只显示「该商品」AI 素材(asset.product 归属)而非全团队。
- 首登水合带重试,失败不再静默(否则页面卡在全 0,要刷新才好)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
zyc
2026-06-17 15:54:04 +08:00
co-authored by Claude Opus 4.8
parent 0d1fce1cc1
commit 9bdd0683f8
9 changed files with 84 additions and 19 deletions
+21 -4
View File
@@ -168,6 +168,21 @@ export function App() {
setActiveProductId((current) => current || productData.results[0]?.id || "");
}, []);
// 首登水合带重试:loadData 里 products/projects/allAssets 没有 .catch,任一瞬时失败会让整个
// Promise.all 直接 reject、一个 setter 都不跑 → 页面卡在全 0。boot 路径有 api.me 重试兜底,
// 故刷新就好;首登(onAuthed)以前是 void loadData().catch(log) 静默吞掉 → 数据全错。这里统一重试。
const loadDataWithRetry = useCallback(async (attempts = 3) => {
for (let attempt = 0; attempt < attempts; attempt += 1) {
try {
await loadData();
return;
} catch (error) {
if (attempt === attempts - 1) throw error;
await new Promise((resolve) => setTimeout(resolve, 1000));
}
}
}, [loadData]);
// 设置页数据:偏好 + 登录会话(进入设置页时按需加载)
const loadSettingsData = useCallback(async () => {
const [pref, sess] = await Promise.all([
@@ -227,7 +242,7 @@ export function App() {
if (cancelled || !identity) return;
setUser(identity.user);
setTeam(identity.team);
await loadData();
await loadDataWithRetry();
} catch (bootError) {
console.error("[boot] failed:", bootError);
setToken(null);
@@ -239,7 +254,7 @@ export function App() {
return () => {
cancelled = true;
};
}, [loadData]);
}, [loadDataWithRetry]);
// Keep route in sync with browser navigation.
useEffect(() => {
@@ -393,7 +408,7 @@ export function App() {
if (res) setUser(res);
}
function generateImages(payload: { prompt: string; mode?: "image" | "model" | "cover"; count?: number }) {
function generateImages(payload: { prompt: string; mode?: "image" | "model" | "cover"; count?: number; product_id?: string; reference_product?: boolean }) {
// 异步生图:提交后立刻拿到任务列表,前端轮询直到出图。慢的 ARK 出图在 Celery worker 里跑——
// Web 层不被 ~30s 请求占住 → 健康探针不饿死 → 根治"几张图整站 502";且提交成功后浏览器关掉/断网,
// worker 仍会把图生成并落库(扣费/退费在 worker 内闭环),重开素材库即可见。
@@ -487,8 +502,10 @@ export function App() {
setBooting(false);
setAuthed(true);
navigate("dashboard", { replace: true });
void loadData().catch((error) => {
// 首登水合:与 boot 路径一致地重试,失败不再静默(否则页面卡在全 0,要刷新才好)
loadDataWithRetry().catch((error) => {
console.error("[login] data hydrate failed:", error);
setNotice({ type: "error", text: "数据加载失败,请刷新页面重试" });
});
}