diff --git a/web/src/views/im/registrationInvite/index.vue b/web/src/views/im/registrationInvite/index.vue index 10454e9..50c6e78 100644 --- a/web/src/views/im/registrationInvite/index.vue +++ b/web/src/views/im/registrationInvite/index.vue @@ -155,7 +155,7 @@ } // 重置后回填商户下拉第一个选项再查询(避免 tenantId 被清空导致后端拒绝查询) - const onSearchReset = imSearchReset(searchFormRef, tenantOptions, reloadTable); + const onSearchReset = imSearchReset(setFieldsValue, tenantOptions, reloadTable); function selectedTenantId() { return Number(searchFormRef.value?.formModel?.tenantId || 0); diff --git a/web/src/views/imDeadLetter/index.vue b/web/src/views/imDeadLetter/index.vue index 5ffdb98..992ab68 100644 --- a/web/src/views/imDeadLetter/index.vue +++ b/web/src/views/imDeadLetter/index.vue @@ -91,7 +91,7 @@ } // 重置后回填商户下拉第一个选项再查询(避免 tenantId 被清空导致列表为空) - const onSearchReset = imSearchReset(searchFormRef, tenantOptions, reloadTable); + const onSearchReset = imSearchReset(setFieldsValue, tenantOptions, reloadTable); onMounted(async () => { loadOptions(); diff --git a/web/src/views/imGroup/index.vue b/web/src/views/imGroup/index.vue index ecf8218..6cad6f2 100644 --- a/web/src/views/imGroup/index.vue +++ b/web/src/views/imGroup/index.vue @@ -106,7 +106,7 @@ } // 重置后回填商户下拉第一个选项再查询(避免 tenantId 被清空导致列表为空) - const onSearchReset = imSearchReset(searchFormRef, tenantOptions, reloadTable); + const onSearchReset = imSearchReset(setFieldsValue, tenantOptions, reloadTable); // 查看详情 function handleView(record: Recordable) { diff --git a/web/src/views/imKafkaCommand/index.vue b/web/src/views/imKafkaCommand/index.vue index f7da564..65f8b1f 100644 --- a/web/src/views/imKafkaCommand/index.vue +++ b/web/src/views/imKafkaCommand/index.vue @@ -82,7 +82,7 @@ } // 重置后回填商户下拉第一个选项再查询(避免 tenantId 被清空导致列表为空) - const onSearchReset = imSearchReset(searchFormRef, tenantOptions, reloadTable); + const onSearchReset = imSearchReset(setFieldsValue, tenantOptions, reloadTable); async function sendCacheInvalidate() { const tenant = getFirstTenant(); diff --git a/web/src/views/imRealname/index.vue b/web/src/views/imRealname/index.vue index 610e4da..b93dc2b 100644 --- a/web/src/views/imRealname/index.vue +++ b/web/src/views/imRealname/index.vue @@ -96,7 +96,7 @@ } // 重置后回填商户下拉第一个选项再查询(避免 tenantId 被清空导致列表为空) - const onSearchReset = imSearchReset(searchFormRef, tenantOptions, reloadTable); + const onSearchReset = imSearchReset(setFieldsValue, tenantOptions, reloadTable); function handleReview(record: State, status: string, reviewReason = '') { Review({ tenantId: record.tenantId, id: record.id, status, reviewReason }).then(() => { diff --git a/web/src/views/imSensitiveWord/index.vue b/web/src/views/imSensitiveWord/index.vue index 136b281..72c66fb 100644 --- a/web/src/views/imSensitiveWord/index.vue +++ b/web/src/views/imSensitiveWord/index.vue @@ -217,7 +217,7 @@ const resetTenantOptions = computed(() => policyTenantOptions.value.filter((v) => Number(v.value) > 0) ); - const onSearchReset = imSearchReset(searchFormRef, resetTenantOptions, reload); + const onSearchReset = imSearchReset(setFieldsValue, resetTenantOptions, reload); const actionColumn = reactive({ width: 150, title: '操作', @@ -315,7 +315,11 @@ } watch( () => searchFormRef.value?.formModel?.tenantId, - () => loadGroups() + () => { + // 重置瞬间 tenantId 会被清空,此时发起 tenantId=0 的分组查询必被后端拒绝; + // 跳过空租户,等回填后再加载。 + if (Number(searchFormRef.value?.formModel?.tenantId || 0) > 0) loadGroups(); + } ); onMounted(async () => { loadOptions(); diff --git a/web/src/views/imTaskDashboard/index.vue b/web/src/views/imTaskDashboard/index.vue index 609c2d4..e3d4739 100644 --- a/web/src/views/imTaskDashboard/index.vue +++ b/web/src/views/imTaskDashboard/index.vue @@ -60,7 +60,7 @@ } // 重置后回填商户下拉第一个选项再查询(避免 tenantId 被清空导致后端拒绝查询) - const onSearchReset = imSearchReset(searchFormRef, tenantOptions, reloadTable); + const onSearchReset = imSearchReset(setFieldsValue, tenantOptions, reloadTable); onMounted(async () => { loadOptions(); diff --git a/web/src/views/imTenantOptions.ts b/web/src/views/imTenantOptions.ts index a2e729c..c7d315d 100644 --- a/web/src/views/imTenantOptions.ts +++ b/web/src/views/imTenantOptions.ts @@ -46,8 +46,13 @@ export async function loadImTenantOptions( return target.value; } - const res = await TenantList(params); - target.value = (res?.list || []).map(toTenantOption); + // 平台账号:加载全部商户;失败时保留旧选项,避免页面初始化被单个请求失败打断 + try { + const res = await TenantList(params); + target.value = (res?.list || []).map(toTenantOption); + } catch (err) { + console.error('loadImTenantOptions failed:', err); + } return target.value; } @@ -71,26 +76,25 @@ export function lockTenantSchema(schema?: FormSchema) { props.clearable = false; } -interface ImSearchFormRef { - setFieldsValue: (values: Record) => Promise; -} - /** * 统一搜索重置回调:BasicForm 的 resetFields 会把包括 tenantId 在内的全部搜索字段清空, * 随后的自动查询因缺商户条件命中前端空列表 guard(或被后端以「请选择IM租户」拒绝)。 * 此工厂返回的回调在 reset 之后把商户下拉回填为当前选项列表的第一项 * (商户绑定账号=自己商户;平台账号=全部商户列表第一项),再触发查询—— * 与各页面初始加载(onMounted 默认选中第一项)的行为保持一致。 + * + * setFieldsValueFn 必须传页面 useForm() 解构出的 setFieldsValue(与 onMounted 同一通道), + * 不要用模板 ref 上的实例方法(可靠性不足)。 */ export function imSearchReset( - searchFormRef: Ref, + setFieldsValueFn: (values: Record) => Promise | void, tenantOptions: Ref, reload: () => unknown, ) { return async () => { const first = Number(tenantOptions.value[0]?.value || 0); if (first > 0) { - await searchFormRef.value?.setFieldsValue({ tenantId: first }); + await setFieldsValueFn({ tenantId: first }); } await reload(); }; diff --git a/web/src/views/imUser/index.vue b/web/src/views/imUser/index.vue index 9975715..9e606aa 100644 --- a/web/src/views/imUser/index.vue +++ b/web/src/views/imUser/index.vue @@ -382,7 +382,7 @@ } // 重置后回填商户下拉第一个选项再查询(避免 tenantId 被清空导致列表为空) - const onSearchReset = imSearchReset(searchFormRef, tenantOptions, reloadTable); + const onSearchReset = imSearchReset(setFieldsValue, tenantOptions, reloadTable); // 查看详情 function handleView(record: Recordable) { @@ -595,7 +595,12 @@ watch( () => searchFormRef.value?.formModel?.tenantId, - (tenantId) => loadPolicyGroupOptions(Number(tenantId || 0)) + (tenantId) => { + // 重置瞬间 formModel.tenantId 会被清空,此时发起 tenantId=0 的策略组查询必被后端拒绝; + // 跳过空租户,等回填后再加载。 + const tid = Number(tenantId || 0); + if (tid > 0) loadPolicyGroupOptions(tid); + } ); onMounted(async () => { diff --git a/web/src/views/imUserPolicyGroup/index.vue b/web/src/views/imUserPolicyGroup/index.vue index 73bac21..9e96f82 100644 --- a/web/src/views/imUserPolicyGroup/index.vue +++ b/web/src/views/imUserPolicyGroup/index.vue @@ -303,7 +303,7 @@ const resetTenantOptions = computed(() => policyTenantOptions.value.filter((v) => Number(v.value) > 0) ); - const onSearchReset = imSearchReset(searchFormRef, resetTenantOptions, reloadTable); + const onSearchReset = imSearchReset(setFieldsValue, resetTenantOptions, reloadTable); const actionColumn = reactive({ width: 300, title: '操作',