From abdd4dc597f009629ab13e54d8fd69fe86c9c3ff Mon Sep 17 00:00:00 2001 From: DaxPay Dev Date: Mon, 20 Jul 2026 09:42:15 +0800 Subject: [PATCH] =?UTF-8?q?fix(route):=20=E4=BF=AE=E5=A4=8D=E8=81=9A?= =?UTF-8?q?=E5=90=88/=E7=A0=81=E7=89=8C=E9=85=8D=E7=BD=AE=E9=A1=B5?= =?UTF-8?q?=E9=A6=96=E6=AC=A1=E6=89=93=E5=BC=80=E8=A7=A6=E5=8F=91=20routeS?= =?UTF-8?q?trategyNotExist?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit useRouteHitPreview.load 原用 Promise.all 并发 getOrInitStrategy 与 listBasic/listScene, 首次打开(策略未落库)时后两者先到后端触发 requireStrategy 抛错。 拆出 getOrInitStrategy 先 await 确保策略落库,再并发其余依赖查询。 --- .../merchant/shared/useRouteHitPreview.ts | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/apps/daxpay-admin/src/views/payment/merchant/shared/useRouteHitPreview.ts b/apps/daxpay-admin/src/views/payment/merchant/shared/useRouteHitPreview.ts index 7f578a7c9..dbe8fac44 100644 --- a/apps/daxpay-admin/src/views/payment/merchant/shared/useRouteHitPreview.ts +++ b/apps/daxpay-admin/src/views/payment/merchant/shared/useRouteHitPreview.ts @@ -68,17 +68,21 @@ export function useRouteHitPreview() { } loading.value = true; try { - const [{ data: strategy }, { data: basicRows }, { data: sceneRows }, { data: directory }] = - await Promise.all([ - PayRouteApi.getOrInitStrategy(appId), - PayRouteApi.listBasicConfig(appId), - PayRouteApi.listSceneConfig(appId), - PayRouteApi.listMethodDirectoryFlat(), - ]); + // 先确保 strategy 已落库(首次打开会创建),避免与依赖它的 basic/scene 查询并发竞态 + // 后端 listBasicConfig/listSceneConfig 内部 requireStrategy 是「必须存在」语义, + // 若与 getOrInitStrategy 并发,可能在 strategy 落库前到达后端而抛 routeStrategyNotExist + const { data: strategy } = await PayRouteApi.getOrInitStrategy(appId); // get-or-init 成功则有 mode;异常为空时 preview 返回 noStrategy routeMode.value = strategy?.mode ? normalizePayRouteMode(strategy.mode) : ''; + // strategy 存在后再并发拉取依赖数据 + const [{ data: basicRows }, { data: sceneRows }, { data: directory }] = await Promise.all([ + PayRouteApi.listBasicConfig(appId), + PayRouteApi.listSceneConfig(appId), + PayRouteApi.listMethodDirectoryFlat(), + ]); + // 目录:method 标签与 provider 映射 const labelMap: Record = {}; const providerMap: Record = {};