完善合同模板上传功能,增加模板文件选择和验证逻辑,支持PDF和Word格式,优化上传准备流程。
This commit is contained in:
@@ -306,6 +306,7 @@ export default function FilesUpload() {
|
|||||||
const [isContractType, setIsContractType] = useState<boolean>(false);
|
const [isContractType, setIsContractType] = useState<boolean>(false);
|
||||||
const [contractMainFiles, setContractMainFiles] = useState<File[]>([]);
|
const [contractMainFiles, setContractMainFiles] = useState<File[]>([]);
|
||||||
const [contractAttachmentFiles, setContractAttachmentFiles] = useState<File[]>([]);
|
const [contractAttachmentFiles, setContractAttachmentFiles] = useState<File[]>([]);
|
||||||
|
const [contractTemplateFiles, setContractTemplateFiles] = useState<File[]>([]);
|
||||||
|
|
||||||
// 附件追加状态
|
// 附件追加状态
|
||||||
const [showAttachmentUpload, setShowAttachmentUpload] = useState<boolean>(false);
|
const [showAttachmentUpload, setShowAttachmentUpload] = useState<boolean>(false);
|
||||||
@@ -784,6 +785,63 @@ export default function FilesUpload() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 处理合同模板文件选择
|
||||||
|
const handleContractTemplateFilesSelected = (files: FileList) => {
|
||||||
|
try {
|
||||||
|
console.log('【调试-handleContractTemplateFilesSelected】开始处理合同模板选择, 文件数量:', files.length);
|
||||||
|
|
||||||
|
// 检查组件是否已卸载
|
||||||
|
if (!isMountedRef.current) {
|
||||||
|
console.error('【调试-handleContractTemplateFilesSelected】组件已卸载,取消处理');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (files.length > 0) {
|
||||||
|
// 验证文件类型,支持PDF和Word
|
||||||
|
const validFiles: File[] = [];
|
||||||
|
let hasInvalidFiles = false;
|
||||||
|
|
||||||
|
Array.from(files).forEach(file => {
|
||||||
|
const fileName = file.name.toLowerCase();
|
||||||
|
const isValidType =
|
||||||
|
file.type === 'application/pdf' || fileName.endsWith('.pdf') ||
|
||||||
|
file.type === 'application/msword' || fileName.endsWith('.doc') ||
|
||||||
|
file.type === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' || fileName.endsWith('.docx');
|
||||||
|
|
||||||
|
if (isValidType) {
|
||||||
|
validFiles.push(file);
|
||||||
|
} else {
|
||||||
|
hasInvalidFiles = true;
|
||||||
|
console.error(`【调试-handleContractTemplateFilesSelected】无效的文件类型: ${file.name}, 类型: ${file.type}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (hasInvalidFiles) {
|
||||||
|
// 显示错误提示
|
||||||
|
console.error('【调试-handleContractTemplateFilesSelected】存在无效的文件类型');
|
||||||
|
messageService.error('只支持PDF、Word格式的文件', {
|
||||||
|
title: '文件类型错误',
|
||||||
|
confirmText: '确定',
|
||||||
|
cancelText: '',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (validFiles.length > 0 && isMountedRef.current) {
|
||||||
|
console.log('【调试-handleContractTemplateFilesSelected】有效文件数量:', validFiles.length);
|
||||||
|
console.log('【调试-handleContractTemplateFilesSelected】有效文件:', validFiles.map(f => ({ name: f.name, size: f.size, type: f.type })));
|
||||||
|
|
||||||
|
setContractTemplateFiles(validFiles);
|
||||||
|
} else {
|
||||||
|
console.error('【调试-handleContractTemplateFilesSelected】没有有效的文件或组件已卸载');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.log('【调试-handleContractTemplateFilesSelected】未选择任何文件');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('【调试-handleContractTemplateFilesSelected】处理合同模板选择时发生错误:', error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// 处理附件追加文件选择
|
// 处理附件追加文件选择
|
||||||
const handleAttachmentFilesSelected = (files: FileList) => {
|
const handleAttachmentFilesSelected = (files: FileList) => {
|
||||||
try {
|
try {
|
||||||
@@ -941,11 +999,12 @@ export default function FilesUpload() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// 检查并准备上传
|
// 检查并准备上传
|
||||||
const checkAndPrepareUpload = (mainFiles: File[], attachmentFiles: File[]) => {
|
const checkAndPrepareUpload = (mainFiles: File[], attachmentFiles: File[], templateFiles: File[] = []) => {
|
||||||
try {
|
try {
|
||||||
console.log('【调试-checkAndPrepareUpload】开始检查并准备上传文件', {
|
console.log('【调试-checkAndPrepareUpload】开始检查并准备上传文件', {
|
||||||
mainFilesCount: mainFiles.length,
|
mainFilesCount: mainFiles.length,
|
||||||
attachmentFilesCount: attachmentFiles.length,
|
attachmentFilesCount: attachmentFiles.length,
|
||||||
|
templateFilesCount: templateFiles.length,
|
||||||
fileType
|
fileType
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -982,13 +1041,18 @@ export default function FilesUpload() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 记录主文件和附件文件信息
|
// 记录主文件、附件文件和模板文件信息
|
||||||
console.log('【调试-checkAndPrepareUpload】合同主文件:', mainFiles.map(f => ({ name: f.name, size: f.size, type: f.type })));
|
console.log('【调试-checkAndPrepareUpload】合同主文件:', mainFiles.map(f => ({ name: f.name, size: f.size, type: f.type })));
|
||||||
if (attachmentFiles.length > 0) {
|
if (attachmentFiles.length > 0) {
|
||||||
console.log('【调试-checkAndPrepareUpload】合同附件文件:', attachmentFiles.map(f => ({ name: f.name, size: f.size, type: f.type })));
|
console.log('【调试-checkAndPrepareUpload】合同附件文件:', attachmentFiles.map(f => ({ name: f.name, size: f.size, type: f.type })));
|
||||||
} else {
|
} else {
|
||||||
console.log('【调试-checkAndPrepareUpload】无合同附件文件');
|
console.log('【调试-checkAndPrepareUpload】无合同附件文件');
|
||||||
}
|
}
|
||||||
|
if (templateFiles.length > 0) {
|
||||||
|
console.log('【调试-checkAndPrepareUpload】合同模板文件:', templateFiles.map(f => ({ name: f.name, size: f.size, type: f.type })));
|
||||||
|
} else {
|
||||||
|
console.log('【调试-checkAndPrepareUpload】无合同模板文件');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mainFiles.length > 0) {
|
if (mainFiles.length > 0) {
|
||||||
@@ -1000,6 +1064,11 @@ export default function FilesUpload() {
|
|||||||
allFiles = [...allFiles, ...attachmentFiles];
|
allFiles = [...allFiles, ...attachmentFiles];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 如果模板文件存在,则合并
|
||||||
|
if (templateFiles.length > 0) {
|
||||||
|
allFiles = [...allFiles, ...templateFiles];
|
||||||
|
}
|
||||||
|
|
||||||
// console.log('【调试-checkAndPrepareUpload】合并文件后总数:', allFiles.length);
|
// console.log('【调试-checkAndPrepareUpload】合并文件后总数:', allFiles.length);
|
||||||
|
|
||||||
// 检查组件是否已卸载
|
// 检查组件是否已卸载
|
||||||
@@ -1984,7 +2053,7 @@ export default function FilesUpload() {
|
|||||||
<Button
|
<Button
|
||||||
type="primary"
|
type="primary"
|
||||||
icon="ri-upload-cloud-line"
|
icon="ri-upload-cloud-line"
|
||||||
onClick={() => checkAndPrepareUpload(contractMainFiles, contractAttachmentFiles)}
|
onClick={() => checkAndPrepareUpload(contractMainFiles, contractAttachmentFiles, contractTemplateFiles)}
|
||||||
>
|
>
|
||||||
开始上传
|
开始上传
|
||||||
</Button>
|
</Button>
|
||||||
@@ -2005,8 +2074,8 @@ export default function FilesUpload() {
|
|||||||
shouldPreventFileSelect={!fileType}
|
shouldPreventFileSelect={!fileType}
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
// 合同文件上传区域 - 双区域并排
|
// 合同文件上传区域 - 三区域布局
|
||||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
|
||||||
<div>
|
<div>
|
||||||
<h4 className="font-medium mb-2">合同主文件</h4>
|
<h4 className="font-medium mb-2">合同主文件</h4>
|
||||||
<UploadArea
|
<UploadArea
|
||||||
@@ -2049,6 +2118,25 @@ export default function FilesUpload() {
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
<div>
|
||||||
|
<h4 className="font-medium mb-2">合同模板</h4>
|
||||||
|
<UploadArea
|
||||||
|
onFilesSelected={handleContractTemplateFilesSelected}
|
||||||
|
multiple={false}
|
||||||
|
accept=".pdf,.doc,.docx"
|
||||||
|
tipText="请上传合同模板,格式:PDF/Word"
|
||||||
|
mainText="上传合同模板"
|
||||||
|
buttonText="选择模板"
|
||||||
|
icon="ri-file-copy-line"
|
||||||
|
shouldPreventFileSelect={!fileType}
|
||||||
|
/>
|
||||||
|
{contractTemplateFiles.length > 0 && (
|
||||||
|
<div className="mt-2 text-sm text-green-600">
|
||||||
|
<i className="ri-checkbox-circle-line"></i>
|
||||||
|
已选择模板: <span className="font-medium">{contractTemplateFiles[0].name}</span>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user