diff --git a/app/routes/files.upload.tsx b/app/routes/files.upload.tsx index 3f48da5..4f0fae7 100644 --- a/app/routes/files.upload.tsx +++ b/app/routes/files.upload.tsx @@ -281,6 +281,12 @@ export default function FilesUpload() { const [documentNumber, setDocumentNumber] = useState(""); const [remark, setRemark] = useState(""); const [currentFiles, setCurrentFiles] = useState([]); + + // 合同文件上传状态 + const [isContractType, setIsContractType] = useState(false); + const [contractMainFiles, setContractMainFiles] = useState([]); + const [contractAttachmentFiles, setContractAttachmentFiles] = useState([]); + const [uploadProgress, setUploadProgress] = useState(0); const [uploadSpeed, setUploadSpeed] = useState("0KB/s"); const [uploadStage, setUploadStage] = useState<"idle" | "uploading" | "processing" | "completed" | "hadden">("idle"); @@ -318,6 +324,9 @@ export default function FilesUpload() { // UploadArea组件引用 const uploadAreaRef = useRef(null); + // 添加合同文件上传区域引用 + const contractMainFileRef = useRef(null); + const contractAttachmentFileRef = useRef(null); // 表单提交引用 const formRef = useRef(null); @@ -441,17 +450,106 @@ export default function FilesUpload() { // 立即清除错误状态 setFileTypeError(null); + // 检查是否选择了合同类型 + const selectedType = documentTypes.find(t => t.id.toString() === value); + const isContract = !!(selectedType && selectedType.name.includes('合同')); + setIsContractType(isContract); + + // 重置文件状态 + setContractMainFiles([]); + setContractAttachmentFiles([]); + setCurrentFiles([]); + // 如果已经有选中的文件,且选择了文件类型,则开始上传 - if (currentFiles.length > 0) { + if (currentFiles.length > 0 && !isContract) { startUpload(currentFiles); } } else { setFileType(""); + setIsContractType(false); // 如果用户选择了空选项,显示错误信息 setFileTypeError("上传文件之前请选择文件类型"); } }; + // 处理合同主文件选择 + const handleContractMainFilesSelected = (files: FileList) => { + if (files.length > 0) { + // 验证文件类型,只允许PDF文件 + const validFiles: File[] = []; + let hasInvalidFiles = false; + + Array.from(files).forEach(file => { + if (file.type === 'application/pdf' || file.name.toLowerCase().endsWith('.pdf')) { + validFiles.push(file); + } else { + hasInvalidFiles = true; + } + }); + + if (hasInvalidFiles) { + // 显示错误提示 + messageService.error('只能上传PDF格式的文件', { + title: '文件类型错误', + confirmText: '确定', + cancelText: '', + }); + } + + if (validFiles.length > 0) { + setContractMainFiles(validFiles); + checkAndPrepareUpload(validFiles, contractAttachmentFiles); + } + } + }; + + // 处理合同附件选择 + const handleContractAttachmentFilesSelected = (files: FileList) => { + if (files.length > 0) { + // 验证文件类型,只允许PDF文件 + const validFiles: File[] = []; + let hasInvalidFiles = false; + + Array.from(files).forEach(file => { + if (file.type === 'application/pdf' || file.name.toLowerCase().endsWith('.pdf')) { + validFiles.push(file); + } else { + hasInvalidFiles = true; + } + }); + + if (hasInvalidFiles) { + // 显示错误提示 + messageService.error('只能上传PDF格式的文件', { + title: '文件类型错误', + confirmText: '确定', + cancelText: '', + }); + } + + if (validFiles.length > 0) { + setContractAttachmentFiles(validFiles); + checkAndPrepareUpload(contractMainFiles, validFiles); + } + } + }; + + // 检查并准备上传 + const checkAndPrepareUpload = (mainFiles: File[], attachmentFiles: File[]) => { + // 当两个区域都有文件时才准备上传 + if (mainFiles.length > 0 && attachmentFiles.length > 0) { + // 合并所有文件 + const allFiles = [...mainFiles, ...attachmentFiles]; + + // 这里的currentFiles的长度是上传进度条是否显示的关键 + // setCurrentFiles(allFiles); + + // 将准备上传的操作移到这里,暂时不执行 + console.log('准备上传', allFiles.length, '个文件'); + // startUpload(allFiles); + } + }; + // 开始上传文件 const startUpload = async (files: File[]) => { try { @@ -795,6 +893,10 @@ export default function FilesUpload() { setCurrentFiles([]); setCompletedFiles([]); + // 重置合同文件状态 + setContractMainFiles([]); + setContractAttachmentFiles([]); + // 重置步骤状态 setProcessingSteps([ { title: "文件上传", description: "等待上传文件到服务器...", status: "waiting" }, @@ -808,6 +910,12 @@ export default function FilesUpload() { if (uploadAreaRef.current) { uploadAreaRef.current.resetFileInput(); } + if (contractMainFileRef.current) { + contractMainFileRef.current.resetFileInput(); + } + if (contractAttachmentFileRef.current) { + contractAttachmentFileRef.current.resetFileInput(); + } }; // 获取当前时间字符串 @@ -1051,19 +1159,81 @@ export default function FilesUpload() { {/* 文件上传区域 */} - 文件上传} className="mb-4"> + + {/* 自定义标题栏 */} +
+

文件上传

+ {contractMainFiles.length > 0 && contractAttachmentFiles.length > 0 && ( + + )} +
+ {/* 初始上传区域 */} {uploadStage === "idle" && ( <> - + {!isContractType ? ( + // 标准上传区域 - 非合同类型 + + ) : ( + // 合同文件上传区域 - 双区域并排 +
+
+

合同主文件

+ + {contractMainFiles.length > 0 && ( +
+ + 已选择主文件: {contractMainFiles[0].name} +
+ )} +
+
+

合同附件

+ + {contractAttachmentFiles.length > 0 && ( +
+ + 已选择附件: {contractAttachmentFiles.map((file, index) => ( + {file.name} + ))} +
+ )} +
+
+ )} {/* 测试文档标记 */}
@@ -1143,6 +1313,7 @@ export default function FilesUpload() {
)} + )} diff --git a/app/routes/reviews.tsx b/app/routes/reviews.tsx index 52dedfd..ffbbe16 100644 --- a/app/routes/reviews.tsx +++ b/app/routes/reviews.tsx @@ -575,7 +575,9 @@ export default function ReviewDetails() { activeTab={activeTab} onTabChange={handleTabChange} fileInfo={{ - previousRoute: loaderData.previousRoute + previousRoute: loaderData.previousRoute, + path: document?.path, + auditStatus: document?.auditStatus }} onConfirmResults={handleConfirmResults} >