This commit is contained in:
zxr
2026-03-23 17:49:20 +08:00
parent dc48c1635a
commit 98f2d29f86
3 changed files with 122 additions and 17 deletions

View File

@@ -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<UserListResponse>('/rbac2/v1/user/list', data);
return request.post<UserListResponse>('/rbac2/v1/user/list', data, { needWorkspace: true });
};

View File

@@ -119,11 +119,14 @@
placeholder="请选择处理人"
allow-search
allow-clear
:filter-option="false"
:loading="userLoading"
@search="handleUserSearch"
:style="{ width: '100%' }"
:trigger-props="selectTriggerProps"
>
<a-option v-for="user in userOptions" :key="user.id" :value="user.id">
{{ user.name || user.username }} ({{ user.username }})
{{ user.name || user.account }} ({{ user.account }})
</a-option>
</a-select>
</template>
@@ -133,9 +136,18 @@
</a-form-item>
<a-form-item label="默认处理人">
<a-select v-model="defaultAssigneeId" placeholder="请选择默认处理人" allow-search allow-clear :loading="userLoading">
<a-select
v-model="defaultAssigneeId"
placeholder="请选择默认处理人"
allow-search
allow-clear
:filter-option="false"
:loading="userLoading"
@search="handleUserSearch"
:trigger-props="selectTriggerProps"
>
<a-option v-for="user in userOptions" :key="user.id" :value="user.id">
{{ user.name || user.username }} ({{ user.username }})
{{ user.name || user.account }} ({{ user.account }})
</a-option>
</a-select>
</a-form-item>
@@ -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<any[]>([])
const feedbackTemplateOptions = ref<any[]>([])
const userOptions = ref<any[]>([
{ id: 1, name: '张三', username: 'zhangsan' },
{ id: 2, name: '李四', username: 'lisi' },
{ id: 3, name: '王五', username: 'wangwu' },
])
const userOptions = ref<any[]>([])
const severityList = ref<any[]>([
{ 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()
</script>

View File

@@ -167,15 +167,18 @@
placeholder="请选择处理人"
allow-search
allow-clear
:filter-option="false"
:loading="userLoading"
@search="handleUserSearch"
:style="{ width: '100%' }"
:trigger-props="selectTriggerProps"
>
<a-option
v-for="user in userOptions"
:key="user.id"
:value="user.id"
>
{{ user.name || user.username }} ({{ user.username }})
{{ user.name || user.account }} ({{ user.account }})
</a-option>
</a-select>
</template>
@@ -190,14 +193,17 @@
placeholder="请选择默认处理人"
allow-search
allow-clear
:filter-option="false"
:loading="userLoading"
@search="handleUserSearch"
:trigger-props="selectTriggerProps"
>
<a-option
v-for="user in userOptions"
:key="user.id"
:value="user.id"
>
{{ user.name || user.username }} ({{ user.username }})
{{ user.name || user.account }} ({{ user.account }})
</a-option>
</a-select>
</a-form-item>
@@ -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<any[]>([])
const feedbackTemplateOptions = ref<any[]>([])
// 用户选项(模拟数据,实际应从用户服务获取)
const userOptions = ref<any[]>([
{ id: 1, name: '张三', username: 'zhangsan' },
{ id: 2, name: '李四', username: 'lisi' },
{ id: 3, name: '王五', username: 'wangwu' },
])
const userOptions = ref<any[]>([])
// 告警级别列表
const severityList = ref<any[]>([
@@ -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()
</script>