刘光辉
9 小时以前 0dfe84494048ce27ba8449831782128412d3eb13
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
<script lang="ts" setup>
import type { FormInstance } from 'ant-design-vue';
 
import type { DmsFileUploadMetadata } from '#/api/x/dms/fileCenter';
 
import { nextTick, reactive, ref } from 'vue';
 
import { useMessage } from '@jnpf/hooks';
import { BasicModal, useModalInner } from '@jnpf/ui/modal';
 
import dayjs from 'dayjs';
 
import { uploadFile } from '#/api/x/dms/fileCenter';
 
interface UploadFolder {
  id: string;
  name: string;
}
 
const emit = defineEmits<{
  uploaded: [folder: UploadFolder];
}>();
 
const folder = ref<UploadFolder>();
const selectedFile = ref<File>();
const formRef = ref<FormInstance>();
const form = reactive<DmsFileUploadMetadata>({
  documentName: '',
  documentNo: '',
  documentType: '',
  preparedBy: '',
  preparedOn: '',
  responsibleDeptId: '',
  versionLabel: 'D(00)',
});
const sourceId = ref('');
const { createMessage } = useMessage();
const [registerModal, { changeOkLoading, closeModal }] = useModalInner(init);
 
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) : '';
  Object.assign(form, {
    documentName: extensionIndex > 0 ? data.file.name.slice(0, extensionIndex) : data.file.name,
    documentNo: '',
    documentType: extension.toUpperCase(),
    preparedBy: '',
    preparedOn: dayjs().format('YYYY-MM-DD'),
    responsibleDeptId: '',
    versionLabel: 'D(00)',
  });
  sourceId.value = `dms-upload-${crypto.randomUUID()}`;
  nextTick(() => formRef.value?.clearValidate());
}
 
async function handleSubmit() {
  if (!folder.value || !selectedFile.value) return;
  await formRef.value?.validate();
  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: form.preparedOn,
      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 || '-'}`" />
    <a-form ref="formRef" :model="form" layout="vertical">
      <a-row :gutter="16">
        <a-col :span="12">
          <a-form-item label="文件编号" name="documentNo" :rules="[{ required: true, whitespace: true, message: '请输入文件编号' }]">
            <a-input v-model:value="form.documentNo" autofocus :maxlength="200" placeholder="例如:MM-R02" />
          </a-form-item>
        </a-col>
        <a-col :span="12">
          <a-form-item label="文件名称" name="documentName" :rules="[{ required: true, whitespace: true, message: '请输入文件名称' }]">
            <a-input v-model:value="form.documentName" :maxlength="300" placeholder="请输入文件名称" />
          </a-form-item>
        </a-col>
        <a-col :span="12">
          <a-form-item label="文件类型" name="documentType" :rules="[{ required: true, whitespace: true, message: '请输入文件类型' }]">
            <a-input v-model:value="form.documentType" :maxlength="100" placeholder="例如:QUALITY_MANUAL" />
          </a-form-item>
        </a-col>
        <a-col :span="12">
          <a-form-item label="归属部门ID" name="responsibleDeptId" :rules="[{ required: true, whitespace: true, message: '请输入归属部门ID' }]">
            <a-input v-model:value="form.responsibleDeptId" :maxlength="100" placeholder="请输入归属部门ID" />
          </a-form-item>
        </a-col>
        <a-col :span="12">
          <a-form-item label="版本号" name="versionLabel" :rules="[{ required: true, whitespace: true, message: '请输入版本号' }]">
            <a-input v-model:value="form.versionLabel" :maxlength="50" placeholder="例如:D(00)" />
          </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-row>
    </a-form>
  </BasicModal>
</template>