feat: 网元软件包支持携带依赖进行记录
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
<script setup lang="ts">
|
||||
import { reactive, onMounted, toRaw, watch } from 'vue';
|
||||
import { message, Form, Upload } from 'ant-design-vue/lib';
|
||||
import { message, Form, Upload, notification } from 'ant-design-vue/lib';
|
||||
import useI18n from '@/hooks/useI18n';
|
||||
import { RESULT_CODE_SUCCESS } from '@/constants/result-constants';
|
||||
import { NE_TYPE_LIST } from '@/constants/ne-constants';
|
||||
import { NE_EXPAND_LIST, NE_TYPE_LIST } from '@/constants/ne-constants';
|
||||
import { UploadRequestOption } from 'ant-design-vue/lib/vc-upload/interface';
|
||||
import {
|
||||
addNeSoftware,
|
||||
@@ -44,6 +44,8 @@ type ModalStateType = {
|
||||
confirmLoading: boolean;
|
||||
/**上传文件 */
|
||||
uploadFiles: any[];
|
||||
/**上传文件-依赖包 */
|
||||
uploadFilesDep: any[];
|
||||
};
|
||||
|
||||
/**对话框对象信息状态 */
|
||||
@@ -60,13 +62,14 @@ let modalState: ModalStateType = reactive({
|
||||
},
|
||||
confirmLoading: false,
|
||||
uploadFiles: [],
|
||||
uploadFilesDep: [],
|
||||
});
|
||||
|
||||
/**对话框内表单属性和校验规则 */
|
||||
const modalStateFrom = Form.useForm(
|
||||
modalState.from,
|
||||
reactive({
|
||||
type: [
|
||||
neType: [
|
||||
{
|
||||
required: true,
|
||||
min: 1,
|
||||
@@ -103,6 +106,19 @@ function fnModalOk() {
|
||||
modalState.confirmLoading = true;
|
||||
const hide = message.loading(t('common.loading'), 0);
|
||||
const from = toRaw(modalState.from);
|
||||
|
||||
// 安装带依赖包
|
||||
if (modalState.uploadFilesDep.length > 0) {
|
||||
const depFiles = [];
|
||||
for (const depFile of modalState.uploadFilesDep) {
|
||||
if (depFile.status === 'done' && depFile.path) {
|
||||
depFiles.push(depFile.path);
|
||||
}
|
||||
}
|
||||
depFiles.push(from.path);
|
||||
from.path = depFiles.join(',');
|
||||
}
|
||||
|
||||
const software = from.id ? updateNeSoftware(from) : addNeSoftware(from);
|
||||
software.then(res => {
|
||||
if (res.code === RESULT_CODE_SUCCESS) {
|
||||
@@ -137,6 +153,7 @@ function fnModalCancel() {
|
||||
modalState.confirmLoading = false;
|
||||
modalStateFrom.resetFields();
|
||||
modalState.uploadFiles = [];
|
||||
modalState.uploadFilesDep = [];
|
||||
emit('cancel');
|
||||
emit('update:visible', false);
|
||||
}
|
||||
@@ -155,29 +172,46 @@ function fnBeforeUploadFile(file: FileType) {
|
||||
);
|
||||
return Upload.LIST_IGNORE;
|
||||
}
|
||||
|
||||
// 取网元类型判断是否支持
|
||||
let neType = '';
|
||||
const neTypeIndex = fileName.indexOf('-');
|
||||
if (neTypeIndex !== -1) {
|
||||
neType = fileName.substring(0, neTypeIndex).toUpperCase();
|
||||
}
|
||||
// 主包类型
|
||||
if (!NE_TYPE_LIST.includes(neType)) {
|
||||
notification.warning({
|
||||
message: fileName,
|
||||
description: t('views.ne.neSoftware.fileCheckType'),
|
||||
});
|
||||
return Upload.LIST_IGNORE;
|
||||
}
|
||||
modalState.from.neType = neType;
|
||||
|
||||
// 根据给定的软件名取版本号 ims-r2.2312.x-ub22.deb
|
||||
const matches = fileName.match(/([0-9.]+[0-9x]+)/);
|
||||
if (matches) {
|
||||
modalState.from.version = matches[0];
|
||||
}
|
||||
const neTypeIndex = fileName.indexOf('-');
|
||||
if (neTypeIndex !== -1) {
|
||||
modalState.from.neType = fileName.substring(0, neTypeIndex).toUpperCase();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**表单上传文件 */
|
||||
function fnUploadFile(up: UploadRequestOption) {
|
||||
const uploadFile = modalState.uploadFiles.find(
|
||||
item => item.uid === (up.file as any).uid
|
||||
);
|
||||
if (!uploadFile) return;
|
||||
|
||||
// 发送请求
|
||||
modalState.confirmLoading = true;
|
||||
uploadFileChunk(up.file as File, 5, 'software')
|
||||
.then(res => {
|
||||
if (res.code === RESULT_CODE_SUCCESS) {
|
||||
// 改为完成状态
|
||||
const file = modalState.uploadFiles[0];
|
||||
file.percent = 100;
|
||||
file.status = 'done';
|
||||
uploadFile.percent = 100;
|
||||
uploadFile.status = 'done';
|
||||
uploadFile.path = res.data.fileName;
|
||||
// 预置到表单
|
||||
const { fileName, originalFileName } = res.data;
|
||||
modalState.from.name = originalFileName;
|
||||
@@ -186,6 +220,85 @@ function fnUploadFile(up: UploadRequestOption) {
|
||||
message.error(res.msg, 3);
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
uploadFile.percent = 0;
|
||||
uploadFile.status = 'error';
|
||||
uploadFile.response = error.message;
|
||||
})
|
||||
.finally(() => {
|
||||
modalState.confirmLoading = false;
|
||||
});
|
||||
}
|
||||
|
||||
/**表单上传前检查或转换压缩-依赖包 */
|
||||
function fnBeforeUploadFileDep(file: FileType) {
|
||||
if (modalState.confirmLoading) return false;
|
||||
const fileName = file.name;
|
||||
const suff = fileName.substring(fileName.lastIndexOf('.'));
|
||||
if (!['.deb', '.rpm'].includes(suff)) {
|
||||
message.error(
|
||||
t('views.configManage.softwareManage.onlyAble', {
|
||||
fileText: '(.deb、.rpm)',
|
||||
}),
|
||||
3
|
||||
);
|
||||
return Upload.LIST_IGNORE;
|
||||
}
|
||||
|
||||
// 已存在同名文件
|
||||
const hasItem = modalState.uploadFilesDep.find(
|
||||
item => item.name === fileName
|
||||
);
|
||||
if (hasItem) {
|
||||
notification.warning({
|
||||
message: fileName,
|
||||
description: t('views.ne.neSoftware.fileNameExists'),
|
||||
});
|
||||
return Upload.LIST_IGNORE;
|
||||
}
|
||||
|
||||
// 取网元类型判断是否支持
|
||||
let neType = '';
|
||||
const neTypeIndex = fileName.indexOf('-');
|
||||
if (neTypeIndex !== -1) {
|
||||
neType = fileName.substring(0, neTypeIndex).toUpperCase();
|
||||
}
|
||||
// 依赖包类型
|
||||
if (!NE_EXPAND_LIST.includes(neType)) {
|
||||
notification.warning({
|
||||
message: fileName,
|
||||
description: t('views.ne.neSoftware.fileCheckTypeDep'),
|
||||
});
|
||||
return Upload.LIST_IGNORE;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**表单上传文件-依赖包 */
|
||||
function fnUploadFileDep(up: UploadRequestOption) {
|
||||
const uploadFile = modalState.uploadFilesDep.find(
|
||||
item => item.uid === (up.file as any).uid
|
||||
);
|
||||
if (!uploadFile) return;
|
||||
|
||||
// 发送请求
|
||||
uploadFileChunk(up.file as File, 5, 'software')
|
||||
.then(res => {
|
||||
if (res.code === RESULT_CODE_SUCCESS) {
|
||||
// 改为完成状态
|
||||
uploadFile.percent = 100;
|
||||
uploadFile.status = 'done';
|
||||
uploadFile.path = res.data.fileName;
|
||||
} else {
|
||||
message.error(res.msg, 3);
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
uploadFile.percent = 0;
|
||||
uploadFile.status = 'error';
|
||||
uploadFile.response = error.message;
|
||||
})
|
||||
.finally(() => {
|
||||
modalState.confirmLoading = false;
|
||||
});
|
||||
@@ -232,7 +345,7 @@ onMounted(() => {});
|
||||
|
||||
<template>
|
||||
<a-modal
|
||||
width="500px"
|
||||
width="550px"
|
||||
:keyboard="false"
|
||||
:mask-closable="false"
|
||||
:visible="modalState.visibleByEdit"
|
||||
@@ -248,36 +361,67 @@ onMounted(() => {});
|
||||
:label-col="{ span: 8 }"
|
||||
:labelWrap="true"
|
||||
>
|
||||
<a-form-item
|
||||
:label="t('views.ne.neSoftware.path')"
|
||||
:help="t('views.ne.neSoftware.uploadFileName')"
|
||||
name="file"
|
||||
v-bind="modalStateFrom.validateInfos.path"
|
||||
v-if="modalState.from.id === ''"
|
||||
>
|
||||
<a-upload
|
||||
<template v-if="modalState.from.id === ''">
|
||||
<a-form-item
|
||||
:label="t('views.ne.neSoftware.path')"
|
||||
:help="t('views.ne.neSoftware.uploadFileName')"
|
||||
name="file"
|
||||
v-model:file-list="modalState.uploadFiles"
|
||||
accept=".rpm,.deb"
|
||||
list-type="text"
|
||||
:max-count="1"
|
||||
:show-upload-list="{
|
||||
showPreviewIcon: false,
|
||||
showRemoveIcon: false,
|
||||
showDownloadIcon: false,
|
||||
}"
|
||||
:before-upload="fnBeforeUploadFile"
|
||||
:custom-request="fnUploadFile"
|
||||
:disabled="modalState.confirmLoading"
|
||||
v-bind="modalStateFrom.validateInfos.path"
|
||||
>
|
||||
<a-button type="primary">
|
||||
<template #icon>
|
||||
<UploadOutlined />
|
||||
</template>
|
||||
{{ t('views.ne.neSoftware.upload') }}
|
||||
</a-button>
|
||||
</a-upload>
|
||||
</a-form-item>
|
||||
<a-upload
|
||||
name="file"
|
||||
v-model:file-list="modalState.uploadFiles"
|
||||
accept=".rpm,.deb"
|
||||
list-type="text"
|
||||
:max-count="1"
|
||||
:show-upload-list="{
|
||||
showPreviewIcon: false,
|
||||
showRemoveIcon: false,
|
||||
showDownloadIcon: false,
|
||||
}"
|
||||
:before-upload="fnBeforeUploadFile"
|
||||
:custom-request="fnUploadFile"
|
||||
:disabled="modalState.confirmLoading"
|
||||
>
|
||||
<a-button type="primary">
|
||||
<template #icon>
|
||||
<UploadOutlined />
|
||||
</template>
|
||||
{{ t('views.ne.neSoftware.upload') }}
|
||||
</a-button>
|
||||
</a-upload>
|
||||
</a-form-item>
|
||||
|
||||
<a-form-item
|
||||
name="dep"
|
||||
:label="t('views.ne.neSoftware.dependFile')"
|
||||
:help="t('views.ne.neSoftware.dependFileTip')"
|
||||
>
|
||||
<a-upload
|
||||
name="file"
|
||||
v-model:file-list="modalState.uploadFilesDep"
|
||||
accept=".rpm,.deb"
|
||||
list-type="text"
|
||||
:multiple="true"
|
||||
:max-count="5"
|
||||
:show-upload-list="{
|
||||
showPreviewIcon: false,
|
||||
showRemoveIcon: true,
|
||||
showDownloadIcon: false,
|
||||
}"
|
||||
:before-upload="fnBeforeUploadFileDep"
|
||||
:custom-request="fnUploadFileDep"
|
||||
:disabled="modalState.confirmLoading"
|
||||
>
|
||||
<a-button type="dashed">
|
||||
<template #icon>
|
||||
<UploadOutlined />
|
||||
</template>
|
||||
{{ t('views.ne.neSoftware.upload') }}
|
||||
</a-button>
|
||||
</a-upload>
|
||||
</a-form-item>
|
||||
</template>
|
||||
|
||||
<a-form-item
|
||||
:label="t('views.ne.common.neType')"
|
||||
|
||||
Reference in New Issue
Block a user