diff --git a/src/api/ops/rbac2.ts b/src/api/ops/rbac2.ts index e6a495a..d83bf7c 100644 --- a/src/api/ops/rbac2.ts +++ b/src/api/ops/rbac2.ts @@ -20,12 +20,13 @@ export interface UserItem { export interface UserListResponse { code: number; message: string; - data: UserItem[]; + data?: UserItem[] | { data?: UserItem[] }; + details?: UserItem[] | { data?: UserItem[] }; } /** * 获取用户列表 */ export const fetchUserList = async (data: any) => { - return request.post('/rbac2/v1/user/list', data); + return request.post('/rbac2/v1/user/list', data, { needWorkspace: true }); }; diff --git a/src/views/ops/pages/alert/setting/components/PolicyCreateDialog.vue b/src/views/ops/pages/alert/setting/components/PolicyCreateDialog.vue index d77feec..8705dab 100644 --- a/src/views/ops/pages/alert/setting/components/PolicyCreateDialog.vue +++ b/src/views/ops/pages/alert/setting/components/PolicyCreateDialog.vue @@ -119,11 +119,14 @@ placeholder="请选择处理人" allow-search allow-clear + :filter-option="false" :loading="userLoading" + @search="handleUserSearch" :style="{ width: '100%' }" + :trigger-props="selectTriggerProps" > - {{ user.name || user.username }} ({{ user.username }}) + {{ user.name || user.account }} ({{ user.account }}) @@ -133,9 +136,18 @@ - + - {{ user.name || user.username }} ({{ user.username }}) + {{ user.name || user.account }} ({{ user.account }}) @@ -153,6 +165,7 @@ import { ref, reactive, watch } from 'vue' import { Message } from '@arco-design/web-vue' import type { FormInstance } from '@arco-design/web-vue' import { createPolicy, fetchTemplateList, fetchSeverityList, fetchFeedbackTemplateOptions } from '@/api/ops/alertPolicy' +import { fetchUserList } from '@/api/ops/rbac2' interface Props { visible: boolean @@ -201,11 +214,7 @@ const formRules = { const templateOptions = ref([]) const feedbackTemplateOptions = ref([]) -const userOptions = ref([ - { id: 1, name: '张三', username: 'zhangsan' }, - { id: 2, name: '李四', username: 'lisi' }, - { id: 3, name: '王五', username: 'wangwu' }, -]) +const userOptions = ref([]) const severityList = ref([ { code: 'critical', name: '严重', color: 'red' }, { code: 'major', name: '重要', color: 'orange' }, @@ -242,6 +251,51 @@ const loadSeverityList = async () => { } } +const loadUserOptions = async (keyword = '') => { + userLoading.value = true + try { + const workspace = import.meta.env.VITE_APP_WORKSPACE || '' + const res = await fetchUserList({ + workspace, + keyword: keyword || undefined, + status: 1, + }) + const rawList = Array.isArray(res?.data?.data) + ? res.data.data + : Array.isArray(res?.details?.data) + ? res.details.data + : Array.isArray(res?.details) + ? res.details + : Array.isArray(res?.data) + ? res.data + : [] + userOptions.value = rawList.map((item: any) => ({ + id: Number(item.id), + name: item.name || '', + account: item.account || item.username || '', + })) + } catch (error) { + console.error('获取用户下拉选项失败:', error) + userOptions.value = [] + } finally { + userLoading.value = false + } +} + +const handleUserSearch = (value: string) => { + loadUserOptions(value) +} + +const getSelectPopupContainer = (triggerNode: HTMLElement) => { + return triggerNode.closest('.arco-modal') || document.body +} + +const selectTriggerProps = { + updateAtScroll: true, + autoFitPopupMinWidth: true, + getPopupContainer: getSelectPopupContainer, +} + const loadFeedbackTemplateOptions = async () => { feedbackTemplateLoading.value = true try { @@ -361,6 +415,7 @@ watch( loadTemplateOptions() loadSeverityList() loadFeedbackTemplateOptions() +loadUserOptions() initDispatchRuleData() diff --git a/src/views/ops/pages/alert/setting/components/PolicyFormDialog.vue b/src/views/ops/pages/alert/setting/components/PolicyFormDialog.vue index 6277285..bdbcf48 100644 --- a/src/views/ops/pages/alert/setting/components/PolicyFormDialog.vue +++ b/src/views/ops/pages/alert/setting/components/PolicyFormDialog.vue @@ -167,15 +167,18 @@ placeholder="请选择处理人" allow-search allow-clear + :filter-option="false" :loading="userLoading" + @search="handleUserSearch" :style="{ width: '100%' }" + :trigger-props="selectTriggerProps" > - {{ user.name || user.username }} ({{ user.username }}) + {{ user.name || user.account }} ({{ user.account }}) @@ -190,14 +193,17 @@ placeholder="请选择默认处理人" allow-search allow-clear + :filter-option="false" :loading="userLoading" + @search="handleUserSearch" + :trigger-props="selectTriggerProps" > - {{ user.name || user.username }} ({{ user.username }}) + {{ user.name || user.account }} ({{ user.account }}) @@ -223,6 +229,7 @@ import { fetchSeverityList, fetchFeedbackTemplateOptions, } from '@/api/ops/alertPolicy' +import { fetchUserList } from '@/api/ops/rbac2' // Props interface Props { @@ -283,11 +290,7 @@ const templateOptions = ref([]) const feedbackTemplateOptions = ref([]) // 用户选项(模拟数据,实际应从用户服务获取) -const userOptions = ref([ - { id: 1, name: '张三', username: 'zhangsan' }, - { id: 2, name: '李四', username: 'lisi' }, - { id: 3, name: '王五', username: 'wangwu' }, -]) +const userOptions = ref([]) // 告警级别列表 const severityList = ref([ @@ -329,6 +332,51 @@ const loadSeverityList = async () => { } } +const loadUserOptions = async (keyword = '') => { + userLoading.value = true + try { + const workspace = import.meta.env.VITE_APP_WORKSPACE || '' + const res = await fetchUserList({ + workspace, + keyword: keyword || undefined, + status: 1, + }) + const rawList = Array.isArray(res?.data?.data) + ? res.data.data + : Array.isArray(res?.details?.data) + ? res.details.data + : Array.isArray(res?.details) + ? res.details + : Array.isArray(res?.data) + ? res.data + : [] + userOptions.value = rawList.map((item: any) => ({ + id: Number(item.id), + name: item.name || '', + account: item.account || item.username || '', + })) + } catch (error) { + console.error('获取用户下拉选项失败:', error) + userOptions.value = [] + } finally { + userLoading.value = false + } +} + +const handleUserSearch = (value: string) => { + loadUserOptions(value) +} + +const getSelectPopupContainer = (triggerNode: HTMLElement) => { + return triggerNode.closest('.arco-modal') || document.body +} + +const selectTriggerProps = { + updateAtScroll: true, + autoFitPopupMinWidth: true, + getPopupContainer: getSelectPopupContainer, +} + const loadFeedbackTemplateOptions = async () => { feedbackTemplateLoading.value = true try { @@ -530,6 +578,7 @@ watch( loadTemplateOptions() loadSeverityList() loadFeedbackTemplateOptions() +loadUserOptions() initDispatchRuleData()