Files
fe.ems.vue3/src/views/configManage/neManage/index.vue
2023-10-26 19:33:13 +08:00

1098 lines
30 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<script setup lang="ts">
import { reactive, onMounted, toRaw } from 'vue';
import { PageContainer } from '@ant-design-vue/pro-layout';
import { message, Modal, Form } from 'ant-design-vue/lib';
import { SizeType } from 'ant-design-vue/lib/config-provider';
import { MenuInfo } from 'ant-design-vue/lib/menu/src/interface';
import { ColumnsType } from 'ant-design-vue/lib/table';
import {
listNeInfo,
getNeInfo,
addNeInfo,
updateNeInfo,
delNeInfo,
exportSet,
startNf,
restartNf,
stopNf,
importFile,
listServerFile,
} from '@/api/configManage/neManage';
import { parseDateToStr } from '@/utils/date-utils';
import useI18n from '@/hooks/useI18n';
import { FileType } from 'ant-design-vue/lib/upload/interface';
import { UploadRequestOption } from 'ant-design-vue/lib/vc-upload/interface';
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
import useNeInfoStore from '@/store/modules/neinfo';
const { t } = useI18n();
/**表格所需option */
const neManageOption = reactive({
importType: [
{ label: t('views.configManage.neManage.server'), value: 'server' },
{ label: t('views.configManage.neManage.local'), value: 'local' },
],
serverFileName: <any[]>[],
});
/**查询参数 */
let queryParams = reactive({
/**网元类型 */
neType: '',
/**当前页数 */
pageNum: 1,
/**每页条数 */
pageSize: 20,
});
/**查询参数重置 */
function fnQueryReset() {
queryParams = Object.assign(queryParams, {
neType: '',
pageNum: 1,
pageSize: 20,
});
tablePagination.current = 1;
tablePagination.pageSize = 20;
fnGetList();
}
/**表格状态类型 */
type TabeStateType = {
/**加载等待 */
loading: boolean;
/**紧凑型 */
size: SizeType;
/**搜索栏 */
seached: boolean;
/**记录数据 */
data: object[];
/**勾选记录 */
selectedRowKeys: (string | number)[];
};
/**表格状态 */
let tableState: TabeStateType = reactive({
loading: false,
size: 'middle',
seached: true,
data: [],
selectedRowKeys: [],
});
/**表格字段列 */
let tableColumns: ColumnsType = [
{
title: '网元类型',
dataIndex: 'neType',
align: 'center',
},
{
title: '网元内部标识',
dataIndex: 'neId',
align: 'center',
},
{
title: '资源唯一标识',
dataIndex: 'rmUid',
align: 'center',
},
{
title: '网元名称',
dataIndex: 'neName',
align: 'center',
},
{
title: 'IP地址',
dataIndex: 'ip',
align: 'center',
},
{
title: '端口',
dataIndex: 'port',
align: 'center',
},
{
title: '网元虚拟化标识',
dataIndex: 'pvFlag',
align: 'center',
},
{
title: '网元所在省份',
dataIndex: 'province',
align: 'center',
},
{
title: '厂商名称',
dataIndex: 'vendorName',
align: 'center',
},
{
title: '网络标识',
dataIndex: 'dn',
align: 'center',
},
{
title: '修改时间',
dataIndex: 'updateTime',
align: 'center',
customRender(opt) {
if (!opt.value) return '';
return parseDateToStr(opt.value);
},
},
{
title: t('common.operate'),
key: 'id',
align: 'center',
},
];
/**表格分页器参数 */
let tablePagination = reactive({
/**当前页数 */
current: 1,
/**每页条数 */
pageSize: 20,
/**默认的每页条数 */
defaultPageSize: 20,
/**指定每页可以显示多少条 */
pageSizeOptions: ['10', '20', '50', '100'],
/**只有一页时是否隐藏分页器 */
hideOnSinglePage: false,
/**是否可以快速跳转至某页 */
showQuickJumper: true,
/**是否可以改变 pageSize */
showSizeChanger: true,
/**数据总数 */
total: 0,
showTotal: (total: number) => t('common.tablePaginationTotal', { total }),
onChange: (page: number, pageSize: number) => {
tablePagination.current = page;
tablePagination.pageSize = pageSize;
queryParams.pageNum = page;
queryParams.pageSize = pageSize;
fnGetList();
},
});
/**表格紧凑型变更操作 */
function fnTableSize({ key }: MenuInfo) {
tableState.size = key as SizeType;
}
/**对话框对象信息状态类型 */
type ModalStateType = {
/**详情框是否显示 */
visibleByView: boolean;
/**新增框或修改框是否显示 */
visibleByEdit: boolean;
/**导入是否显示 */
visibleByImport: boolean;
/**标题 */
title: string;
/**表单数据 */
from: Record<string, any>;
/**导入表单数据 */
importFrom: Record<string, any>;
/**确定按钮 loading */
confirmLoading: boolean;
};
/**对话框对象信息状态 */
let modalState: ModalStateType = reactive({
visibleByView: false,
visibleByEdit: false,
visibleByImport: false,
title: '网元',
from: {
dn: '',
ip: '',
neAddress: '',
neId: '',
neName: '',
neType: '',
port: '',
province: '',
pvFlag: '',
rmUid: '',
vendorName: '',
},
importFrom: {
neId: '',
neType: '',
importType: '',
file: undefined,
fileList: [],
fileName: '',
},
confirmLoading: false,
});
/**对话框内表单属性和校验规则 */
const modalStateFrom = Form.useForm(
modalState.from,
reactive({
neType: [{ required: true, message: '网元类型不能为空' }],
neId: [{ required: true, message: '网元内部标识不能为空' }],
rmUid: [{ required: true, message: '资源唯一标识不能为空' }],
ip: [{ required: true, message: 'IP地址不能为空' }],
port: [{ required: true, message: '端口不能为空' }],
pvFlag: [{ required: true, message: '请选择网元虚拟化标识' }],
neName: [{ required: true, message: '网元名称不能为空' }],
})
);
/**导入对话框内表单属性和校验规则 */
const importStateFrom = Form.useForm(
modalState.importFrom,
reactive({
file: [
{
required: true,
message: t('views.configManage.softwareManage.updateFilePlease'),
},
],
importType: [
{
required: true,
message: t('views.configManage.neManage.selectPlease'),
},
],
fileName: [
{
required: true,
message: t('views.configManage.neManage.fileSelect'),
},
],
})
);
/**
* 对话框弹出显示为 新增或者修改
* @param noticeId 网元id, 不传为新增
*/
function fnModalVisibleByEdit(row?: Record<string, any>) {
if (!row) {
modalStateFrom.resetFields();
modalState.title = '添加网元';
modalState.visibleByEdit = true;
} else {
if (modalState.confirmLoading) return;
const hide = message.loading(t('common.loading'), 0);
modalState.confirmLoading = true;
getNeInfo(row.id).then(res => {
modalState.confirmLoading = false;
hide();
if (res.code === RESULT_CODE_SUCCESS) {
modalState.from = Object.assign(modalState.from, res.data);
modalState.title = '修改网元';
modalState.visibleByEdit = true;
} else {
message.error(`获取网元信息失败`, 2);
}
});
}
}
/**
* 对话框弹出确认执行函数
* 进行表达规则校验
*/
function fnModalOk() {
modalStateFrom
.validate()
.then(e => {
modalState.confirmLoading = true;
const from = toRaw(modalState.from);
const result = from.id ? updateNeInfo(from) : addNeInfo(from);
const hide = message.loading({ content: t('common.loading') });
result
.then(res => {
if (res.code === RESULT_CODE_SUCCESS) {
message.success({
content: t('common.msgSuccess', { msg: modalState.title }),
duration: 3,
});
modalState.visibleByEdit = false;
modalStateFrom.resetFields();
fnGetList();
} else {
message.error({
content: `${res.msg}`,
duration: 3,
});
}
})
.finally(() => {
hide();
modalState.confirmLoading = false;
// 刷新缓存的网元信息
useNeInfoStore().fnRefreshNelist();
});
})
.catch(e => {
message.error(t('common.errorFields', { num: e.errorFields.length }), 3);
});
}
/**
* 导入对话框弹出确认执行函数
* 进行表达规则校验
*/
function fnImportModalOk() {
const from = toRaw(modalState.importFrom);
let validateName = ['importType'];
if (from.file) {
validateName.push('file');
} else {
validateName.push('fileName');
}
importStateFrom
.validate(validateName)
.then(e => {
modalState.confirmLoading = true;
const hide = message.loading({ content: t('common.loading') });
importFile(from)
.then(res => {
if (res.code === RESULT_CODE_SUCCESS) {
message.success({
content: t('common.msgSuccess', { msg: modalState.title }),
duration: 3,
});
modalState.visibleByEdit = false;
modalStateFrom.resetFields();
} else {
message.error({
content: `${res.msg}`,
duration: 3,
});
}
})
.finally(() => {
hide();
modalState.confirmLoading = false;
// 获取列表数据
fnGetList();
});
})
.catch(e => {
message.error(t('common.errorFields', { num: e.errorFields.length }), 3);
});
}
/**
* 导入对话框弹出关闭执行函数
* 进行表达规则校验
*/
function fnImportModalCancel() {
modalState.visibleByView = false;
modalState.visibleByImport = false;
importStateFrom.resetFields();
}
/**
* 对话框弹出关闭执行函数
* 进行表达规则校验
*/
function fnModalCancel() {
modalState.visibleByEdit = false;
modalState.visibleByView = false;
modalStateFrom.resetFields();
}
/**
* 网元删除
* @param row 网元编号ID
*/
function fnRecordDelete(row: Record<string, any>) {
Modal.confirm({
title: '提示',
content: `确认删除网元编号为 【${row.neName}】 的数据项?`,
onOk() {
const key = 'delNotice';
message.loading({ content: '请稍等...', key });
delNeInfo(row).then(res => {
if (res.code === RESULT_CODE_SUCCESS) {
message.success({
content: `删除成功`,
key,
duration: 2,
});
fnGetList();
// 刷新缓存的网元信息
useNeInfoStore().fnRefreshNelist();
} else {
message.error({
content: `${res.msg}`,
key: key,
duration: 2,
});
}
});
},
});
}
/**
* 网元导出配置
* @param row 网元编号ID
*/
function fnRecordExport(row: Record<string, any>) {
Modal.confirm({
title: '提示',
content: `确认导出网元编号为 【${row.neName}】 的配置信息?`,
onOk() {
const key = 'exportSet';
message.loading({ content: '请稍等...', key });
exportSet(row).then(res => {
if (res.code === RESULT_CODE_SUCCESS) {
message.success({
content: `导出成功,请到备份管理进行下载`,
key,
duration: 2,
});
} else {
message.error({
content: `${res.msg}`,
key: key,
duration: 2,
});
}
});
},
});
}
/**
* 网元重启
* @param row 网元编号ID
*/
function fnRecordRestart(row: Record<string, any>) {
Modal.confirm({
title: '提示',
content: `确认重启网元编号为 【${row.neName}】 的网元?`,
onOk() {
const key = 'restartNf';
message.loading({ content: '请稍等...', key });
restartNf(row).then(res => {
if (res.code === RESULT_CODE_SUCCESS) {
message.success({
content: `重启执行成功`,
key,
duration: 2,
});
} else {
message.error({
content: `${res.msg}`,
key: key,
duration: 2,
});
}
});
},
});
}
/**
* 网元启动
* @param row 网元编号ID
*/
function fnRecordStart(row: Record<string, any>) {
Modal.confirm({
title: '提示',
content: `确认启动网元编号为 【${row.neName}】 的网元?`,
onOk() {
const key = 'startNf';
message.loading({ content: '请稍等...', key });
startNf(row).then(res => {
if (res.code === RESULT_CODE_SUCCESS) {
message.success({
content: `启动执行成功`,
key,
duration: 2,
});
} else {
message.error({
content: `${res.msg}`,
key: key,
duration: 2,
});
}
});
},
});
}
/**
* 网元停止
* @param row 网元编号ID
*/
function fnRecordStop(row: Record<string, any>) {
Modal.confirm({
title: '提示',
content: `确认停止网元编号为 【${row.neName}】 的网元?`,
onOk() {
const key = 'stopNf';
message.loading({ content: '请稍等...', key });
stopNf(row).then(res => {
if (res.code === RESULT_CODE_SUCCESS) {
message.success({
content: `停止执行成功`,
key,
duration: 2,
});
} else {
message.error({
content: `${res.msg}`,
key: key,
duration: 2,
});
}
});
},
});
}
/**
* 记录多项选择
*/
function fnRecordMore(type: string | number, row: Record<string, any>) {
if (type === 'delete') {
fnRecordDelete(row);
return
}
if (type === 'export') {
fnRecordExport(row);
}
if (type === 'start') {
fnRecordStart(row);
}
if (type === 'restart') {
fnRecordRestart(row);
}
if (type === 'stop') {
fnRecordStop(row);
}
if (type === 'import') {
modalState.importFrom = Object.assign(modalState.importFrom, row);
modalState.title = '导入';
modalState.visibleByImport = true;
}
}
/**查询网元列表 */
function fnGetList() {
if (tableState.loading) return;
tableState.loading = true;
listNeInfo(toRaw(queryParams)).then(res => {
if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.rows)) {
// 取消勾选
if (tableState.selectedRowKeys.length > 0) {
tableState.selectedRowKeys = [];
}
tablePagination.total = res.total;
tableState.data = res.rows;
}
tableState.loading = false;
});
}
/**查询网元远程服务器备份文件 */
function typeChange(value: any) {
if (value === 'server') {
listServerFile(modalState.importFrom).then(res => {
if (res.code === RESULT_CODE_SUCCESS && Array.isArray(res.data)) {
neManageOption.serverFileName = [];
res.data.forEach((item: any) => {
neManageOption.serverFileName.push({
label: item.fileName,
value: item.fileName,
});
});
}
});
}
}
/**上传前检查或转换压缩 */
function fnBeforeUploadFile(file: FileType) {
if (modalState.confirmLoading) return false;
// const fileName = file.name;
// const suff = fileName.substring(fileName.lastIndexOf('.'));
return true;
}
/**上传文件 */
function fnUploadFile(up: UploadRequestOption) {
// 改为完成状态
const file = modalState.importFrom.fileList[0];
file.percent = 100;
file.status = 'done';
// 预置到表单
modalState.importFrom.file = up.file;
}
onMounted(() => {
// 获取列表数据
fnGetList();
// 刷新缓存的网元信息
useNeInfoStore().fnRefreshNelist();
});
</script>
<template>
<PageContainer>
<a-card
v-show="tableState.seached"
:bordered="false"
:body-style="{ marginBottom: '24px', paddingBottom: 0 }"
>
<!-- 表格搜索栏 -->
<a-form :model="queryParams" name="queryParams" layout="horizontal">
<a-row :gutter="16">
<a-col :lg="6" :md="12" :xs="24">
<a-form-item label="网元类型" name="neType ">
<a-input
v-model:value="queryParams.neType"
allow-clear
placeholder="请输入网元类型"
></a-input>
</a-form-item>
</a-col>
<a-col :lg="6" :md="12" :xs="24">
<a-form-item>
<a-space :size="8">
<a-button type="primary" @click.prevent="fnGetList">
<template #icon><SearchOutlined /></template>
{{ t('common.search') }}
</a-button>
<a-button type="default" @click.prevent="fnQueryReset">
<template #icon><ClearOutlined /></template>
{{ t('common.reset') }}
</a-button>
</a-space>
</a-form-item>
</a-col>
</a-row>
</a-form>
</a-card>
<a-card :bordered="false" :body-style="{ padding: '0px' }">
<!-- 插槽-卡片左侧侧 -->
<template #title>
<a-space :size="8" align="center">
<a-button type="primary" @click.prevent="fnModalVisibleByEdit()">
<template #icon><PlusOutlined /></template>
{{ t('common.addText') }}
</a-button>
</a-space>
</template>
<!-- 插槽-卡片右侧 -->
<template #extra>
<a-space :size="8" align="center">
<a-tooltip>
<template #title>{{ t('common.searchBarText') }}</template>
<a-switch
v-model:checked="tableState.seached"
:checked-children="t('common.switch.show')"
:un-checked-children="t('common.switch.hide')"
size="small"
/>
</a-tooltip>
<a-tooltip>
<template #title>{{ t('common.reloadText') }}</template>
<a-button type="text" @click.prevent="fnGetList">
<template #icon><ReloadOutlined /></template>
</a-button>
</a-tooltip>
<a-tooltip>
<template #title>{{ t('common.sizeText') }}</template>
<a-dropdown trigger="click" placement="bottomRight">
<a-button type="text">
<template #icon><ColumnHeightOutlined /></template>
</a-button>
<template #overlay>
<a-menu
:selected-keys="[tableState.size as string]"
@click="fnTableSize"
>
<a-menu-item key="default"
>{{ t('common.size.default') }}
</a-menu-item>
<a-menu-item key="middle"
>{{ t('common.size.middle') }}
</a-menu-item>
<a-menu-item key="small"
>{{ t('common.size.small') }}
</a-menu-item>
</a-menu>
</template>
</a-dropdown>
</a-tooltip>
</a-space>
</template>
<!-- 表格列表 -->
<a-table
class="table"
row-key="id"
:columns="tableColumns"
:loading="tableState.loading"
:data-source="tableState.data"
:size="tableState.size"
:pagination="tablePagination"
:scroll="{ x: true,y:400 }"
>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'id'">
<a-space :size="8" align="center">
<a-tooltip>
<template #title>{{ t('common.editText') }}</template>
<a-button
type="link"
@click.prevent="fnModalVisibleByEdit(record)"
>
<template #icon><FormOutlined /></template>
</a-button>
</a-tooltip>
<a-tooltip>
<template #title>{{ t('views.configManage.neManage.restart') }}</template>
<a-button type="link" @click.prevent="fnRecordMore('restart', record)">
<template #icon><UndoOutlined /></template>
</a-button>
</a-tooltip>
<a-tooltip>
<template #title>{{ t('common.moreText') }}</template>
<a-dropdown
placement="bottomRight"
:trigger="['hover', 'click']"
>
<a-button type="link">
<template #icon><EllipsisOutlined /> </template>
</a-button>
<template #overlay>
<a-menu @click="({ key }:any) => fnRecordMore(key, record)">
<a-menu-item key="export">
<ExportOutlined />
{{ t('views.configManage.neManage.export') }}
</a-menu-item>
<a-menu-item key="import">
<ImportOutlined />
{{ t('views.configManage.neManage.import') }}
</a-menu-item>
<a-menu-item key="start">
<thunderbolt-outlined />
{{ t('views.configManage.neManage.start') }}
</a-menu-item>
<a-menu-item key="stop">
<pause-outlined />
{{ t('views.configManage.neManage.stop') }}
</a-menu-item>
<a-menu-item key="delete">
<DeleteOutlined />
{{ t('common.deleteText') }}
</a-menu-item>
</a-menu>
</template>
</a-dropdown>
</a-tooltip>
</a-space>
</template>
</template>
</a-table>
</a-card>
<!-- 新增框或修改框 -->
<a-modal
width="800px"
:keyboard="false"
:mask-closable="false"
:visible="modalState.visibleByEdit"
:title="modalState.title"
:confirm-loading="modalState.confirmLoading"
@ok="fnModalOk"
@cancel="fnModalCancel"
>
<a-form name="modalStateFrom" layout="horizontal">
<a-row :gutter="16">
<a-col :lg="12" :md="12" :xs="24">
<a-form-item
label="网元类型"
name="neType"
v-bind="modalStateFrom.validateInfos.neType"
>
<a-input
v-model:value="modalState.from.neType"
allow-clear
placeholder="请输入网元类型"
>
<template #prefix>
<a-tooltip placement="topLeft">
<template #title> 填写创建的网元类型,:SMF </template>
<InfoCircleOutlined style="color: rgba(0, 0, 0, 0.45)" />
</a-tooltip>
</template>
</a-input>
</a-form-item>
</a-col>
<a-col :lg="12" :md="12" :xs="24">
<a-form-item
label="网元内部标识"
name="neId"
v-bind="modalStateFrom.validateInfos.neId"
>
<a-input
v-model:value="modalState.from.neId"
allow-clear
placeholder="请输入网元内部标识"
></a-input>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="16">
<a-col :lg="12" :md="12" :xs="24">
<a-form-item
label="资源唯一标识"
name="rmUid"
v-bind="modalStateFrom.validateInfos.rmUid"
>
<a-input
v-model:value="modalState.from.rmUid"
allow-clear
placeholder="请输入资源唯一标识"
>
</a-input>
</a-form-item>
</a-col>
<a-col :lg="12" :md="12" :xs="24">
<a-form-item
label="网元虚拟化标识"
name="pvFlag"
v-bind="modalStateFrom.validateInfos.pvFlag"
>
<a-select
v-model:value="modalState.from.pvFlag"
default-value="PNF"
placeholder="请选择网元虚拟化标识"
>
<a-select-opt-group label="物理网元">
<a-select-option value="PNF">PNF</a-select-option>
</a-select-opt-group>
<a-select-opt-group label="虚拟网元">
<a-select-option value="VNF">VNF</a-select-option>
</a-select-opt-group>
</a-select>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="16">
<a-col :lg="12" :md="12" :xs="24">
<a-form-item
label="IP地址"
name="ip"
v-bind="modalStateFrom.validateInfos.ip"
>
<a-input
v-model:value="modalState.from.ip"
allow-clear
placeholder="请输入IP地址"
></a-input>
</a-form-item>
</a-col>
<a-col :lg="12" :md="12" :xs="24">
<a-form-item
label="端口号"
name="port"
v-bind="modalStateFrom.validateInfos.port"
>
<a-input
v-model:value="modalState.from.port"
allow-clear
placeholder="请输入端口"
>
<template #prefix>
<a-tooltip placement="topLeft">
<template #title> <div>最大范围0~65535</div> </template>
<InfoCircleOutlined style="color: rgba(0, 0, 0, 0.45)" />
</a-tooltip>
</template>
</a-input>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="16">
<a-col :lg="12" :md="12" :xs="24">
<a-form-item
label="网元名称"
name="neName"
v-bind="modalStateFrom.validateInfos.neName"
>
<a-input
v-model:value="modalState.from.neName"
allow-clear
placeholder="请输入网元名称"
>
</a-input>
</a-form-item>
</a-col>
<a-col :lg="12" :md="12" :xs="24">
<a-form-item label="网元地址" name="neAddress">
<a-input
v-model:value="modalState.from.neAddress"
allow-clear
placeholder="请输入网元地址"
><template #prefix>
<a-tooltip placement="topLeft">
<template #title>
<div>能够定位网元的物理地址MAC</div>
</template>
<InfoCircleOutlined style="color: rgba(0, 0, 0, 0.45)" />
</a-tooltip> </template
></a-input>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="16">
<a-col :lg="12" :md="12" :xs="24">
<a-form-item label="网元所在省份" name="province">
<a-input
v-model:value="modalState.from.province"
allow-clear
placeholder="请输入网元所在省份"
></a-input>
</a-form-item>
</a-col>
<a-col :lg="6" :md="6" :xs="24">
<a-form-item label="厂商名称" name="vendorName">
<a-input
v-model:value="modalState.from.vendorName"
allow-clear
placeholder="请输入厂商名称"
>
</a-input>
</a-form-item>
</a-col>
<a-col :lg="6" :md="6" :xs="24">
<a-form-item label="网络标识" name="dn">
<a-input
v-model:value="modalState.from.dn"
allow-clear
placeholder="请输入网络标识"
></a-input>
</a-form-item>
</a-col>
</a-row>
</a-form>
</a-modal>
<!-- 导入框 -->
<a-modal
width="800px"
:keyboard="false"
:mask-closable="false"
:visible="modalState.visibleByImport"
:title="modalState.title"
:confirm-loading="modalState.confirmLoading"
@ok="fnImportModalOk"
@cancel="fnImportModalCancel"
>
<a-form name="importStateFrom" layout="horizontal">
<a-row :gutter="16">
<a-col :lg="12" :md="12" :xs="24">
<a-form-item
label="网元类型"
name="neType"
v-bind="importStateFrom.validateInfos.neType"
>
<a-input
v-model:value="modalState.importFrom.neType"
disabled
allow-clear
>
</a-input>
</a-form-item>
</a-col>
<a-col :lg="12" :md="12" :xs="24">
<a-form-item
label="网元内部标识"
name="neId"
v-bind="importStateFrom.validateInfos.neId"
>
<a-input
v-model:value="modalState.importFrom.neId"
disabled
></a-input>
</a-form-item>
</a-col>
</a-row>
<a-form-item
label="文件来源"
name="importType"
v-bind="importStateFrom.validateInfos.importType"
>
<a-select
v-model:value="modalState.importFrom.importType"
default-value="server"
:options="neManageOption.importType"
@change="typeChange"
>
</a-select>
</a-form-item>
<a-form-item
label="导入远程文件"
name="fileName"
v-bind="importStateFrom.validateInfos.fileName"
v-show="modalState.importFrom.importType === 'server'"
>
<a-select
v-model:value="modalState.importFrom.fileName"
:options="neManageOption.serverFileName"
>
</a-select>
</a-form-item>
<a-form-item
label="导入本地文件"
name="file"
v-bind="importStateFrom.validateInfos.file"
v-show="modalState.importFrom.importType === 'local'"
>
<a-upload
name="file"
v-model:file-list="modalState.importFrom.fileList"
list-type="text"
:max-count="1"
:show-upload-list="true"
:before-upload="fnBeforeUploadFile"
:custom-request="fnUploadFile"
>
<a-button type="default" :loading="modalState.confirmLoading">
{{ t('views.configManage.neManage.fileSelect') }}
</a-button>
</a-upload>
</a-form-item>
</a-form>
</a-modal>
</PageContainer>
</template>
<style lang="less" scoped>
.table :deep(.ant-pagination) {
padding: 0 24px;
}
</style>