自定义指标

This commit is contained in:
lai
2024-09-06 19:22:25 +08:00
parent ca82a0a74b
commit 9ac3524877
2 changed files with 262 additions and 265 deletions

View File

@@ -8,57 +8,72 @@ import { parseDateToStr } from '@/utils/date-utils';
* @param query 查询参数 * @param query 查询参数
* @returns object * @returns object
*/ */
export async function listCustom(query: Record<string, any>) { // export async function listCustom(query: Record<string, any>) {
let totalSQL = 'select count(*) as total from pm_custom_title where 1=1 '; // let totalSQL = 'select count(*) as total from pm_custom_title where 1=1 ';
let rowsSQL = 'select * from pm_custom_title where 1=1 '; // let rowsSQL = 'select * from pm_custom_title where 1=1 ';
// 查询 // // 查询
let querySQL = ''; // let querySQL = '';
if (query.neType) { // if (query.neType) {
querySQL += ` and ne_type like '%${query.neType}%' `; // querySQL += ` and ne_type like '%${query.neType}%' `;
} // }
// 排序 // // 排序
let sortSql = ' order by update_time '; // let sortSql = ' order by update_time ';
if (query.sortOrder === 'asc') { // if (query.sortOrder === 'asc') {
sortSql += ' asc '; // sortSql += ' asc ';
} else { // } else {
sortSql += ' desc '; // sortSql += ' desc ';
} // }
// 分页 // // 分页
const pageNum = (query.pageNum - 1) * query.pageSize; // const pageNum = (query.pageNum - 1) * query.pageSize;
const limtSql = ` limit ${pageNum},${query.pageSize} `; // const limtSql = ` limit ${pageNum},${query.pageSize} `;
// // 发起请求
// const result = await request({
// url: `/api/rest/databaseManagement/v1/select/omc_db/pm_custom_title`,
// method: 'get',
// params: {
// totalSQL: totalSQL + querySQL,
// rowsSQL: rowsSQL + querySQL + sortSql + limtSql,
// },
// });
// // 解析数据
// if (result.code === RESULT_CODE_SUCCESS) {
// const data: DataList = {
// total: 0,
// rows: [],
// code: result.code,
// msg: result.msg,
// };
// result.data.data.forEach((item: any) => {
// const itemData = item['pm_custom_title'];
// if (Array.isArray(itemData)) {
// if (itemData.length === 1 && itemData[0]['total'] >= 0) {
// data.total = itemData[0]['total'];
// } else {
// data.rows = itemData.map(v => parseObjLineToHump(v));
// }
// }
// });
// return data;
// }
// return result;
// }
/**
* 新 查询自定义指标
* @param query 查询参数
* @returns object
*/
export async function listCustom(query?: Record<string, any>) {
// 发起请求 // 发起请求
const result = await request({ const result = await request({
url: `/api/rest/databaseManagement/v1/select/omc_db/pm_custom_title`, url: `/pm/kpiC/title/totalList`,
method: 'get', method: 'get',
params: { params: query,
totalSQL: totalSQL + querySQL,
rowsSQL: rowsSQL + querySQL + sortSql + limtSql,
},
}); });
// 解析数据
if (result.code === RESULT_CODE_SUCCESS) {
const data: DataList = {
total: 0,
rows: [],
code: result.code,
msg: result.msg,
};
result.data.data.forEach((item: any) => {
const itemData = item['pm_custom_title'];
if (Array.isArray(itemData)) {
if (itemData.length === 1 && itemData[0]['total'] >= 0) {
data.total = itemData[0]['total'];
} else {
data.rows = itemData.map(v => parseObjLineToHump(v));
}
}
});
return data;
}
return result; return result;
} }
@@ -68,22 +83,10 @@ export async function listCustom(query: Record<string, any>) {
* @returns object * @returns object
*/ */
export async function getCustom(id: string | number) { export async function getCustom(id: string | number) {
// 发起请求 return request({
const result = await request({ url: `/pm/kpiC/title/${id}`,
url: `/api/rest/databaseManagement/v1/select/omc_db/pm_custom_title`,
method: 'get', method: 'get',
params: {
SQL: `select * from pm_custom_title where id = ${id}`,
},
}); });
// 解析数据
if (result.code === RESULT_CODE_SUCCESS && Array.isArray(result.data.data)) {
let data = result.data.data[0];
return Object.assign(result, {
data: parseObjLineToHump(data['pm_custom_title'][0]),
});
}
return result;
} }
/** /**
@@ -92,21 +95,10 @@ export async function getCustom(id: string | number) {
* @returns object * @returns object
*/ */
export function addCustom(data: Record<string, any>) { export function addCustom(data: Record<string, any>) {
let obj: any = {
title: data.title,
ne_type: data.neType,
kpi_id: data.kpiId,
object_type: data.objectType,
expression: data.expression,
period: data.period,
description: data.description,
kpi_set: data.kpiSet,
};
return request({ return request({
url: `/api/rest/databaseManagement/v1/omc_db/pm_custom_title`, url: `/pm/kpiC/title`,
method: 'post', method: 'post',
data: { 'data': [obj] }, data: data,
}); });
} }
@@ -116,20 +108,10 @@ export function addCustom(data: Record<string, any>) {
* @returns object * @returns object
*/ */
export function updateCustom(data: Record<string, any>) { export function updateCustom(data: Record<string, any>) {
let obj: any = {
title: data.title,
ne_type: data.neType,
kpi_id: data.kpiId,
object_type: data.objectType,
expression: data.expression,
period: data.period,
description: data.description,
kpi_set: data.kpiSet,
};
return request({ return request({
url: `/api/rest/databaseManagement/v1/omc_db/pm_custom_title?WHERE=id=${data.id}`, url: `/pm/kpiC/title/${data.id}`,
method: 'put', method: 'put',
data: { data: obj }, data: data,
}); });
} }
@@ -139,8 +121,7 @@ export function updateCustom(data: Record<string, any>) {
*/ */
export async function delCustom(data: Record<string, any>) { export async function delCustom(data: Record<string, any>) {
return request({ return request({
url: `/api/rest/databaseManagement/v1/omc_db/pm_custom_title?WHERE=id=${data.id}`, url: `/pm/kpiC/title/${data.id}`,
method: 'delete', method: 'delete',
}); });
} }

View File

@@ -7,8 +7,8 @@ import { MenuInfo } from 'ant-design-vue/lib/menu/src/interface';
import { ColumnsType } from 'ant-design-vue/lib/table'; import { ColumnsType } from 'ant-design-vue/lib/table';
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants'; import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import useI18n from '@/hooks/useI18n'; import useI18n from '@/hooks/useI18n';
import useDictStore from '@/store/modules/dict';
import useNeInfoStore from '@/store/modules/neinfo'; import useNeInfoStore from '@/store/modules/neinfo';
import { parseObjLineToHump } from '@/utils/parse-utils';
import { import {
addCustom, addCustom,
delCustom, delCustom,
@@ -16,15 +16,17 @@ import {
listCustom, listCustom,
updateCustom, updateCustom,
} from '@/api/perfManage/customTarget'; } from '@/api/perfManage/customTarget';
const { getDict } = useDictStore(); import { getKPITitle } from '@/api/perfManage/goldTarget';
import useDictStore from '@/store/modules/dict';
const { t, currentLocale } = useI18n(); const { t, currentLocale } = useI18n();
const { getDict } = useDictStore();
/**字典数据 */ /**字典数据 */
let dict: { let dict: {
/**原始严重程度 */ /**状态 */
activeAlarmSeverity: DictType[]; sysNormalDisable: DictType[];
} = reactive({ } = reactive({
activeAlarmSeverity: [], sysNormalDisable: [],
}); });
/**查询参数 */ /**查询参数 */
@@ -85,15 +87,22 @@ let tableColumns: ColumnsType = [
align: 'center', align: 'center',
}, },
{ {
title: t('views.perfManage.customTarget.kpiSet'), title: t('views.perfManage.customTarget.title'),
dataIndex: 'kpiSet', dataIndex: 'title',
align: 'center', align: 'center',
}, },
{ {
title: t('views.perfManage.customTarget.period'), title: t('views.perfManage.customTarget.description'),
dataIndex: 'threshold', dataIndex: 'description',
align: 'center', align: 'center',
}, },
{
title: t('views.perfManage.customTarget.status'),
dataIndex: 'status',
key: 'status',
align: 'left',
width: 100,
},
{ {
title: t('common.operate'), title: t('common.operate'),
key: 'id', key: 'id',
@@ -175,13 +184,14 @@ function fnGetList(pageNum?: number) {
queryParams.pageNum = pageNum; queryParams.pageNum = pageNum;
} }
listCustom(toRaw(queryParams)).then(res => { listCustom(toRaw(queryParams)).then(res => {
if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.rows)) { if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.data)) {
// 取消勾选 // 取消勾选
if (tableState.selectedRowKeys.length > 0) { if (tableState.selectedRowKeys.length > 0) {
tableState.selectedRowKeys = []; tableState.selectedRowKeys = [];
} }
tablePagination.total = res.total; tablePagination.total = res.total;
tableState.data = res.rows; tableState.data = res.data;
if ( if (
tablePagination.total <= tablePagination.total <=
(queryParams.pageNum - 1) * tablePagination.pageSize && (queryParams.pageNum - 1) * tablePagination.pageSize &&
@@ -207,8 +217,6 @@ type ModalStateType = {
neType: string[]; neType: string[];
/**网元类型性能测量集 */ /**网元类型性能测量集 */
neTypPerformance: Record<string, any>[]; neTypPerformance: Record<string, any>[];
/**网元类型对象类型集 */
objectTypeArr: Record<string, any>[];
/**已选择性能测量项 */ /**已选择性能测量项 */
selectedPre: string[]; selectedPre: string[];
/**表单数据 */ /**表单数据 */
@@ -224,21 +232,32 @@ let modalState: ModalStateType = reactive({
title: '', title: '',
neType: [], neType: [],
neTypPerformance: [], neTypPerformance: [],
objectTypeArr: [],
selectedPre: [], selectedPre: [],
from: { from: {
id: '', id: undefined,
neType: '', neType: 'UDM',
objectType: '',
expression: '',
kpiSet: '',
title: '',
kpiId: '', kpiId: '',
period: 900, title: '',
expression: '',
status: 'Active',
unit: '',
description: '',
}, },
confirmLoading: false, confirmLoading: false,
}); });
/**表单中多选的OPTION */
const modalStateFromOption = reactive({
symbolJson: [
{ label: '(', value: '(' },
{ label: ')', value: ')' },
{ label: '+', value: '+' },
{ label: '-', value: '-' },
{ label: '*', value: '*' },
{ label: '/', value: '/' },
],
});
/**对话框内表单属性和校验规则 */ /**对话框内表单属性和校验规则 */
const modalStateFrom = Form.useForm( const modalStateFrom = Form.useForm(
modalState.from, modalState.from,
@@ -249,14 +268,6 @@ const modalStateFrom = Form.useForm(
message: t('views.traceManage.task.neTypePlease'), message: t('views.traceManage.task.neTypePlease'),
}, },
], ],
objectType: [
{
required: true,
message:
t('views.perfManage.customTarget.objectType') +
t('common.unableNull'),
},
],
expression: [ expression: [
{ {
required: true, required: true,
@@ -279,60 +290,33 @@ const modalStateFrom = Form.useForm(
t('views.perfManage.customTarget.title') + t('common.unableNull'), t('views.perfManage.customTarget.title') + t('common.unableNull'),
}, },
], ],
period: [
{
required: true,
message:
t('views.perfManage.customTarget.period') + t('common.unableNull'),
},
],
}) })
); );
/**性能测量数据集选择初始 */ /**性能测量数据集选择初始 value:neType*/
function fnSelectPerformanceInit(value: any) { function fnSelectPerformanceInit(value: any) {
const performance = useNeInfoStore().perMeasurementList.filter(
i => i.neType === value
);
if (modalState.from.objectType) modalState.from.objectType = '';
if (modalState.selectedPre.length > 0) modalState.selectedPre = [];
modalState.from.expression = ''; modalState.from.expression = '';
const arrSet = new Set<string>(); modalState.neTypPerformance = [{value:'granularity',label:t('views.perfManage.customTarget.granularity')}];
performance.forEach((data: any) => { // 当前语言
arrSet.add(data.objectType); var language = currentLocale.value.split('_')[0];
if (language === 'zh') language = 'cn';
// 获取表头文字
getKPITitle(value).then(res => {
if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.data)) {
for (const item of res.data) {
const kpiDisplay = item[`${language}Title`];
const kpiValue = item[`kpiId`];
modalState.neTypPerformance.push({
value: kpiValue,
label: kpiDisplay,
});
}
} else {
message.warning({
content: t('common.getInfoFail'),
duration: 2,
}); });
// 组装对象类型options
modalState.objectTypeArr = Array.from(arrSet).map((value: any) => ({
label: value,
value: value,
}));
//进行分组选择
const groupedData = performance.reduce((groups: any, item: any) => {
const { kpiCode, ...rest } = item;
if (!groups[kpiCode]) {
groups[kpiCode] = [];
} }
groups[kpiCode].push(rest);
return groups;
}, {});
//渲染出性能测量集的选择项
modalState.neTypPerformance = Object.keys(groupedData).map(kpiCode => {
return {
label: kpiCode,
options: groupedData[kpiCode].map((item: any) => {
return {
value: item.kpiId,
label:
currentLocale.value === 'zh_CN'
? JSON.parse(item.titleJson).cn
: JSON.parse(item.titleJson).en,
kpiCode: kpiCode,
};
}),
};
}); });
} }
@@ -340,30 +324,17 @@ function fnSelectPerformanceInit(value: any) {
* 对话框弹出显示为 新增或者修改 * 对话框弹出显示为 新增或者修改
* @param noticeId 网元id, 不传为新增 * @param noticeId 网元id, 不传为新增
*/ */
function fnModalVisibleByEdit(id?: string) { function fnModalVisibleByEdit(row?: any, id?: any) {
if (!id) { if (!id) {
modalStateFrom.resetFields(); modalStateFrom.resetFields();
modalState.title = t('views.perfManage.customTarget.addCustom'); modalState.title = t('views.perfManage.customTarget.addCustom');
modalState.visibleByEdit = true; modalState.visibleByEdit = true;
fnSelectPerformanceInit(modalState.from.neType);
} else { } else {
if (modalState.confirmLoading) return; fnSelectPerformanceInit(row.neType);
const hide = message.loading(t('common.loading'), 0); modalState.from = Object.assign(modalState.from, row);
modalState.confirmLoading = true;
getCustom(id).then(res => {
modalState.confirmLoading = false;
hide();
if (res.code === RESULT_CODE_SUCCESS && res.data) {
fnSelectPerformanceInit(res.data.neType);
modalState.selectedPre = res.data.kpiSet
? res.data.kpiSet.split(',')
: [];
modalState.from = Object.assign(modalState.from, res.data);
modalState.title = t('views.perfManage.customTarget.editCustom'); modalState.title = t('views.perfManage.customTarget.editCustom');
modalState.visibleByEdit = true; modalState.visibleByEdit = true;
} else {
message.error(t('views.perfManage.customTarget.errorCustomInfo'), 3);
}
});
} }
} }
@@ -375,13 +346,6 @@ function fnModalOk() {
modalStateFrom modalStateFrom
.validate() .validate()
.then(e => { .then(e => {
// if (modalState.selectedPre.length === 0) {
// message.error({
// content: `${res.msg}`,
// duration: 3,
// });
// }
modalState.from.kpiSet = modalState.selectedPre.join(',');
const from = toRaw(modalState.from); const from = toRaw(modalState.from);
//return false; //return false;
modalState.confirmLoading = true; modalState.confirmLoading = true;
@@ -424,43 +388,54 @@ function fnModalCancel() {
modalStateFrom.resetFields(); modalStateFrom.resetFields();
modalState.neType = []; modalState.neType = [];
modalState.neTypPerformance = []; modalState.neTypPerformance = [];
modalState.selectedPre = [];
} }
/** /**
* 选择性能指标,填充进当前计算公式的值 * 选择性能指标,填充进当前计算公式的值
*/ */
function fnSelectPer(s: any, option: any) { function fnSelectPer(s: any, option: any) {
modalState.from.expression += `'${s}'`;
}
function fnSelectSymbol(s: any) {
modalState.from.expression += s; modalState.from.expression += s;
} }
/**网元参数 */
/** let neCascaderOptions = ref<Record<string, any>[]>([]);
* 多选框取消性能指标 表达式的变化
*/
function fnDelPer(s: any, option: any) {
modalState.from.expression = modalState.from.expression.replace(s, '');
}
// function checkText(e:any){
// console.log(e);
// const reg = /^[*+-/]*$/;
// }
onMounted(() => { onMounted(() => {
// 初始字典数据
Promise.allSettled([getDict('active_alarm_severity')]).then(resArr => {
if (resArr[0].status === 'fulfilled') {
dict.activeAlarmSeverity = resArr[0].value;
}
});
Promise.allSettled([ Promise.allSettled([
// 获取网元网元列表 // 获取网元网元列表
getDict('sys_normal_disable'),
useNeInfoStore().fnNelist(), useNeInfoStore().fnNelist(),
// 获取性能测量集列表 ])
useNeInfoStore().fnNeTaskPerformance(), .then(resArr => {
]).finally(() => { if (resArr[0].status === 'fulfilled') {
dict.sysNormalDisable = resArr[0].value;
}
if (
resArr[1].status === 'fulfilled' &&
Array.isArray(resArr[1].value.data)
) {
if (resArr[1].value.data.length > 0) {
// 过滤不可用的网元
neCascaderOptions.value =
useNeInfoStore().getNeCascaderOptions.filter((item: any) => {
return !['OMC', 'NSSF', 'NEF', 'NRF', 'LMF', 'N3IWF'].includes(
item.value
);
});
if (neCascaderOptions.value.length === 0) {
message.warning({
content: t('common.noData'),
duration: 2,
});
return;
}
}
}
})
.finally(() => {
// 获取列表数据 // 获取列表数据
fnGetList(); fnGetList();
}); });
@@ -484,7 +459,7 @@ onMounted(() => {
> >
<a-auto-complete <a-auto-complete
v-model:value="queryParams.neType" v-model:value="queryParams.neType"
:options="useNeInfoStore().getNeSelectOtions" :options="neCascaderOptions"
allow-clear allow-clear
:placeholder="t('views.traceManage.task.neTypePlease')" :placeholder="t('views.traceManage.task.neTypePlease')"
/> />
@@ -580,7 +555,7 @@ onMounted(() => {
<template #title>{{ t('common.editText') }}</template> <template #title>{{ t('common.editText') }}</template>
<a-button <a-button
type="link" type="link"
@click.prevent="fnModalVisibleByEdit(record.id)" @click.prevent="fnModalVisibleByEdit(record, record.id)"
> >
<template #icon><FormOutlined /></template> <template #icon><FormOutlined /></template>
</a-button> </a-button>
@@ -593,6 +568,24 @@ onMounted(() => {
</a-tooltip> </a-tooltip>
</a-space> </a-space>
</template> </template>
<template v-if="column.key === 'status'">
<DictTag
:options="[
{
label: t('views.perfManage.customTarget.active'),
value: 'Active',
tagType: 'success',
},
{
label: t('views.perfManage.customTarget.inactive'),
value: 'Inactive',
tagType: 'error',
},
]"
:value="record.status"
/>
</template>
</template> </template>
</a-table> </a-table>
</a-card> </a-card>
@@ -610,7 +603,12 @@ onMounted(() => {
@ok="fnModalOk" @ok="fnModalOk"
@cancel="fnModalCancel" @cancel="fnModalCancel"
> >
<a-form name="modalStateFrom" layout="horizontal"> <a-form
name="modalStateFrom"
layout="horizontal"
:label-col="{ span: 6 }"
:label-wrap="true"
>
<a-row :gutter="16"> <a-row :gutter="16">
<a-col :lg="12" :md="12" :xs="24"> <a-col :lg="12" :md="12" :xs="24">
<a-form-item <a-form-item
@@ -620,7 +618,7 @@ onMounted(() => {
> >
<a-select <a-select
v-model:value="modalState.from.neType" v-model:value="modalState.from.neType"
:options="useNeInfoStore().getNeSelectOtions" :options="neCascaderOptions"
@change="fnSelectPerformanceInit" @change="fnSelectPerformanceInit"
:allow-clear="false" :allow-clear="false"
:placeholder="t('views.traceManage.task.neTypePlease')" :placeholder="t('views.traceManage.task.neTypePlease')"
@@ -629,16 +627,21 @@ onMounted(() => {
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :lg="12" :md="12" :xs="24"> <a-col :lg="12" :md="12" :xs="24">
<a-form-item <a-form-item :label="t('views.perfManage.customTarget.status')" name="status">
:label="t('views.perfManage.customTarget.objectType')"
name="kpiSobjectTypeet"
v-show="modalState.from.neType"
v-bind="modalStateFrom.validateInfos.objectType"
>
<a-select <a-select
placeholder="Please select" v-model:value="modalState.from.status"
v-model:value="modalState.from.objectType" default-value="0"
:options="modalState.objectTypeArr" :options="[
{
label: t('views.perfManage.customTarget.active'),
value: 'Active',
},
{
label: t('views.perfManage.customTarget.inactive'),
value: 'Inactive',
},
]"
:placeholder="t('common.selectPlease')"
> >
</a-select> </a-select>
</a-form-item> </a-form-item>
@@ -646,6 +649,16 @@ onMounted(() => {
</a-row> </a-row>
<a-row :gutter="16"> <a-row :gutter="16">
<a-col :lg="12" :md="12" :xs="24">
<a-form-item
:label="t('views.perfManage.customTarget.title')"
name="title"
v-bind="modalStateFrom.validateInfos.title"
>
<a-input v-model:value="modalState.from.title" allow-clear>
</a-input>
</a-form-item>
</a-col>
<a-col :lg="12" :md="12" :xs="24"> <a-col :lg="12" :md="12" :xs="24">
<a-form-item <a-form-item
:label="t('views.perfManage.customTarget.kpiId')" :label="t('views.perfManage.customTarget.kpiId')"
@@ -656,56 +669,58 @@ onMounted(() => {
</a-input> </a-input>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :lg="12" :md="12" :xs="24">
<a-form-item
:label="t('views.perfManage.customTarget.period')"
name="period"
v-bind="modalStateFrom.validateInfos.period"
>
<a-select
v-model:value="modalState.from.period"
:placeholder="t('common.selectPlease')"
:options="[
{ label: '5S', value: 5 },
{ label: '1M', value: 60 },
{ label: '5M', value: 300 },
{ label: '15M', value: 900 },
{ label: '30M', value: 1800 },
{ label: '60M', value: 3600 },
]"
/>
</a-form-item>
</a-col>
</a-row> </a-row>
<a-form-item
:label="t('views.perfManage.customTarget.title')"
name="title"
v-bind="modalStateFrom.validateInfos.title"
>
<a-input v-model:value="modalState.from.title" allow-clear> </a-input>
</a-form-item>
<a-form-item <a-form-item
:label="t('views.perfManage.customTarget.expression')" :label="t('views.perfManage.customTarget.expression')"
name="expression" name="expression"
:label-col="{ span: 3 }"
v-bind="modalStateFrom.validateInfos.expression" v-bind="modalStateFrom.validateInfos.expression"
> >
<a-input v-model:value="modalState.from.expression" allow-clear> <a-input
v-model:value="modalState.from.expression"
style="width: 80%"
allow-clear
>
</a-input> </a-input>
<a-auto-complete
v-model:value="modalState.from.unit"
:options="[
{
label: 'Mbps',
value: 'Mbps',
},
{
label: '%',
value: '%',
},
]"
style="width: 20%"
></a-auto-complete>
</a-form-item> </a-form-item>
<a-row :gutter="16"> <a-row :gutter="16">
<a-col :lg="21" :md="21" :xs="24"> <a-col :lg="12" :md="12" :xs="24">
<a-form-item name="perSelect"> <a-form-item
name="perSelect"
:label="t('views.perfManage.customTarget.symbol')"
>
<a-select
placeholder="Please select"
:options="modalStateFromOption.symbolJson"
@select="fnSelectSymbol"
></a-select>
</a-form-item>
</a-col>
<a-col :lg="12" :md="12" :xs="24">
<a-form-item
name="perSelect"
:label="t('views.perfManage.customTarget.element')"
>
<a-select <a-select
mode="multiple"
style="margin-left: 80px"
placeholder="Please select" placeholder="Please select"
allow-clear
v-model:value="modalState.selectedPre"
:options="modalState.neTypPerformance" :options="modalState.neTypPerformance"
@select="fnSelectPer" @select="fnSelectPer"
@deselect="fnDelPer"
></a-select> ></a-select>
</a-form-item> </a-form-item>
</a-col> </a-col>
@@ -714,6 +729,7 @@ onMounted(() => {
<a-form-item <a-form-item
:label="t('views.perfManage.customTarget.description')" :label="t('views.perfManage.customTarget.description')"
name="description" name="description"
:label-col="{ span: 3 }"
> >
<a-textarea <a-textarea
v-model:value="modalState.from.description" v-model:value="modalState.from.description"