<script lang="ts" setup>
|
import type { DmsFileUploadMetadata } from '#/api/x/dms/fileCenter';
|
|
import { ref } from 'vue';
|
|
import { useMessage } from '@jnpf/hooks';
|
import { BasicForm, useForm } from '@jnpf/ui/form';
|
import { BasicModal, useModalInner } from '@jnpf/ui/modal';
|
|
import dayjs from 'dayjs';
|
import { v4 as uuidv4 } from 'uuid';
|
|
import { uploadFile } from '#/api/x/dms/fileCenter';
|
|
interface UploadFolder {
|
id: string;
|
name: string;
|
}
|
|
interface UploadFormValues extends Omit<DmsFileUploadMetadata, 'preparedOn'> {
|
preparedOn: number | string;
|
}
|
|
const emit = defineEmits<{
|
uploaded: [folder: UploadFolder];
|
}>();
|
|
const folder = ref<UploadFolder>();
|
const selectedFile = ref<File>();
|
const sourceId = ref('');
|
const { createMessage } = useMessage();
|
const requiredInputRule = (message: string) => [{ message, required: true, trigger: 'blur' as const, whitespace: true }];
|
const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
|
autoFocusFirstItem: true,
|
baseColProps: { span: 12 },
|
layout: 'vertical',
|
schemas: [
|
{
|
component: 'Input',
|
componentProps: { maxlength: 200, placeholder: '例如:MM-R02' },
|
field: 'documentNo',
|
label: '文件编号',
|
rules: requiredInputRule('请输入文件编号'),
|
},
|
{
|
component: 'Input',
|
componentProps: { disabled: true, maxlength: 300 },
|
field: 'documentName',
|
label: '文件目录名称',
|
rules: requiredInputRule('文件目录名称不能为空'),
|
},
|
{
|
component: 'Input',
|
componentProps: { maxlength: 100, placeholder: '例如:QUALITY_MANUAL' },
|
field: 'documentType',
|
label: '文件类型',
|
rules: requiredInputRule('请输入文件类型'),
|
},
|
{
|
component: 'Input',
|
componentProps: { maxlength: 100, placeholder: '请输入归属部门ID' },
|
field: 'responsibleDeptId',
|
label: '归属部门ID',
|
rules: requiredInputRule('请输入归属部门ID'),
|
},
|
{
|
component: 'Input',
|
componentProps: { maxlength: 50, placeholder: '例如:D(00)' },
|
field: 'versionLabel',
|
label: '版本号',
|
rules: requiredInputRule('请输入版本号'),
|
},
|
{
|
component: 'Input',
|
componentProps: { maxlength: 100, placeholder: '请输入制定人' },
|
field: 'preparedBy',
|
label: '制定人',
|
rules: requiredInputRule('请输入制定人'),
|
},
|
{
|
component: 'DatePicker',
|
componentProps: { format: 'YYYY-MM-DD', placeholder: '请选择制定日期' },
|
field: 'preparedOn',
|
label: '制定日期',
|
rules: [{ message: '请选择制定日期', required: true, trigger: 'change' }],
|
},
|
],
|
showActionButtonGroup: false,
|
});
|
const [registerModal, { changeOkLoading, closeModal }] = useModalInner(init);
|
|
async function init(data: { file: File; folder: UploadFolder }) {
|
folder.value = data.folder;
|
selectedFile.value = data.file;
|
const extensionIndex = data.file.name.lastIndexOf('.');
|
const extension = extensionIndex > 0 ? data.file.name.slice(extensionIndex + 1) : '';
|
await resetFields();
|
await setFieldsValue({
|
documentName: data.file.name,
|
documentNo: '',
|
documentType: extension.toUpperCase(),
|
preparedBy: '',
|
preparedOn: dayjs().startOf('day').valueOf(),
|
responsibleDeptId: '',
|
versionLabel: 'D(00)',
|
});
|
sourceId.value = `dms-upload-${uuidv4()}`;
|
}
|
|
async function handleSubmit() {
|
if (!folder.value || !selectedFile.value) return;
|
const values = await validate();
|
if (!values) return;
|
const form = values as UploadFormValues;
|
changeOkLoading(true);
|
try {
|
await uploadFile(folder.value.id, sourceId.value, selectedFile.value, {
|
documentName: form.documentName.trim(),
|
documentNo: form.documentNo.trim(),
|
documentType: form.documentType.trim(),
|
preparedBy: form.preparedBy.trim(),
|
preparedOn: dayjs(form.preparedOn).format('YYYY-MM-DD'),
|
responsibleDeptId: form.responsibleDeptId.trim(),
|
versionLabel: form.versionLabel.trim(),
|
});
|
const uploadedFolder = folder.value;
|
closeModal();
|
emit('uploaded', uploadedFolder);
|
} catch {
|
createMessage.error('文件上传失败,请检查文件编号是否已存在以及文件属性是否完整');
|
} finally {
|
changeOkLoading(false);
|
}
|
}
|
</script>
|
|
<template>
|
<BasicModal v-bind="$attrs" title="上传文件" :width="680" destroy-on-close @register="registerModal" @ok="handleSubmit">
|
<a-alert class="mb-[18px]" type="info" show-icon :message="`目录:${folder?.name || '-'} / 文件:${selectedFile?.name || '-'}`" />
|
<BasicForm @register="registerForm" />
|
</BasicModal>
|
</template>
|