fix: backfill tenant via useForm channel and skip empty-tenant watch on search reset

- imSearchReset now receives setFieldsValue from useForm() instead of the
  template ref instance method, which was unreliable for backfilling tenantId
- imUser/imSensitiveWord watches skip tenantId<=0 so reset no longer fires
  policy-group/group requests that get rejected with empty tenant
- loadImTenantOptions wraps platform-branch TenantList in try/catch so a
  failed request no longer aborts page initialization
This commit is contained in:
Austin
2026-09-24 20:32:32 +08:00
parent 43f3581b1c
commit fce8dbbe32
10 changed files with 32 additions and 19 deletions
+12 -8
View File
@@ -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<string, any>) => Promise<void>;
}
/**
* 统一搜索重置回调:BasicForm 的 resetFields 会把包括 tenantId 在内的全部搜索字段清空,
* 随后的自动查询因缺商户条件命中前端空列表 guard(或被后端以「请选择IM租户」拒绝)。
* 此工厂返回的回调在 reset 之后把商户下拉回填为当前选项列表的第一项
* (商户绑定账号=自己商户;平台账号=全部商户列表第一项),再触发查询——
* 与各页面初始加载(onMounted 默认选中第一项)的行为保持一致。
*
* setFieldsValueFn 必须传页面 useForm() 解构出的 setFieldsValue(与 onMounted 同一通道),
* 不要用模板 ref 上的实例方法(可靠性不足)。
*/
export function imSearchReset(
searchFormRef: Ref<ImSearchFormRef | null>,
setFieldsValueFn: (values: Record<string, any>) => Promise<void> | void,
tenantOptions: Ref<ImTenantOption[]>,
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();
};