刘光辉
11 小时以前 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
<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>