From 43f3581b1c0ce7c80401fc4056f3867cdc6e509a Mon Sep 17 00:00:00 2001 From: Austin Date: Thu, 24 Sep 2026 17:02:08 +0800 Subject: [PATCH] fix: restore tenant filter on search reset in IM pages BasicForm resetFields clears tenantId along with other fields, so the auto-query after reset hit the empty-list guard (or was rejected by the backend). Add a shared imSearchReset handler in imTenantOptions.ts that refills the tenant select with its first option (bound users keep their own tenant) before reloading, and wire it into the 9 IM list pages whose reset did not already refill the tenant condition. --- web/src/views/im/registrationInvite/index.vue | 6 ++++- web/src/views/imDeadLetter/index.vue | 6 ++++- web/src/views/imGroup/index.vue | 6 ++++- web/src/views/imKafkaCommand/index.vue | 6 ++++- web/src/views/imRealname/index.vue | 6 ++++- web/src/views/imSensitiveWord/index.vue | 8 +++++- web/src/views/imTaskDashboard/index.vue | 9 +++---- web/src/views/imTenantOptions.ts | 25 +++++++++++++++++++ web/src/views/imUser/index.vue | 6 ++++- web/src/views/imUserPolicyGroup/index.vue | 8 +++++- 10 files changed, 73 insertions(+), 13 deletions(-) diff --git a/web/src/views/im/registrationInvite/index.vue b/web/src/views/im/registrationInvite/index.vue index bfb8012..10454e9 100644 --- a/web/src/views/im/registrationInvite/index.vue +++ b/web/src/views/im/registrationInvite/index.vue @@ -8,7 +8,7 @@ ref="searchFormRef" @register="register" @submit="reloadTable" - @reset="reloadTable" + @reset="onSearchReset" @keyup.enter="reloadTable" /> { loadOptions(); await loadTenantOptions(); diff --git a/web/src/views/imGroup/index.vue b/web/src/views/imGroup/index.vue index 3fa2b81..ecf8218 100644 --- a/web/src/views/imGroup/index.vue +++ b/web/src/views/imGroup/index.vue @@ -8,7 +8,7 @@ ref="searchFormRef" @register="register" @submit="reloadTable" - @reset="reloadTable" + @reset="onSearchReset" @keyup.enter="reloadTable" /> @@ -36,6 +36,7 @@ import { BasicForm, useForm } from '@/components/Form/index'; import { CacheInvalidate, List, WorkbenchEvent } from '@/api/imKafkaCommand'; import { columns, loadOptions, loadTenantOptions, schemas, State, tenantOptions } from './model'; + import { imSearchReset } from '../imTenantOptions'; import { adaTableScrollX } from '@/utils/hotgo'; import ViewModal from './view.vue'; @@ -80,6 +81,9 @@ actionRef.value?.reload(); } + // 重置后回填商户下拉第一个选项再查询(避免 tenantId 被清空导致列表为空) + const onSearchReset = imSearchReset(searchFormRef, tenantOptions, reloadTable); + async function sendCacheInvalidate() { const tenant = getFirstTenant(); if (!tenant) { diff --git a/web/src/views/imRealname/index.vue b/web/src/views/imRealname/index.vue index bee893b..610e4da 100644 --- a/web/src/views/imRealname/index.vue +++ b/web/src/views/imRealname/index.vue @@ -8,7 +8,7 @@ ref="searchFormRef" @register="register" @submit="reloadTable" - @reset="reloadTable" + @reset="onSearchReset" /> { message.success('操作成功'); diff --git a/web/src/views/imSensitiveWord/index.vue b/web/src/views/imSensitiveWord/index.vue index a3a5725..136b281 100644 --- a/web/src/views/imSensitiveWord/index.vue +++ b/web/src/views/imSensitiveWord/index.vue @@ -6,7 +6,7 @@ ref="searchFormRef" @register="register" @submit="reload" - @reset="reload" + @reset="onSearchReset" @keyup.enter="reload" /> tableRef.value?.reload(); + // 重置后回填商户下拉再查询;回填跳过「全局默认」(value=0),与初始加载 getDefaultTenantValue 行为一致 + const resetTenantOptions = computed(() => + policyTenantOptions.value.filter((v) => Number(v.value) > 0) + ); + const onSearchReset = imSearchReset(searchFormRef, resetTenantOptions, reload); const actionColumn = reactive({ width: 150, title: '操作', diff --git a/web/src/views/imTaskDashboard/index.vue b/web/src/views/imTaskDashboard/index.vue index 74689fe..609c2d4 100644 --- a/web/src/views/imTaskDashboard/index.vue +++ b/web/src/views/imTaskDashboard/index.vue @@ -8,7 +8,7 @@ ref="searchFormRef" @register="register" @submit="reloadTable" - @reset="handleReset" + @reset="onSearchReset" @keyup.enter="reloadTable" /> { loadOptions(); diff --git a/web/src/views/imTenantOptions.ts b/web/src/views/imTenantOptions.ts index 4237f28..a2e729c 100644 --- a/web/src/views/imTenantOptions.ts +++ b/web/src/views/imTenantOptions.ts @@ -71,6 +71,31 @@ export function lockTenantSchema(schema?: FormSchema) { props.clearable = false; } +interface ImSearchFormRef { + setFieldsValue: (values: Record) => Promise; +} + +/** + * 统一搜索重置回调:BasicForm 的 resetFields 会把包括 tenantId 在内的全部搜索字段清空, + * 随后的自动查询因缺商户条件命中前端空列表 guard(或被后端以「请选择IM租户」拒绝)。 + * 此工厂返回的回调在 reset 之后把商户下拉回填为当前选项列表的第一项 + * (商户绑定账号=自己商户;平台账号=全部商户列表第一项),再触发查询—— + * 与各页面初始加载(onMounted 默认选中第一项)的行为保持一致。 + */ +export function imSearchReset( + searchFormRef: Ref, + tenantOptions: Ref, + reload: () => unknown, +) { + return async () => { + const first = Number(tenantOptions.value[0]?.value || 0); + if (first > 0) { + await searchFormRef.value?.setFieldsValue({ tenantId: first }); + } + await reload(); + }; +} + function toTenantOption(item: any): ImTenantOption { return { label: formatImTenantLabel(item), diff --git a/web/src/views/imUser/index.vue b/web/src/views/imUser/index.vue index 5a3af15..9975715 100644 --- a/web/src/views/imUser/index.vue +++ b/web/src/views/imUser/index.vue @@ -8,7 +8,7 @@ ref="searchFormRef" @register="register" @submit="reloadTable" - @reset="reloadTable" + @reset="onSearchReset" @keyup.enter="reloadTable" /> @@ -241,6 +241,7 @@ parseJSON, policyTenantOptions, } from '@/views/imPolicyShared'; + import { imSearchReset } from '../imTenantOptions'; const dict = useDictStore(), message = useMessage(), @@ -298,6 +299,11 @@ actionRef.value?.reload(); refreshLoginIPSummary(); }; + // 重置后回填商户下拉再查询;回填跳过「全局默认」(value=0),与初始加载 getDefaultTenantValue 行为一致 + const resetTenantOptions = computed(() => + policyTenantOptions.value.filter((v) => Number(v.value) > 0) + ); + const onSearchReset = imSearchReset(searchFormRef, resetTenantOptions, reloadTable); const actionColumn = reactive({ width: 300, title: '操作',