feat: UDM用户数据导入输出失败记录,UDM2.2502.58

This commit is contained in:
TsMask
2025-02-07 16:00:52 +08:00
parent fbc1535015
commit fd82d710b6
4 changed files with 579 additions and 146 deletions

View File

@@ -737,6 +737,7 @@ export default {
checkExport : 'Check Export', checkExport : 'Check Export',
checkExportConfirm: 'Confirm exporting the checked authenticated user data?', checkExportConfirm: 'Confirm exporting the checked authenticated user data?',
import: 'Import', import: 'Import',
importFail: 'Failure Record',
loadDataConfirm: 'Are you sure you want to reload the data?', loadDataConfirm: 'Are you sure you want to reload the data?',
loadData: 'Load Data', loadData: 'Load Data',
loadDataTip: 'Successfully fetched loaded data: {num} items, the system is internally updating the data, it will take about {timer} seconds, please wait!!!!!.', loadDataTip: 'Successfully fetched loaded data: {num} items, the system is internally updating the data, it will take about {timer} seconds, please wait!!!!!.',
@@ -765,6 +766,7 @@ export default {
checkExport : 'Check Export', checkExport : 'Check Export',
checkExportConfirm: 'Are you sure to export the data of the checked subscribers?', checkExportConfirm: 'Are you sure to export the data of the checked subscribers?',
import: 'Import', import: 'Import',
importFail: 'Failure Record',
loadDataConfirm: 'Are you sure you want to reload the data?', loadDataConfirm: 'Are you sure you want to reload the data?',
loadData: 'Load Data', loadData: 'Load Data',
loadDataTip: 'Successfully fetched loaded data: {num} items, the system is internally updating the data, it will take about {timer} seconds, please wait!!!!!.', loadDataTip: 'Successfully fetched loaded data: {num} items, the system is internally updating the data, it will take about {timer} seconds, please wait!!!!!.',

View File

@@ -737,6 +737,7 @@ export default {
checkExport : '勾选导出', checkExport : '勾选导出',
checkExportConfirm: '确认导出已勾选的鉴权用户数据吗?', checkExportConfirm: '确认导出已勾选的鉴权用户数据吗?',
import: '导入', import: '导入',
importFail: '失败记录',
loadDataConfirm: '确认要重新加载数据吗?', loadDataConfirm: '确认要重新加载数据吗?',
loadData: '加载数据', loadData: '加载数据',
loadDataTip: '成功获取加载数据:{num}条,系统内部正在进行数据更新,大约需要{timer}秒,请稍候!!!', loadDataTip: '成功获取加载数据:{num}条,系统内部正在进行数据更新,大约需要{timer}秒,请稍候!!!',
@@ -765,6 +766,7 @@ export default {
checkExport : '勾选导出', checkExport : '勾选导出',
checkExportConfirm: '确认导出已勾选的签约用户数据吗?', checkExportConfirm: '确认导出已勾选的签约用户数据吗?',
import: '导入', import: '导入',
importFail: '失败记录',
loadDataConfirm: '确认要重新加载数据吗?', loadDataConfirm: '确认要重新加载数据吗?',
loadData: '加载数据', loadData: '加载数据',
loadDataTip: '成功获取加载数据:{num}条,系统内部正在进行数据更新,大约需要{timer}秒,请稍候!!!', loadDataTip: '成功获取加载数据:{num}条,系统内部正在进行数据更新,大约需要{timer}秒,请稍候!!!',

View File

@@ -25,6 +25,7 @@ import {
listUDMAuth, listUDMAuth,
} from '@/api/neData/udm_auth'; } from '@/api/neData/udm_auth';
import { uploadFile } from '@/api/tool/file'; import { uploadFile } from '@/api/tool/file';
import { getNeViewFile } from '@/api/tool/neFile';
const { t } = useI18n(); const { t } = useI18n();
/**网元参数 */ /**网元参数 */
@@ -98,12 +99,6 @@ let tableColumns = ref<ColumnsType>([
align: 'center', align: 'center',
width: 80, width: 80,
}, },
{
title: 'Status',
dataIndex: 'status',
align: 'center',
width: 80,
},
// { // {
// title: 'KI', // title: 'KI',
// dataIndex: 'ki', // dataIndex: 'ki',
@@ -598,6 +593,8 @@ type ModalUploadImportStateType = {
loading: boolean; loading: boolean;
/**上传结果信息 */ /**上传结果信息 */
msg: string; msg: string;
/**含失败信息 */
hasFail: boolean;
/**导入类型 */ /**导入类型 */
typeOptions: { label: string; value: string }[]; typeOptions: { label: string; value: string }[];
/**表单 */ /**表单 */
@@ -610,6 +607,7 @@ let uploadImportState: ModalUploadImportStateType = reactive({
title: t('components.UploadModal.uploadTitle'), title: t('components.UploadModal.uploadTitle'),
loading: false, loading: false,
msg: '', msg: '',
hasFail: false,
typeOptions: [ typeOptions: [
{ label: 'Default', value: 'default' }, { label: 'Default', value: 'default' },
{ label: 'K4', value: 'k4' }, { label: 'K4', value: 'k4' },
@@ -626,9 +624,37 @@ function fnModalUploadImportTypeChange() {
uploadImportState.msg = ''; uploadImportState.msg = '';
} }
/**对话框表格信息导入失败原因 */
function fnModalUploadImportFailReason() {
const neId = queryParams.neId;
if (!neId) return;
const hide = message.loading(t('common.loading'), 0);
getNeViewFile({
neType: 'UDM',
neId: neId,
path: '/tmp',
fileName: 'import_authdata_err_records.txt',
})
.then(res => {
if (res.code === RESULT_CODE_SUCCESS) {
message.success(t('common.operateOk'), 3);
const blob = new Blob([res.data], {
type: 'text/plain',
});
saveAs(blob, `import_authdata_err_records_${Date.now()}.txt`);
} else {
message.error(`${res.msg}`, 3);
}
})
.finally(() => {
hide();
});
}
/**对话框表格信息导入弹出窗口 */ /**对话框表格信息导入弹出窗口 */
function fnModalUploadImportOpen() { function fnModalUploadImportOpen() {
uploadImportState.msg = ''; uploadImportState.msg = '';
uploadImportState.hasFail = false;
uploadImportState.from.typeVal = 'default'; uploadImportState.from.typeVal = 'default';
uploadImportState.from.typeData = undefined; uploadImportState.from.typeData = undefined;
uploadImportState.loading = false; uploadImportState.loading = false;
@@ -675,6 +701,14 @@ function fnModalUploadImportUpload(file: File) {
.then(res => { .then(res => {
if (!res) return; if (!res) return;
uploadImportState.msg = res.msg; uploadImportState.msg = res.msg;
const regex = /fail num: (\d+)/;
const match = res.msg.match(regex);
if (match) {
const failNum = Number(match[1]);
uploadImportState.hasFail = failNum > 0;
} else {
uploadImportState.hasFail = false;
}
}) })
.finally(() => { .finally(() => {
hide(); hide();
@@ -1018,14 +1052,6 @@ 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="Status" name="status">
<a-select value="1">
<a-select-option value="1">Active</a-select-option>
<a-select-option value="0">Inactive</a-select-option>
</a-select>
</a-form-item>
</a-col>
</a-row> </a-row>
<a-row> <a-row>
@@ -1210,13 +1236,23 @@ onMounted(() => {
v-model:value="uploadImportState.from.typeData" v-model:value="uploadImportState.from.typeData"
:placeholder="t('common.inputPlease')" :placeholder="t('common.inputPlease')"
/> />
<a-textarea <a-alert
:disabled="true" :message="uploadImportState.msg"
:hidden="!uploadImportState.msg" :type="uploadImportState.hasFail ? 'warning' : 'info'"
:value="uploadImportState.msg" v-show="uploadImportState.msg.length > 0"
:auto-size="{ minRows: 2, maxRows: 8 }" >
style="background-color: transparent; color: rgba(0, 0, 0, 0.85)" <template #action>
/> <a-button
size="small"
type="link"
danger
@click="fnModalUploadImportFailReason"
v-if="uploadImportState.hasFail"
>
{{ t('views.neUser.auth.importFail') }}
</a-button>
</template>
</a-alert>
</template> </template>
</UploadModal> </UploadModal>
</PageContainer> </PageContainer>

View File

@@ -25,6 +25,7 @@ import {
updateUDMSub, updateUDMSub,
} from '@/api/neData/udm_sub'; } from '@/api/neData/udm_sub';
import { uploadFile } from '@/api/tool/file'; import { uploadFile } from '@/api/tool/file';
import { getNeViewFile } from '@/api/tool/neFile';
const { t } = useI18n(); const { t } = useI18n();
/**网元参数 */ /**网元参数 */
@@ -556,7 +557,8 @@ function transformFormData(data: any) {
if (isValid) { if (isValid) {
smStaticIpArr.push(dnnParts); smStaticIpArr.push(dnnParts);
} }
} else {//无/ 无:也有可能为dnn的字符串 } else {
//无/ 无:也有可能为dnn的字符串
smallRowJson.dnn += '-' + dnnParts; smallRowJson.dnn += '-' + dnnParts;
} }
} }
@@ -971,6 +973,8 @@ type ModalUploadImportStateType = {
loading: boolean; loading: boolean;
/**上传结果信息 */ /**上传结果信息 */
msg: string; msg: string;
/**含失败信息 */
hasFail: boolean;
}; };
/**对话框表格信息导入对象信息状态 */ /**对话框表格信息导入对象信息状态 */
@@ -979,11 +983,40 @@ let uploadImportState: ModalUploadImportStateType = reactive({
title: t('components.UploadModal.uploadTitle'), title: t('components.UploadModal.uploadTitle'),
loading: false, loading: false,
msg: '', msg: '',
hasFail: false,
}); });
/**对话框表格信息导入失败原因 */
function fnModalUploadImportFailReason() {
const neId = queryParams.neId;
if (!neId) return;
const hide = message.loading(t('common.loading'), 0);
getNeViewFile({
neType: 'UDM',
neId: neId,
path: '/tmp',
fileName: 'import_udmuser_err_records.txt',
})
.then(res => {
if (res.code === RESULT_CODE_SUCCESS) {
message.success(t('common.operateOk'), 3);
const blob = new Blob([res.data], {
type: 'text/plain',
});
saveAs(blob, `import_udmuser_err_records_${Date.now()}.txt`);
} else {
message.error(`${res.msg}`, 3);
}
})
.finally(() => {
hide();
});
}
/**对话框表格信息导入弹出窗口 */ /**对话框表格信息导入弹出窗口 */
function fnModalUploadImportOpen() { function fnModalUploadImportOpen() {
uploadImportState.msg = ''; uploadImportState.msg = '';
uploadImportState.hasFail = false;
uploadImportState.loading = false; uploadImportState.loading = false;
uploadImportState.open = true; uploadImportState.open = true;
} }
@@ -1027,6 +1060,14 @@ function fnModalUploadImportUpload(file: File) {
.then(res => { .then(res => {
if (!res) return; if (!res) return;
uploadImportState.msg = res.msg; uploadImportState.msg = res.msg;
const regex = /fail num: (\d+)/;
const match = res.msg.match(regex);
if (match) {
const failNum = Number(match[1]);
uploadImportState.hasFail = failNum > 0;
} else {
uploadImportState.hasFail = false;
}
}) })
.finally(() => { .finally(() => {
hide(); hide();
@@ -1103,26 +1144,42 @@ onMounted(() => {
<template> <template>
<PageContainer> <PageContainer>
<a-card v-show="tableState.seached" :bordered="false" :body-style="{ marginBottom: '24px', paddingBottom: 0 }"> <a-card
v-show="tableState.seached"
:bordered="false"
:body-style="{ marginBottom: '24px', paddingBottom: 0 }"
>
<!-- 表格搜索栏 --> <!-- 表格搜索栏 -->
<a-form :model="queryParams" name="queryParams" layout="horizontal"> <a-form :model="queryParams" name="queryParams" layout="horizontal">
<a-row :gutter="16"> <a-row :gutter="16">
<a-col :lg="6" :md="12" :xs="24"> <a-col :lg="6" :md="12" :xs="24">
<a-form-item :label="t('views.neUser.sub.neType')" name="neId "> <a-form-item :label="t('views.neUser.sub.neType')" name="neId ">
<a-select v-model:value="queryParams.neId" :options="neOtions" :placeholder="t('common.selectPlease')" <a-select
@change="fnGetList(1)" /> v-model:value="queryParams.neId"
:options="neOtions"
:placeholder="t('common.selectPlease')"
@change="fnGetList(1)"
/>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :lg="6" :md="12" :xs="24"> <a-col :lg="6" :md="12" :xs="24">
<a-form-item label="IMSI" name="imsi"> <a-form-item label="IMSI" name="imsi">
<a-input v-model:value="queryParams.imsi" allow-clear :maxlength="15" <a-input
:placeholder="t('common.inputPlease')"></a-input> v-model:value="queryParams.imsi"
allow-clear
:maxlength="15"
:placeholder="t('common.inputPlease')"
></a-input>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :lg="6" :md="12" :xs="24"> <a-col :lg="6" :md="12" :xs="24">
<a-form-item label="MSISDN" name="msisdn"> <a-form-item label="MSISDN" name="msisdn">
<a-input v-model:value="queryParams.msisdn" allow-clear :maxlength="32" <a-input
:placeholder="t('common.inputPlease')"></a-input> v-model:value="queryParams.msisdn"
allow-clear
:maxlength="32"
:placeholder="t('common.inputPlease')"
></a-input>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :lg="6" :md="12" :xs="24"> <a-col :lg="6" :md="12" :xs="24">
@@ -1158,16 +1215,31 @@ onMounted(() => {
{{ t('common.addText') }} {{ t('common.addText') }}
</a-button> </a-button>
<a-button type="primary" danger ghost @click.prevent="fnModalVisibleByBatch()"> <a-button
type="primary"
danger
ghost
@click.prevent="fnModalVisibleByBatch()"
>
<template #icon> <template #icon>
<DeleteOutlined /> <DeleteOutlined />
</template> </template>
{{ t('views.neUser.auth.batchDelText') }} {{ t('views.neUser.auth.batchDelText') }}
</a-button> </a-button>
<a-popconfirm :title="t('views.neUser.sub.loadDataConfirm')" :ok-text="t('common.ok')" <a-popconfirm
:cancel-text="t('common.cancel')" :disabled="modalState.loadDataLoading" @confirm="fnLoadData"> :title="t('views.neUser.sub.loadDataConfirm')"
<a-button type="dashed" danger :disabled="modalState.loadDataLoading" :loading="modalState.loadDataLoading"> :ok-text="t('common.ok')"
:cancel-text="t('common.cancel')"
:disabled="modalState.loadDataLoading"
@confirm="fnLoadData"
>
<a-button
type="dashed"
danger
:disabled="modalState.loadDataLoading"
:loading="modalState.loadDataLoading"
>
<template #icon> <template #icon>
<SyncOutlined /> <SyncOutlined />
</template> </template>
@@ -1182,8 +1254,13 @@ onMounted(() => {
{{ t('views.neUser.sub.import') }} {{ t('views.neUser.sub.import') }}
</a-button> </a-button>
<a-popconfirm :title="t('views.neUser.sub.exportConfirm')" placement="topRight" ok-text="TXT" <a-popconfirm
ok-type="default" @confirm="fnExportList('txt')"> :title="t('views.neUser.sub.exportConfirm')"
placement="topRight"
ok-text="TXT"
ok-type="default"
@confirm="fnExportList('txt')"
>
<a-button type="dashed"> <a-button type="dashed">
<template #icon> <template #icon>
<ExportOutlined /> <ExportOutlined />
@@ -1192,17 +1269,31 @@ onMounted(() => {
</a-button> </a-button>
</a-popconfirm> </a-popconfirm>
<a-button type="default" danger :disabled="tableState.selectedRowKeys.length <= 0" <a-button
:loading="modalState.loadDataLoading" @click.prevent="fnRecordDelete('0')"> type="default"
danger
:disabled="tableState.selectedRowKeys.length <= 0"
:loading="modalState.loadDataLoading"
@click.prevent="fnRecordDelete('0')"
>
<template #icon> <template #icon>
<DeleteOutlined /> <DeleteOutlined />
</template> </template>
{{ t('views.neUser.sub.checkDel') }} {{ t('views.neUser.sub.checkDel') }}
</a-button> </a-button>
<a-popconfirm :title="t('views.neUser.sub.checkExportConfirm')" placement="topRight" ok-text="TXT" <a-popconfirm
ok-type="default" @confirm="fnRecordExport('txt')" :disabled="tableState.selectedRowKeys.length <= 0"> :title="t('views.neUser.sub.checkExportConfirm')"
<a-button type="default" :disabled="tableState.selectedRowKeys.length <= 0"> placement="topRight"
ok-text="TXT"
ok-type="default"
@confirm="fnRecordExport('txt')"
:disabled="tableState.selectedRowKeys.length <= 0"
>
<a-button
type="default"
:disabled="tableState.selectedRowKeys.length <= 0"
>
<template #icon> <template #icon>
<ExportOutlined /> <ExportOutlined />
</template> </template>
@@ -1217,8 +1308,12 @@ onMounted(() => {
<a-space :size="8" align="center"> <a-space :size="8" align="center">
<a-tooltip> <a-tooltip>
<template #title>{{ t('common.searchBarText') }}</template> <template #title>{{ t('common.searchBarText') }}</template>
<a-switch v-model:checked="tableState.seached" :checked-children="t('common.switch.show')" <a-switch
:un-checked-children="t('common.switch.hide')" size="small" /> v-model:checked="tableState.seached"
:checked-children="t('common.switch.show')"
:un-checked-children="t('common.switch.hide')"
size="small"
/>
</a-tooltip> </a-tooltip>
<a-tooltip> <a-tooltip>
<template #title>{{ t('common.reloadText') }}</template> <template #title>{{ t('common.reloadText') }}</template>
@@ -1228,7 +1323,11 @@ onMounted(() => {
</template> </template>
</a-button> </a-button>
</a-tooltip> </a-tooltip>
<TableColumnsDnd cache-id="udmSubData" :columns="tableColumns" v-model:columns-dnd="tableColumnsDnd"> <TableColumnsDnd
cache-id="udmSubData"
:columns="tableColumns"
v-model:columns-dnd="tableColumnsDnd"
>
</TableColumnsDnd> </TableColumnsDnd>
<a-tooltip placement="topRight"> <a-tooltip placement="topRight">
<template #title>{{ t('common.sizeText') }}</template> <template #title>{{ t('common.sizeText') }}</template>
@@ -1239,7 +1338,10 @@ onMounted(() => {
</template> </template>
</a-button> </a-button>
<template #overlay> <template #overlay>
<a-menu :selected-keys="[tableState.size as string]" @click="fnTableSize"> <a-menu
:selected-keys="[tableState.size as string]"
@click="fnTableSize"
>
<a-menu-item key="default"> <a-menu-item key="default">
{{ t('common.size.default') }} {{ t('common.size.default') }}
</a-menu-item> </a-menu-item>
@@ -1257,14 +1359,23 @@ onMounted(() => {
</template> </template>
<!-- 表格列表 --> <!-- 表格列表 -->
<a-table class="table" row-key="imsi" :columns="tableColumnsDnd" :loading="tableState.loading" <a-table
:data-source="tableState.data" :size="tableState.size" :pagination="tablePagination" class="table"
:scroll="{ y: 'calc(100vh - 480px)' }" @change="fnTableChange" row-key="imsi"
@resizeColumn="(w: number, col: any) => (col.width = w)" :row-selection="{ :columns="tableColumnsDnd"
:loading="tableState.loading"
:data-source="tableState.data"
:size="tableState.size"
:pagination="tablePagination"
:scroll="{ y: 'calc(100vh - 480px)' }"
@change="fnTableChange"
@resizeColumn="(w: number, col: any) => (col.width = w)"
:row-selection="{
type: 'checkbox', type: 'checkbox',
selectedRowKeys: tableState.selectedRowKeys, selectedRowKeys: tableState.selectedRowKeys,
onChange: fnTableSelectedRowKeys, onChange: fnTableSelectedRowKeys,
}"> }"
>
<template #bodyCell="{ column, record }"> <template #bodyCell="{ column, record }">
<template v-if="column.key === 'cnFlag'"> <template v-if="column.key === 'cnFlag'">
{{ {{
@@ -1284,7 +1395,10 @@ onMounted(() => {
<a-space :size="8" align="center"> <a-space :size="8" align="center">
<a-tooltip> <a-tooltip>
<template #title>{{ t('common.editText') }}</template> <template #title>{{ t('common.editText') }}</template>
<a-button type="link" @click.prevent="fnModalVisibleByEdit(record.imsi)"> <a-button
type="link"
@click.prevent="fnModalVisibleByEdit(record.imsi)"
>
<template #icon> <template #icon>
<FormOutlined /> <FormOutlined />
</template> </template>
@@ -1292,7 +1406,10 @@ onMounted(() => {
</a-tooltip> </a-tooltip>
<a-tooltip> <a-tooltip>
<template #title>{{ t('common.deleteText') }}</template> <template #title>{{ t('common.deleteText') }}</template>
<a-button type="link" @click.prevent="fnRecordDelete(record.imsi)"> <a-button
type="link"
@click.prevent="fnRecordDelete(record.imsi)"
>
<template #icon> <template #icon>
<DeleteOutlined /> <DeleteOutlined />
</template> </template>
@@ -1305,26 +1422,58 @@ onMounted(() => {
</a-card> </a-card>
<!-- 新增框或修改框 --> <!-- 新增框或修改框 -->
<ProModal :drag="true" :width="800" :destroyOnClose="true" style="top: 0px" <ProModal
:body-style="{ maxHeight: '600px', 'overflow-y': 'auto' }" :keyboard="false" :mask-closable="false" :drag="true"
:open="modalState.openByEdit" :title="modalState.title" :confirm-loading="modalState.confirmLoading" :width="800"
@ok="fnModalOk" @cancel="fnModalCancel"> :destroyOnClose="true"
<a-form name="modalStateFrom" layout="horizontal" :label-col="{ span: 6 }" :labelWrap="true"> style="top: 0px"
:body-style="{ maxHeight: '600px', 'overflow-y': 'auto' }"
:keyboard="false"
:mask-closable="false"
:open="modalState.openByEdit"
:title="modalState.title"
:confirm-loading="modalState.confirmLoading"
@ok="fnModalOk"
@cancel="fnModalCancel"
>
<a-form
name="modalStateFrom"
layout="horizontal"
:label-col="{ span: 6 }"
:labelWrap="true"
>
<a-row> <a-row>
<a-col :lg="12" :md="12" :xs="24"> <a-col :lg="12" :md="12" :xs="24">
<a-form-item :label="t('views.neUser.sub.numAdd')" name="num" v-bind="modalStateFrom.validateInfos.num" <a-form-item
v-show="!modalState.from.id"> :label="t('views.neUser.sub.numAdd')"
<a-input-number v-model:value="modalState.from.num" style="width: 100%" :min="1" :max="10000" name="num"
placeholder="<=10000"></a-input-number> v-bind="modalStateFrom.validateInfos.num"
v-show="!modalState.from.id"
>
<a-input-number
v-model:value="modalState.from.num"
style="width: 100%"
:min="1"
:max="10000"
placeholder="<=10000"
></a-input-number>
</a-form-item> </a-form-item>
</a-col> </a-col>
</a-row> </a-row>
<a-row> <a-row>
<a-col :lg="12" :md="12" :xs="24"> <a-col :lg="12" :md="12" :xs="24">
<a-form-item label="IMSI" name="imsi" v-bind="modalStateFrom.validateInfos.imsi"> <a-form-item
<a-input v-model:value="modalState.from.imsi" allow-clear :maxlength="15" label="IMSI"
:disabled="!!modalState.from.id"> name="imsi"
v-bind="modalStateFrom.validateInfos.imsi"
>
<a-input
v-model:value="modalState.from.imsi"
allow-clear
:maxlength="15"
:disabled="!!modalState.from.id"
>
<template #prefix> <template #prefix>
<a-tooltip placement="topLeft"> <a-tooltip placement="topLeft">
<template #title> <template #title>
@@ -1340,8 +1489,16 @@ 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 label="MSISDN" name="msisdn" v-bind="modalStateFrom.validateInfos.msisdn"> <a-form-item
<a-input v-model:value="modalState.from.msisdn" allow-clear :maxlength="32"> label="MSISDN"
name="msisdn"
v-bind="modalStateFrom.validateInfos.msisdn"
>
<a-input
v-model:value="modalState.from.msisdn"
allow-clear
:maxlength="32"
>
<template #prefix> <template #prefix>
<a-tooltip placement="topLeft"> <a-tooltip placement="topLeft">
<template #title> <template #title>
@@ -1355,24 +1512,49 @@ onMounted(() => {
</a-col> </a-col>
</a-row> </a-row>
<a-form-item :label="t('common.remark')" :label-col="{ span: 3 }" :label-wrap="true"> <a-form-item
<a-textarea v-model:value="modalState.from.remark" :auto-size="{ minRows: 1, maxRows: 6 }" :maxlength="500" :label="t('common.remark')"
:show-count="true" :placeholder="t('common.inputPlease')" /> :label-col="{ span: 3 }"
:label-wrap="true"
>
<a-textarea
v-model:value="modalState.from.remark"
:auto-size="{ minRows: 1, maxRows: 6 }"
:maxlength="500"
:show-count="true"
:placeholder="t('common.inputPlease')"
/>
</a-form-item> </a-form-item>
<!-- SM Data ---- S --> <!-- SM Data ---- S -->
<a-divider orientation="left"> <a-divider orientation="left">
Subscribed SM Data Subscribed SM Data
<a-tooltip title="Add SM Data"> <a-tooltip title="Add SM Data">
<a-button shape="circle" @click="addBigRow" style="margin-left: 10px"> <a-button
shape="circle"
@click="addBigRow"
style="margin-left: 10px"
>
<template #icon><plus-outlined /></template> <template #icon><plus-outlined /></template>
</a-button> </a-tooltip></a-divider> </a-button> </a-tooltip
></a-divider>
<!-- 大数组布局 --> <!-- 大数组布局 -->
<div v-for="(row, index) in bigRows" :key="String(row.id)"> <div v-for="(row, index) in bigRows" :key="String(row.id)">
<a-row> <a-row>
<a-col :lg="6" :md="6" :xs="24"> <a-col :lg="6" :md="6" :xs="24">
<a-form-item label="SST" name="row.sst" :label-col="{ span: 12 }" :validateTrigger="[]" :required="true"> <a-form-item
<a-input-number v-model:value="row.sst" :min="1" :max="3" :step="1" /> label="SST"
name="row.sst"
:label-col="{ span: 12 }"
:validateTrigger="[]"
:required="true"
>
<a-input-number
v-model:value="row.sst"
:min="1"
:max="3"
:step="1"
/>
</a-form-item> </a-form-item>
</a-col> </a-col>
@@ -1385,7 +1567,11 @@ onMounted(() => {
<a-row> <a-row>
<a-col :span="4"> <a-col :span="4">
<a-tooltip title="Add DNN"> <a-tooltip title="Add DNN">
<a-button shape="circle" @click="addSmallRow(row.id)" style="margin-left:10px ;"> <a-button
shape="circle"
@click="addSmallRow(row.id)"
style="margin-left: 10px"
>
<template #icon><plus-square-outlined /></template> <template #icon><plus-square-outlined /></template>
</a-button> </a-button>
</a-tooltip> </a-tooltip>
@@ -1402,27 +1588,51 @@ onMounted(() => {
</a-row> </a-row>
<!-- 小数组布局 --> <!-- 小数组布局 -->
<div v-for="(smallRow, smallIndex) in row.smallRows" :key="String(smallRow.id)"> <div
v-for="(smallRow, smallIndex) in row.smallRows"
:key="String(smallRow.id)"
>
<a-row> <a-row>
<a-col :lg="6" :md="6" :xs="24"> <a-col :lg="6" :md="6" :xs="24">
<a-form-item label="DNN/APN" name="dnn" :validateTrigger="[]" :required="true" <a-form-item
:label-col="{ span: 12 }"> label="DNN/APN"
name="dnn"
:validateTrigger="[]"
:required="true"
:label-col="{ span: 12 }"
>
<a-input v-model:value="smallRow.dnn" allow-clear></a-input> <a-input v-model:value="smallRow.dnn" allow-clear></a-input>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :lg="8" :md="8" :xs="24"> <a-col :lg="8" :md="8" :xs="24">
<a-form-item label="Static IP" name="smStaticIp" :label-col="{ span: 5 }"> <a-form-item
<a-input v-model:value="smallRow.smStaticIp" allow-clear></a-input> label="Static IP"
name="smStaticIp"
:label-col="{ span: 5 }"
>
<a-input
v-model:value="smallRow.smStaticIp"
allow-clear
></a-input>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :lg="8" :md="8" :xs="24"> <a-col :lg="8" :md="8" :xs="24">
<a-form-item label="Routing Behind MS IP" style="margin-left:10px ;" name="msIp"> <a-form-item
label="Routing Behind MS IP"
style="margin-left: 10px"
name="msIp"
>
<a-input v-model:value="smallRow.msIp" allow-clear></a-input> <a-input v-model:value="smallRow.msIp" allow-clear></a-input>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :lg="2" :md="2" :xs="24" v-if="smallIndex !== 0"> <a-col :lg="2" :md="2" :xs="24" v-if="smallIndex !== 0">
<a-tooltip title="Delete DNN"> <a-tooltip title="Delete DNN">
<a-button danger shape="circle" @click="delDNN(smallIndex, row.id)" style="margin-left:10px ;"> <a-button
danger
shape="circle"
@click="delDNN(smallIndex, row.id)"
style="margin-left: 10px"
>
<template #icon><close-square-outlined /></template> <template #icon><close-square-outlined /></template>
</a-button> </a-button>
</a-tooltip> </a-tooltip>
@@ -1439,7 +1649,11 @@ onMounted(() => {
</template> </template>
<a-row> <a-row>
<a-col :lg="24" :md="24" :xs="24"> <a-col :lg="24" :md="24" :xs="24">
<a-form-item label="5GC Flag" name="cnFlag" :help="t('views.neUser.sub.cnFlag')"> <a-form-item
label="5GC Flag"
name="cnFlag"
:help="t('views.neUser.sub.cnFlag')"
>
<a-select v-model:value="modalState.from.cnType"> <a-select v-model:value="modalState.from.cnType">
<a-select-option value="3"> <a-select-option value="3">
{{ t('views.neUser.sub.enable') }} {{ t('views.neUser.sub.enable') }}
@@ -1451,44 +1665,71 @@ onMounted(() => {
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :lg="24" :md="24" :xs="24"> <a-col :lg="24" :md="24" :xs="24">
<a-form-item label="5G Subscribed UE AMBR Template" name="ambr" <a-form-item
v-bind="modalStateFrom.validateInfos.ambr"> label="5G Subscribed UE AMBR Template"
<a-input v-model:value="modalState.from.ambr" allow-clear :maxlength="50"> name="ambr"
v-bind="modalStateFrom.validateInfos.ambr"
>
<a-input
v-model:value="modalState.from.ambr"
allow-clear
:maxlength="50"
>
<template #prefix> <template #prefix>
<a-tooltip placement="topLeft"> <a-tooltip placement="topLeft">
<template #title> <template #title>
{{ t('views.neUser.sub.inputTip', { num: '50' }) }} {{ t('views.neUser.sub.inputTip', { num: '50' }) }}
</template> </template>
<InfoCircleOutlined style="opacity: 0.45; color: inherit" /> <InfoCircleOutlined
style="opacity: 0.45; color: inherit"
/>
</a-tooltip> </a-tooltip>
</template> </template>
</a-input> </a-input>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :lg="24" :md="24" :xs="24"> <a-col :lg="24" :md="24" :xs="24">
<a-form-item label="5G Subscribed SNSSAIs Template" name="nssai" <a-form-item
v-bind="modalStateFrom.validateInfos.nssai"> label="5G Subscribed SNSSAIs Template"
<a-input v-model:value="modalState.from.nssai" allow-clear :maxlength="50"> name="nssai"
v-bind="modalStateFrom.validateInfos.nssai"
>
<a-input
v-model:value="modalState.from.nssai"
allow-clear
:maxlength="50"
>
<template #prefix> <template #prefix>
<a-tooltip placement="topLeft"> <a-tooltip placement="topLeft">
<template #title> <template #title>
{{ t('views.neUser.sub.inputTip', { num: '50' }) }} {{ t('views.neUser.sub.inputTip', { num: '50' }) }}
</template> </template>
<InfoCircleOutlined style="opacity: 0.45; color: inherit" /> <InfoCircleOutlined
style="opacity: 0.45; color: inherit"
/>
</a-tooltip> </a-tooltip>
</template> </template>
</a-input> </a-input>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :lg="24" :md="24" :xs="24"> <a-col :lg="24" :md="24" :xs="24">
<a-form-item label="5G Subscribed SMF Selection Data Template" name="smfSel"> <a-form-item
<a-input v-model:value="modalState.from.smfSel" allow-clear :maxlength="50"> label="5G Subscribed SMF Selection Data Template"
name="smfSel"
>
<a-input
v-model:value="modalState.from.smfSel"
allow-clear
:maxlength="50"
>
<template #prefix> <template #prefix>
<a-tooltip placement="topLeft"> <a-tooltip placement="topLeft">
<template #title> <template #title>
{{ t('views.neUser.sub.inputTip', { num: '50' }) }} {{ t('views.neUser.sub.inputTip', { num: '50' }) }}
</template> </template>
<InfoCircleOutlined style="opacity: 0.45; color: inherit" /> <InfoCircleOutlined
style="opacity: 0.45; color: inherit"
/>
</a-tooltip> </a-tooltip>
</template> </template>
</a-input> </a-input>
@@ -1496,48 +1737,77 @@ onMounted(() => {
</a-col> </a-col>
<a-col :lg="24" :md="24" :xs="24"> <a-col :lg="24" :md="24" :xs="24">
<a-form-item label="5G Forbidden Areas Template" name="arfb"> <a-form-item label="5G Forbidden Areas Template" name="arfb">
<a-input v-model:value="modalState.from.arfb" allow-clear :maxlength="50"> <a-input
v-model:value="modalState.from.arfb"
allow-clear
:maxlength="50"
>
<template #prefix> <template #prefix>
<a-tooltip placement="topLeft"> <a-tooltip placement="topLeft">
<template #title> <template #title>
{{ t('views.neUser.sub.arfbTip') }} {{ t('views.neUser.sub.arfbTip') }}
</template> </template>
<InfoCircleOutlined style="opacity: 0.45; color: inherit" /> <InfoCircleOutlined
style="opacity: 0.45; color: inherit"
/>
</a-tooltip> </a-tooltip>
</template> </template>
</a-input> </a-input>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :lg="24" :md="24" :xs="24"> <a-col :lg="24" :md="24" :xs="24">
<a-form-item label="5G CAG Template" name="cag" v-bind="modalStateFrom.validateInfos.cag"> <a-form-item
<a-input v-model:value="modalState.from.cag" allow-clear :maxlength="50"> label="5G CAG Template"
name="cag"
v-bind="modalStateFrom.validateInfos.cag"
>
<a-input
v-model:value="modalState.from.cag"
allow-clear
:maxlength="50"
>
<template #prefix> <template #prefix>
<a-tooltip placement="topLeft"> <a-tooltip placement="topLeft">
<template #title> <template #title>
{{ t('views.neUser.sub.inputTip', { num: '50' }) }} {{ t('views.neUser.sub.inputTip', { num: '50' }) }}
</template> </template>
<InfoCircleOutlined style="opacity: 0.45; color: inherit" /> <InfoCircleOutlined
style="opacity: 0.45; color: inherit"
/>
</a-tooltip> </a-tooltip>
</template> </template>
</a-input> </a-input>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :lg="24" :md="24" :xs="24"> <a-col :lg="24" :md="24" :xs="24">
<a-form-item label="5G Service Area Restriction Template" name="sar"> <a-form-item
<a-input v-model:value="modalState.from.sar" allow-clear :maxlength="50"> label="5G Service Area Restriction Template"
name="sar"
>
<a-input
v-model:value="modalState.from.sar"
allow-clear
:maxlength="50"
>
<template #prefix> <template #prefix>
<a-tooltip placement="topLeft"> <a-tooltip placement="topLeft">
<template #title> <template #title>
{{ t('views.neUser.sub.sarTip') }} {{ t('views.neUser.sub.sarTip') }}
</template> </template>
<InfoCircleOutlined style="opacity: 0.45; color: inherit" /> <InfoCircleOutlined
style="opacity: 0.45; color: inherit"
/>
</a-tooltip> </a-tooltip>
</template> </template>
</a-input> </a-input>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :lg="24" :md="24" :xs="24"> <a-col :lg="24" :md="24" :xs="24">
<a-form-item label="5G MICO Mode" name="mico" :help="t('views.neUser.sub.micoTip')"> <a-form-item
label="5G MICO Mode"
name="mico"
:help="t('views.neUser.sub.micoTip')"
>
<a-select v-model:value="modalState.from.mico"> <a-select v-model:value="modalState.from.mico">
<a-select-option value="1"> <a-select-option value="1">
{{ t('views.neUser.sub.enable') }} {{ t('views.neUser.sub.enable') }}
@@ -1560,14 +1830,21 @@ onMounted(() => {
</a-col> </a-col>
<a-col :lg="24" :md="24" :xs="24"> <a-col :lg="24" :md="24" :xs="24">
<a-form-item label="5G UE Usage Type" name="ueUsageType"> <a-form-item label="5G UE Usage Type" name="ueUsageType">
<a-input-number v-model:value="modalState.from.ueUsageType" style="width: 100%" :min="0" :max="127" <a-input-number
placeholder="0 ~ 127"> v-model:value="modalState.from.ueUsageType"
style="width: 100%"
:min="0"
:max="127"
placeholder="0 ~ 127"
>
<template #prefix> <template #prefix>
<a-tooltip placement="topLeft"> <a-tooltip placement="topLeft">
<template #title> <template #title>
{{ t('views.neUser.sub.ueTypeTip') }} {{ t('views.neUser.sub.ueTypeTip') }}
</template> </template>
<InfoCircleOutlined style="opacity: 0.45; color: inherit" /> <InfoCircleOutlined
style="opacity: 0.45; color: inherit"
/>
</a-tooltip> </a-tooltip>
</template> </template>
</a-input-number> </a-input-number>
@@ -1575,14 +1852,21 @@ onMounted(() => {
</a-col> </a-col>
<a-col :lg="24" :md="24" :xs="24"> <a-col :lg="24" :md="24" :xs="24">
<a-form-item label="5G RFSP Index" name="rfspIndex"> <a-form-item label="5G RFSP Index" name="rfspIndex">
<a-input-number v-model:value="modalState.from.rfspIndex" style="width: 100%" :min="0" :max="127" <a-input-number
placeholder="0 ~ 127"> v-model:value="modalState.from.rfspIndex"
style="width: 100%"
:min="0"
:max="127"
placeholder="0 ~ 127"
>
<template #prefix> <template #prefix>
<a-tooltip placement="topLeft"> <a-tooltip placement="topLeft">
<template #title> <template #title>
{{ t('views.neUser.sub.rfspTip') }} {{ t('views.neUser.sub.rfspTip') }}
</template> </template>
<InfoCircleOutlined style="opacity: 0.45; color: inherit" /> <InfoCircleOutlined
style="opacity: 0.45; color: inherit"
/>
</a-tooltip> </a-tooltip>
</template> </template>
</a-input-number> </a-input-number>
@@ -1597,7 +1881,11 @@ onMounted(() => {
</template> </template>
<a-row> <a-row>
<a-col :lg="24" :md="24" :xs="24"> <a-col :lg="24" :md="24" :xs="24">
<a-form-item label="4G EPS Flag" name="epsFlag" :help="t('views.neUser.sub.epsFlagTip')"> <a-form-item
label="4G EPS Flag"
name="epsFlag"
:help="t('views.neUser.sub.epsFlagTip')"
>
<a-select v-model:value="modalState.from.epsFlag"> <a-select v-model:value="modalState.from.epsFlag">
<a-select-option value="1"> <a-select-option value="1">
{{ t('views.neUser.sub.enable') }} {{ t('views.neUser.sub.enable') }}
@@ -1609,15 +1897,24 @@ onMounted(() => {
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :lg="24" :md="24" :xs="24"> <a-col :lg="24" :md="24" :xs="24">
<a-form-item label="4G EPS User Template Name" name="epstpl" <a-form-item
v-bind="modalStateFrom.validateInfos.epstpl"> label="4G EPS User Template Name"
<a-input v-model:value="modalState.from.epstpl" allow-clear :maxlength="50"> name="epstpl"
v-bind="modalStateFrom.validateInfos.epstpl"
>
<a-input
v-model:value="modalState.from.epstpl"
allow-clear
:maxlength="50"
>
<template #prefix> <template #prefix>
<a-tooltip placement="topLeft"> <a-tooltip placement="topLeft">
<template #title> <template #title>
{{ t('views.neUser.sub.inputTip', { num: '50' }) }} {{ t('views.neUser.sub.inputTip', { num: '50' }) }}
</template> </template>
<InfoCircleOutlined style="opacity: 0.45; color: inherit" /> <InfoCircleOutlined
style="opacity: 0.45; color: inherit"
/>
</a-tooltip> </a-tooltip>
</template> </template>
</a-input> </a-input>
@@ -1626,14 +1923,20 @@ onMounted(() => {
</a-row> </a-row>
<a-row> <a-row>
<a-col :lg="24" :md="24" :xs="24"> <a-col :lg="24" :md="24" :xs="24">
<a-form-item label="4G Static IP" v-bind="modalStateFrom.validateInfos.staticIp" name="staticIp"> <a-form-item
label="4G Static IP"
v-bind="modalStateFrom.validateInfos.staticIp"
name="staticIp"
>
<a-input v-model:value="modalState.from.staticIp" allow-clear> <a-input v-model:value="modalState.from.staticIp" allow-clear>
<template #prefix> <template #prefix>
<a-tooltip placement="topLeft"> <a-tooltip placement="topLeft">
<template #title> <template #title>
{{ t('views.neUser.sub.staticIpTip') }} {{ t('views.neUser.sub.staticIpTip') }}
</template> </template>
<InfoCircleOutlined style="opacity: 0.45; color: inherit" /> <InfoCircleOutlined
style="opacity: 0.45; color: inherit"
/>
</a-tooltip> </a-tooltip>
</template> </template>
</a-input> </a-input>
@@ -1653,33 +1956,73 @@ onMounted(() => {
</a-input> </a-input>
</a-form-item> </a-form-item>
<a-form-item label="4G APN Context List" name="apnContext" :help="t('views.neUser.sub.apnContextTip')"> <a-form-item
label="4G APN Context List"
name="apnContext"
:help="t('views.neUser.sub.apnContextTip')"
>
<a-input-group compact> <a-input-group compact>
<a-input-number v-for="(_, i) in modalState.from.apnContext" :key="i" :title="i" style="width: 16.5%" <a-input-number
:min="0" :max="99" v-model:value="modalState.from.apnContext[i]"></a-input-number> v-for="(_, i) in modalState.from.apnContext"
:key="i"
:title="i"
style="width: 16.5%"
:min="0"
:max="99"
v-model:value="modalState.from.apnContext[i]"
></a-input-number>
</a-input-group> </a-input-group>
</a-form-item> </a-form-item>
<a-form-item label="4G EPS ODB" name="epsOdb" v-bind="modalStateFrom.validateInfos.epsOdb"> <a-form-item
<a-tooltip :title="t('views.neUser.sub.epsOdbTip')" placement="topLeft"> label="4G EPS ODB"
<a-select v-model:value="modalState.from.epsOdb" mode="multiple" style="width: 100%" name="epsOdb"
placeholder="Please select" :options="modalStateFromOption.odbJson" @change=""> v-bind="modalStateFrom.validateInfos.epsOdb"
>
<a-tooltip
:title="t('views.neUser.sub.epsOdbTip')"
placement="topLeft"
>
<a-select
v-model:value="modalState.from.epsOdb"
mode="multiple"
style="width: 100%"
placeholder="Please select"
:options="modalStateFromOption.odbJson"
@change=""
>
</a-select> </a-select>
</a-tooltip> </a-tooltip>
</a-form-item> </a-form-item>
<a-form-item label="4G HPLMN ODB" name="hplmnOdb"> <a-form-item label="4G HPLMN ODB" name="hplmnOdb">
<a-tooltip :title="t('views.neUser.sub.hplmnOdbTip')" placement="topLeft"> <a-tooltip
<a-select v-model:value="modalState.from.hplmnOdb" mode="multiple" style="width: 100%" :title="t('views.neUser.sub.hplmnOdbTip')"
:options="modalStateFromOption.hplmnOdb" @change=""> placement="topLeft"
>
<a-select
v-model:value="modalState.from.hplmnOdb"
mode="multiple"
style="width: 100%"
:options="modalStateFromOption.hplmnOdb"
@change=""
>
</a-select> </a-select>
</a-tooltip> </a-tooltip>
</a-form-item> </a-form-item>
<a-form-item label="4G Access Restriction Data" name="ard"> <a-form-item label="4G Access Restriction Data" name="ard">
<a-tooltip :title="t('views.neUser.sub.ardTip')" placement="topLeft"> <a-tooltip
<a-select v-model:value="modalState.from.ard" mode="multiple" style="width: 100%" :title="t('views.neUser.sub.ardTip')"
:options="modalStateFromOption.ardJson" @change=""> placement="topLeft"
>
<a-select
v-model:value="modalState.from.ard"
mode="multiple"
style="width: 100%"
:options="modalStateFromOption.ardJson"
@change=""
>
</a-select> </a-select>
</a-tooltip> </a-tooltip>
</a-form-item> </a-form-item>
@@ -1689,15 +2032,36 @@ onMounted(() => {
</ProModal> </ProModal>
<!-- 批量删除框 --> <!-- 批量删除框 -->
<ProModal :drag="true" :destroyOnClose="true" style="top: 0px" :keyboard="false" :mask-closable="false" <ProModal
:open="modalState.openByBatchDel" :title="modalState.title" :confirm-loading="modalState.confirmLoading" :drag="true"
@ok="fnBatchDelModalOk" @cancel="fnBatchDelModalCancel"> :destroyOnClose="true"
<a-form name="modalStateBatchDelFrom" layout="horizontal" :label-col="{ span: 6 }" :labelWrap="true"> style="top: 0px"
:keyboard="false"
:mask-closable="false"
:open="modalState.openByBatchDel"
:title="modalState.title"
:confirm-loading="modalState.confirmLoading"
@ok="fnBatchDelModalOk"
@cancel="fnBatchDelModalCancel"
>
<a-form
name="modalStateBatchDelFrom"
layout="horizontal"
:label-col="{ span: 6 }"
:labelWrap="true"
>
<a-row> <a-row>
<a-col :lg="24" :md="24" :xs="24"> <a-col :lg="24" :md="24" :xs="24">
<a-form-item :label="t('views.neUser.sub.startIMSI')" name="imsi" <a-form-item
v-bind="modalStateBatchDelFrom.validateInfos.imsi"> :label="t('views.neUser.sub.startIMSI')"
<a-input v-model:value="modalState.BatchDelForm.imsi" allow-clear :maxlength="15"> name="imsi"
v-bind="modalStateBatchDelFrom.validateInfos.imsi"
>
<a-input
v-model:value="modalState.BatchDelForm.imsi"
allow-clear
:maxlength="15"
>
<template #prefix> <template #prefix>
<a-tooltip placement="topLeft"> <a-tooltip placement="topLeft">
<template #title> <template #title>
@@ -1713,10 +2077,18 @@ onMounted(() => {
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :lg="24" :md="24" :xs="24"> <a-col :lg="24" :md="24" :xs="24">
<a-form-item :label="t('views.neUser.sub.numDel')" name="num" <a-form-item
v-bind="modalStateBatchDelFrom.validateInfos.num"> :label="t('views.neUser.sub.numDel')"
<a-input-number v-model:value="modalState.BatchDelForm.num" style="width: 100%" :min="1" :max="10000" name="num"
placeholder="<=10000"></a-input-number> v-bind="modalStateBatchDelFrom.validateInfos.num"
>
<a-input-number
v-model:value="modalState.BatchDelForm.num"
style="width: 100%"
:min="1"
:max="10000"
placeholder="<=10000"
></a-input-number>
</a-form-item> </a-form-item>
</a-col> </a-col>
</a-row> </a-row>
@@ -1724,12 +2096,33 @@ onMounted(() => {
</ProModal> </ProModal>
<!-- 上传导入表格数据文件框 --> <!-- 上传导入表格数据文件框 -->
<UploadModal :title="uploadImportState.title" :loading="uploadImportState.loading" <UploadModal
@upload="fnModalUploadImportUpload" @close="fnModalUploadImportClose" v-model:open="uploadImportState.open" :title="uploadImportState.title"
:ext="['.txt']" :size="10"> :loading="uploadImportState.loading"
@upload="fnModalUploadImportUpload"
@close="fnModalUploadImportClose"
v-model:open="uploadImportState.open"
:ext="['.txt']"
:size="10"
>
<template #default> <template #default>
<a-textarea :disabled="true" :hidden="!uploadImportState.msg" :value="uploadImportState.msg" <a-alert
:auto-size="{ minRows: 2, maxRows: 8 }" style="background-color: transparent; color: rgba(0, 0, 0, 0.85)" /> :message="uploadImportState.msg"
:type="uploadImportState.hasFail ? 'warning' : 'info'"
v-show="uploadImportState.msg.length > 0"
>
<template #action>
<a-button
size="small"
type="link"
danger
@click="fnModalUploadImportFailReason"
v-if="uploadImportState.hasFail"
>
{{ t('views.neUser.auth.importFail') }}
</a-button>
</template>
</a-alert>
</template> </template>
</UploadModal> </UploadModal>
</PageContainer> </PageContainer>