<script lang="ts" setup>
|
import type { DmsFileCenterItem } from '#/api/x/dms/fileCenter';
|
|
import { computed, h, ref } from 'vue';
|
|
import { useMessage } from '@jnpf/hooks';
|
import { BasicForm, useForm } from '@jnpf/ui/form';
|
import { BasicModal, useModalInner } from '@jnpf/ui/modal';
|
|
import { UploadOutlined } from '@ant-design/icons-vue';
|
import { Upload as AUpload } from 'ant-design-vue';
|
import dayjs from 'dayjs';
|
import { v4 as uuidv4 } from 'uuid';
|
|
import { reviseFile } from '#/api/x/dms/fileCenter';
|
|
import { nextRevisionLabel } from './revisionRules';
|
|
const emit = defineEmits<{
|
revised: [item: DmsFileCenterItem];
|
}>();
|
|
const current = ref<DmsFileCenterItem>();
|
const selectedFile = ref<File>();
|
const sourceId = ref('');
|
const selectedFileLabel = computed(() => selectedFile.value?.name || '尚未选择修订文件');
|
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: 50, placeholder: '例如:D(01)' },
|
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' }],
|
},
|
{
|
component: 'Input',
|
colProps: { span: 24 },
|
field: 'revisionFile',
|
label: '修订文件',
|
rules: [
|
{
|
trigger: 'change',
|
validator: () => (selectedFile.value ? Promise.resolve() : Promise.reject(new Error('请选择修订后的文件'))),
|
},
|
],
|
slot: 'revisionFile',
|
},
|
{
|
component: 'Textarea',
|
componentProps: { maxlength: 1000, placeholder: '说明本次文件修订的原因和主要变化', rows: 4, showCount: true },
|
colProps: { span: 24 },
|
field: 'revisionReason',
|
label: '修订原因及内容概述',
|
rules: requiredInputRule('请输入修订原因'),
|
},
|
],
|
showActionButtonGroup: false,
|
});
|
const [registerModal, { changeOkLoading, closeModal }] = useModalInner(init);
|
|
async function init(data: { item: DmsFileCenterItem }) {
|
current.value = data.item;
|
selectedFile.value = undefined;
|
await resetFields();
|
await setFieldsValue({
|
preparedBy: data.item.preparedBy || '',
|
preparedOn: dayjs().startOf('day').valueOf(),
|
revisionReason: '',
|
versionLabel: nextRevisionLabel(data.item.versionLabel, data.item.versionNo),
|
});
|
sourceId.value = `dms-revision-${uuidv4()}`;
|
}
|
|
function chooseFile(file: File) {
|
selectedFile.value = file;
|
return AUpload.LIST_IGNORE;
|
}
|
|
async function handleSubmit() {
|
const item = current.value;
|
if (!item?.documentId) return;
|
const values = await validate();
|
if (!values || !selectedFile.value) return;
|
changeOkLoading(true);
|
try {
|
await reviseFile(item.documentId, item.id, sourceId.value, selectedFile.value, {
|
preparedBy: values.preparedBy.trim(),
|
preparedOn: dayjs(values.preparedOn).format('YYYY-MM-DD'),
|
revisionReason: values.revisionReason.trim(),
|
versionLabel: values.versionLabel.trim(),
|
});
|
closeModal();
|
emit('revised', item);
|
} 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="warning" show-icon message="模拟修订会跳过审批并立即生效;当前版本将转入旧版文件中心。" />
|
<a-descriptions class="mb-[18px]" bordered size="small" :column="2">
|
<a-descriptions-item label="文件编号">{{ current?.documentNo || '—' }}</a-descriptions-item>
|
<a-descriptions-item label="当前版本">{{ current?.versionLabel || `v${current?.versionNo || '-'}` }}</a-descriptions-item>
|
<a-descriptions-item label="文件名称" :span="2">{{ current?.fileName || current?.name || '—' }}</a-descriptions-item>
|
</a-descriptions>
|
<BasicForm @register="registerForm">
|
<template #revisionFile>
|
<AUpload :before-upload="chooseFile" :max-count="1" :show-upload-list="false">
|
<a-button :icon="h(UploadOutlined)">选择文件</a-button>
|
</AUpload>
|
<span class="text-secondary ml-[12px]">{{ selectedFileLabel }}</span>
|
</template>
|
</BasicForm>
|
</BasicModal>
|
</template>
|