fix(route): 修复聚合/码牌配置页首次打开触发 routeStrategyNotExist

useRouteHitPreview.load 原用 Promise.all 并发 getOrInitStrategy 与 listBasic/listScene,
首次打开(策略未落库)时后两者先到后端触发 requireStrategy 抛错。
拆出 getOrInitStrategy 先 await 确保策略落库,再并发其余依赖查询。
This commit is contained in:
DaxPay Dev
2026-07-20 09:42:15 +08:00
parent c93d41ed6a
commit abdd4dc597

View File

@@ -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<string, string> = {};
const providerMap: Record<string, string> = {};