修复评查详情中的下载功能

This commit is contained in:
2025-05-24 15:09:18 +08:00
parent dbf72d21c7
commit 3adc0441bc
2 changed files with 185 additions and 12 deletions
+182 -11
View File
@@ -281,6 +281,12 @@ export default function FilesUpload() {
const [documentNumber, setDocumentNumber] = useState<string>("");
const [remark, setRemark] = useState<string>("");
const [currentFiles, setCurrentFiles] = useState<File[]>([]);
// 合同文件上传状态
const [isContractType, setIsContractType] = useState<boolean>(false);
const [contractMainFiles, setContractMainFiles] = useState<File[]>([]);
const [contractAttachmentFiles, setContractAttachmentFiles] = useState<File[]>([]);
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<UploadAreaRef>(null);
// 添加合同文件上传区域引用
const contractMainFileRef = useRef<UploadAreaRef>(null);
const contractAttachmentFileRef = useRef<UploadAreaRef>(null);
// 表单提交引用
const formRef = useRef<HTMLFormElement>(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() {
</Card>
{/* 文件上传区域 */}
<Card title={<h3></h3>} className="mb-4">
<Card className="mb-4">
{/* 自定义标题栏 */}
<div className="w-full flex justify-between items-center mb-4">
<h3 className="text-lg font-medium"></h3>
{contractMainFiles.length > 0 && contractAttachmentFiles.length > 0 && (
<Button
type="primary"
icon="ri-upload-cloud-line"
onClick={() => startUpload([...contractMainFiles, ...contractAttachmentFiles])}
>
</Button>
)}
</div>
{/* 初始上传区域 */}
{uploadStage === "idle" && (
<>
<UploadArea
ref={uploadAreaRef}
onFilesSelected={handleFilesSelected}
multiple={true}
// accept=".pdf,.doc,.docx,.xls,.xlsx,.jpg,.jpeg,.png"
accept=".pdf"
tipText="支持单个或多个pdf文件上传,文件格式:PDF"
shouldPreventFileSelect={!fileType}
/>
{!isContractType ? (
// 标准上传区域 - 非合同类型
<UploadArea
ref={uploadAreaRef}
onFilesSelected={handleFilesSelected}
multiple={true}
accept=".pdf"
tipText="支持单个或多个pdf文件上传,文件格式:PDF"
shouldPreventFileSelect={!fileType}
/>
) : (
// 合同文件上传区域 - 双区域并排
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<div>
<h4 className="font-medium mb-2"></h4>
<UploadArea
onFilesSelected={handleContractMainFilesSelected}
ref={contractMainFileRef}
multiple={false}
accept=".pdf"
tipText="请上传合同主文件,格式:PDF"
mainText="上传合同主文件"
buttonText="选择主文件"
icon="ri-file-text-line"
shouldPreventFileSelect={!fileType}
/>
{contractMainFiles.length > 0 && (
<div className="mt-2 text-sm text-green-600">
<i className="ri-checkbox-circle-line"></i>
: <span className="font-medium">{contractMainFiles[0].name}</span>
</div>
)}
</div>
<div>
<h4 className="font-medium mb-2"></h4>
<UploadArea
onFilesSelected={handleContractAttachmentFilesSelected}
ref={contractAttachmentFileRef}
multiple={false}
accept=".pdf"
tipText="请上传合同附件,格式:PDF"
mainText="上传合同附件"
buttonText="选择附件"
icon="ri-file-copy-line"
shouldPreventFileSelect={!fileType}
/>
{contractAttachmentFiles.length > 0 && (
<div className="mt-2 text-sm text-green-600">
<i className="ri-checkbox-circle-line"></i>
: {contractAttachmentFiles.map((file, index) => (
<span key={index} className="font-medium">{file.name}</span>
))}
</div>
)}
</div>
</div>
)}
{/* 测试文档标记 */}
<div className="switch-container mb-4">
@@ -1143,6 +1313,7 @@ export default function FilesUpload() {
</div>
)}
</>
)}
+3 -1
View File
@@ -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}
>