diff --git a/frontend-web/src/roundtable-planning/pages/BusinessChainEditorPage.tsx b/frontend-web/src/roundtable-planning/pages/BusinessChainEditorPage.tsx index 737f4586..fabac967 100644 --- a/frontend-web/src/roundtable-planning/pages/BusinessChainEditorPage.tsx +++ b/frontend-web/src/roundtable-planning/pages/BusinessChainEditorPage.tsx @@ -327,17 +327,21 @@ export default function BusinessChainEditorPage() { setStep(1); }, []); - // ─── URL 参数 chainId:从「业务链条」弹窗点「设置」进来时自动切到该链条 ────── - // 只在链条列表加载完后应用一次(用 ref 闸门避免覆盖用户后续的手动切换)。 - const appliedChainParamRef = useRef(false); + // ─── URL 参数 chainId:从「业务链条」弹窗 / 列表点「设置」进来时自动切到该链条 ────── + // 按「已应用的 chainId」做闸门(而非「只应用一次」):当 URL 的 chainId 变化时重新加载。 + // 关键修复:此编辑器实例在多次导航间可能不卸载(从弹窗进来时尤甚),用「只应用一次」的 + // 旧闸门会导致第二次打开另一条链条时根本不加载,currentChainId 停在上一条 → 保存打到错误 + // 的 id → 后端 404「已删除」,必须重新登录(整页刷新重建组件)才恢复。改为追踪已应用的 id + // 后,chainId 变了就重载;同一 chainId 不重复加载,也不覆盖用户在编辑器内的手动切换。 + const appliedChainIdRef = useRef(null); useEffect(() => { - if (appliedChainParamRef.current) return; const chainId = searchParams.get("chainId"); if (!chainId) return; - appliedChainParamRef.current = true; // 只应用一次,之后不覆盖用户手动切换 + if (appliedChainIdRef.current === chainId) return; // 这条已加载过,别覆盖用户后续操作 + appliedChainIdRef.current = chainId; // 优先用「我的链条」列表里已拉到的对象(省一次请求);不在列表里(管理员从「全部链条」 // 点设置 / 公共链条 / 自己没有任何链条)则直接按 id 拉取。后端对管理员放开任意链条、 - // 对所有人放开已发布公共链条;拉不到则静默保持空白新建态。 + // 对所有人放开已发布公共链条;拉不到给出提示并保持空白新建态。 const local = chains.find((c) => c.id === chainId); if (local) { loadChain(local); @@ -347,6 +351,7 @@ export default function BusinessChainEditorPage() { try { const chain = await getChain(chainId); if (chain) loadChain(chain); + else toast.error("该业务链条不存在或无权访问"); } catch { // 静默:取不到就保持当前(空白)状态。 }