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 { export interface UserListResponse {
code: number; code: number;
message: string; message: string;
data: UserItem[]; data?: UserItem[] | { data?: UserItem[] };
details?: UserItem[] | { data?: UserItem[] };
} }
/** /**
* 获取用户列表 * 获取用户列表
*/ */
export const fetchUserList = async (data: any) => { 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="请选择处理人" placeholder="请选择处理人"
allow-search allow-search
allow-clear allow-clear
:filter-option="false"
:loading="userLoading" :loading="userLoading"
@search="handleUserSearch"
:style="{ width: '100%' }" :style="{ width: '100%' }"
:trigger-props="selectTriggerProps"
> >
<a-option v-for="user in userOptions" :key="user.id" :value="user.id"> <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-option>
</a-select> </a-select>
</template> </template>
@@ -133,9 +136,18 @@
</a-form-item> </a-form-item>
<a-form-item label="默认处理人"> <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"> <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-option>
</a-select> </a-select>
</a-form-item> </a-form-item>
@@ -153,6 +165,7 @@ import { ref, reactive, watch } from 'vue'
import { Message } from '@arco-design/web-vue' import { Message } from '@arco-design/web-vue'
import type { FormInstance } from '@arco-design/web-vue' import type { FormInstance } from '@arco-design/web-vue'
import { createPolicy, fetchTemplateList, fetchSeverityList, fetchFeedbackTemplateOptions } from '@/api/ops/alertPolicy' import { createPolicy, fetchTemplateList, fetchSeverityList, fetchFeedbackTemplateOptions } from '@/api/ops/alertPolicy'
import { fetchUserList } from '@/api/ops/rbac2'
interface Props { interface Props {
visible: boolean visible: boolean
@@ -201,11 +214,7 @@ const formRules = {
const templateOptions = ref<any[]>([]) const templateOptions = ref<any[]>([])
const feedbackTemplateOptions = ref<any[]>([]) const feedbackTemplateOptions = ref<any[]>([])
const userOptions = ref<any[]>([ const userOptions = ref<any[]>([])
{ id: 1, name: '张三', username: 'zhangsan' },
{ id: 2, name: '李四', username: 'lisi' },
{ id: 3, name: '王五', username: 'wangwu' },
])
const severityList = ref<any[]>([ const severityList = ref<any[]>([
{ code: 'critical', name: '严重', color: 'red' }, { code: 'critical', name: '严重', color: 'red' },
{ code: 'major', name: '重要', color: 'orange' }, { 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 () => { const loadFeedbackTemplateOptions = async () => {
feedbackTemplateLoading.value = true feedbackTemplateLoading.value = true
try { try {
@@ -361,6 +415,7 @@ watch(
loadTemplateOptions() loadTemplateOptions()
loadSeverityList() loadSeverityList()
loadFeedbackTemplateOptions() loadFeedbackTemplateOptions()
loadUserOptions()
initDispatchRuleData() initDispatchRuleData()
</script> </script>

View File

@@ -167,15 +167,18 @@
placeholder="请选择处理人" placeholder="请选择处理人"
allow-search allow-search
allow-clear allow-clear
:filter-option="false"
:loading="userLoading" :loading="userLoading"
@search="handleUserSearch"
:style="{ width: '100%' }" :style="{ width: '100%' }"
:trigger-props="selectTriggerProps"
> >
<a-option <a-option
v-for="user in userOptions" v-for="user in userOptions"
:key="user.id" :key="user.id"
:value="user.id" :value="user.id"
> >
{{ user.name || user.username }} ({{ user.username }}) {{ user.name || user.account }} ({{ user.account }})
</a-option> </a-option>
</a-select> </a-select>
</template> </template>
@@ -190,14 +193,17 @@
placeholder="请选择默认处理人" placeholder="请选择默认处理人"
allow-search allow-search
allow-clear allow-clear
:filter-option="false"
:loading="userLoading" :loading="userLoading"
@search="handleUserSearch"
:trigger-props="selectTriggerProps"
> >
<a-option <a-option
v-for="user in userOptions" v-for="user in userOptions"
:key="user.id" :key="user.id"
:value="user.id" :value="user.id"
> >
{{ user.name || user.username }} ({{ user.username }}) {{ user.name || user.account }} ({{ user.account }})
</a-option> </a-option>
</a-select> </a-select>
</a-form-item> </a-form-item>
@@ -223,6 +229,7 @@ import {
fetchSeverityList, fetchSeverityList,
fetchFeedbackTemplateOptions, fetchFeedbackTemplateOptions,
} from '@/api/ops/alertPolicy' } from '@/api/ops/alertPolicy'
import { fetchUserList } from '@/api/ops/rbac2'
// Props // Props
interface Props { interface Props {
@@ -283,11 +290,7 @@ const templateOptions = ref<any[]>([])
const feedbackTemplateOptions = ref<any[]>([]) const feedbackTemplateOptions = ref<any[]>([])
// 用户选项(模拟数据,实际应从用户服务获取) // 用户选项(模拟数据,实际应从用户服务获取)
const userOptions = ref<any[]>([ const userOptions = ref<any[]>([])
{ id: 1, name: '张三', username: 'zhangsan' },
{ id: 2, name: '李四', username: 'lisi' },
{ id: 3, name: '王五', username: 'wangwu' },
])
// 告警级别列表 // 告警级别列表
const severityList = 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 () => { const loadFeedbackTemplateOptions = async () => {
feedbackTemplateLoading.value = true feedbackTemplateLoading.value = true
try { try {
@@ -530,6 +578,7 @@ watch(
loadTemplateOptions() loadTemplateOptions()
loadSeverityList() loadSeverityList()
loadFeedbackTemplateOptions() loadFeedbackTemplateOptions()
loadUserOptions()
initDispatchRuleData() initDispatchRuleData()
</script> </script>