<script lang="ts" setup>
|
import type { FormInstance } from 'ant-design-vue';
|
|
import type { DmsFileCenterItem, DmsFileRevisionMetadata } from '#/api/x/dms/fileCenter';
|
|
import { computed, h, nextTick, reactive, ref } from 'vue';
|
|
import { useMessage } from '@jnpf/hooks';
|
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 { 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 formRef = ref<FormInstance>();
|
const sourceId = ref('');
|
const form = reactive<DmsFileRevisionMetadata>({
|
preparedBy: '',
|
preparedOn: '',
|
revisionReason: '',
|
versionLabel: '',
|
});
|
const selectedFileLabel = computed(() => selectedFile.value?.name || '尚未选择修订文件');
|
const { createMessage } = useMessage();
|
const [registerModal, { changeOkLoading, closeModal }] = useModalInner(init);
|
|
function init(data: { item: DmsFileCenterItem }) {
|
current.value = data.item;
|
selectedFile.value = undefined;
|
Object.assign(form, {
|
preparedBy: data.item.preparedBy || '',
|
preparedOn: dayjs().format('YYYY-MM-DD'),
|
revisionReason: '',
|
versionLabel: nextRevisionLabel(data.item.versionLabel, data.item.versionNo),
|
});
|
sourceId.value = `dms-revision-${crypto.randomUUID()}`;
|
nextTick(() => formRef.value?.clearValidate());
|
}
|
|
function chooseFile(file: File) {
|
selectedFile.value = file;
|
return AUpload.LIST_IGNORE;
|
}
|
|
async function handleSubmit() {
|
const item = current.value;
|
if (!item?.documentId) return;
|
await formRef.value?.validate();
|
if (!selectedFile.value) {
|
createMessage.warning('请选择修订后的文件');
|
return;
|
}
|
changeOkLoading(true);
|
try {
|
await reviseFile(item.documentId, item.id, sourceId.value, selectedFile.value, {
|
preparedBy: form.preparedBy.trim(),
|
preparedOn: form.preparedOn,
|
revisionReason: form.revisionReason.trim(),
|
versionLabel: form.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>
|
<a-form ref="formRef" :model="form" layout="vertical">
|
<a-row :gutter="16">
|
<a-col :span="12">
|
<a-form-item label="新版本号" name="versionLabel" :rules="[{ required: true, whitespace: true, message: '请输入新版本号' }]">
|
<a-input v-model:value="form.versionLabel" autofocus :maxlength="50" placeholder="例如:D(01)" />
|
</a-form-item>
|
</a-col>
|
<a-col :span="12">
|
<a-form-item label="制定人" name="preparedBy" :rules="[{ required: true, whitespace: true, message: '请输入制定人' }]">
|
<a-input v-model:value="form.preparedBy" :maxlength="100" placeholder="请输入制定人" />
|
</a-form-item>
|
</a-col>
|
<a-col :span="12">
|
<a-form-item label="制定日期" name="preparedOn" :rules="[{ required: true, message: '请选择制定日期' }]">
|
<a-date-picker v-model:value="form.preparedOn" class="w-full" value-format="YYYY-MM-DD" />
|
</a-form-item>
|
</a-col>
|
<a-col :span="24">
|
<a-form-item label="修订文件" required>
|
<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>
|
</a-form-item>
|
</a-col>
|
<a-col :span="24">
|
<a-form-item label="修订原因及内容概述" name="revisionReason" :rules="[{ required: true, whitespace: true, message: '请输入修订原因' }]">
|
<a-textarea v-model:value="form.revisionReason" :maxlength="1000" :rows="4" show-count placeholder="说明本次文件修订的原因和主要变化" />
|
</a-form-item>
|
</a-col>
|
</a-row>
|
</a-form>
|
</BasicModal>
|
</template>
|