import React from 'react'; import { json, type MetaFunction } from '@remix-run/node'; import { useLoaderData, useSearchParams, Form } from '@remix-run/react'; import { Button } from '~/components/ui/Button'; import { Card } from '~/components/ui/Card'; import { Table } from '~/components/ui/Table'; import { Breadcrumb } from '~/components/layout/Breadcrumb'; import type { File } from '~/models/file'; import { REVIEW_STATUS_LABELS, REVIEW_STATUS_COLORS } from '~/models/file'; export const meta: MetaFunction = () => { return [ { title: "中国烟草AI合同及卷宗审核系统 - 文件列表" }, { name: "description", content: "评查文件列表" } ]; }; export const handle = { breadcrumb: '文件列表' }; interface LoaderData { files: File[]; documentTypes: { id: string; name: string; }[]; totalCount: number; } export async function loader({ request }) { const url = new URL(request.url); const documentTypeId = url.searchParams.get("documentTypeId") || ""; const reviewStatus = url.searchParams.get("reviewStatus") || ""; const keyword = url.searchParams.get("keyword") || ""; // 模拟数据,实际项目中应从API获取 const files: File[] = [ { id: "1", fileName: "2023年度烟草专卖零售许可证.pdf", fileType: "application/pdf", documentTypeId: "2", documentTypeName: "专卖许可证", fileSize: 1024 * 1024 * 2.5, // 2.5MB uploaderId: "1", uploaderName: "张三", status: "completed", reviewStatus: "pass", createdAt: "2023-12-24 14:30", updatedAt: "2023-12-24 16:45" }, { id: "2", fileName: "烟草制品购销合同(2023-12).docx", fileType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document", documentTypeId: "1", documentTypeName: "合同文档", fileSize: 1024 * 1024 * 1.2, // 1.2MB uploaderId: "1", uploaderName: "张三", status: "completed", reviewStatus: "warning", createdAt: "2023-12-23 09:15", updatedAt: "2023-12-23 10:30" }, { id: "3", fileName: "专卖管理处罚决定书(2023-145).pdf", fileType: "application/pdf", documentTypeId: "3", documentTypeName: "行政处罚决定书", fileSize: 1024 * 1024 * 3.1, // 3.1MB uploaderId: "2", uploaderName: "李四", status: "completed", reviewStatus: "fail", createdAt: "2023-12-22 16:45", updatedAt: "2023-12-22 18:20" }, { id: "4", fileName: "2023年第四季度采购合同.docx", fileType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document", documentTypeId: "1", documentTypeName: "合同文档", fileSize: 1024 * 1024 * 1.8, // 1.8MB uploaderId: "3", uploaderName: "王五", status: "completed", reviewStatus: "pass", createdAt: "2023-12-20 11:20", updatedAt: "2023-12-20 14:35" }, { id: "5", fileName: "广告宣传协议书.pdf", fileType: "application/pdf", documentTypeId: "1", documentTypeName: "合同文档", fileSize: 1024 * 1024 * 0.9, // 0.9MB uploaderId: "2", uploaderName: "李四", status: "pending", reviewStatus: "pending", createdAt: "2023-12-18 15:30", updatedAt: "2023-12-18 15:30" } ]; const documentTypes = [ { id: "1", name: "合同文档" }, { id: "2", name: "专卖许可证" }, { id: "3", name: "行政处罚决定书" }, { id: "4", name: "其他文档" } ]; // 过滤数据 let filteredFiles = [...files]; if (documentTypeId) { filteredFiles = filteredFiles.filter(file => file.documentTypeId === documentTypeId); } if (reviewStatus) { filteredFiles = filteredFiles.filter(file => file.reviewStatus === reviewStatus); } if (keyword) { const lowerKeyword = keyword.toLowerCase(); filteredFiles = filteredFiles.filter(file => file.fileName.toLowerCase().includes(lowerKeyword) ); } return json({ files: filteredFiles, documentTypes, totalCount: files.length }); } export default function FilesList() { const { files, documentTypes } = useLoaderData(); const [searchParams] = useSearchParams(); // 文件大小格式化 const formatFileSize = (bytes: number): string => { if (bytes < 1024) return bytes + ' B'; if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB'; return (bytes / (1024 * 1024)).toFixed(1) + ' MB'; }; // 获取文件图标 const getFileIcon = (fileType: string): string => { if (fileType.includes('pdf')) return 'ri-file-pdf-line'; if (fileType.includes('word')) return 'ri-file-word-line'; if (fileType.includes('excel') || fileType.includes('spreadsheet')) return 'ri-file-excel-line'; if (fileType.includes('image')) return 'ri-file-image-line'; return 'ri-file-text-line'; }; return (

评查文件列表

总文件数: {files.length}
(
{record.fileName}
{formatFileSize(record.fileSize)}
) }, { title: "文档类型", dataIndex: "documentTypeName" }, { title: "评查状态", dataIndex: "reviewStatus", render: (value) => ( {REVIEW_STATUS_LABELS[value]} ) }, { title: "上传人", dataIndex: "uploaderName" }, { title: "上传时间", dataIndex: "createdAt" }, { title: "操作", render: (_, record: File) => (
{record.status === 'pending' && ( )}
) } ]} dataSource={files} rowKey="id" /> ); }