import { useEffect, useMemo, useState } from "react"; import { Download, FolderArchive, RotateCcw } from "lucide-react"; import { useSearchParams } from "react-router"; import { toast } from "sonner"; import { Button } from "~/components/ui/button"; import { Card, CardAction, CardContent, CardDescription, CardHeader, CardTitle } from "~/components/ui/card"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "~/components/ui/table"; import { exportRowsToExcel } from "~/lib/exportExcel"; import { FilterSelect, OperationsPageHeader } from "./OperationsUi"; import { workflowDocuments, type KnowledgeDocument } from "./workflowData"; type Filters = { bank: string; modelName: string; modelId: string; stage: string }; const EMPTY_FILTERS: Filters = { bank: "", modelName: "", modelId: "", stage: "" }; function unique(values: string[]): string[] { return [...new Set(values)].sort((left, right) => left.localeCompare(right, "zh-CN")); } function exportDocuments(rows: KnowledgeDocument[]) { const header = ["流程", "银行", "模型名称", "模型版本", "模型ID", "环节", "材料名称", "上传人", "上传时间", "确认状态"]; return exportRowsToExcel({ fileName: "文档知识库", sheetName: "文档知识库", headers: header, rows: rows.map((row) => [row.workflowTitle, row.bank, row.modelName, row.modelVersion, row.modelId, row.stage, row.name, row.uploadedBy, row.uploadedAt, row.confirmed ? "已确认" : "待确认"]) }); } export default function KnowledgeBasePage() { const documents = useMemo(() => workflowDocuments(), []); const [searchParams, setSearchParams] = useSearchParams(); const [filters, setFilters] = useState(() => ({ ...EMPTY_FILTERS, bank: searchParams.get("bank") ?? "", modelName: searchParams.get("modelName") ?? "", modelId: searchParams.get("modelId") ?? "", stage: searchParams.get("stage") ?? "", })); const rows = useMemo(() => documents.filter((document) => ( (!filters.bank || document.bank === filters.bank) && (!filters.modelName || document.modelName === filters.modelName) && (!filters.modelId || document.modelId === filters.modelId) && (!filters.stage || document.stage === filters.stage) )), [documents, filters]); const update = (key: K, value: Filters[K]) => setFilters((current) => ({ ...current, [key]: value })); useEffect(() => { const params = new URLSearchParams(); (Object.keys(filters) as Array).forEach((key) => { if (filters[key]) params.set(key, filters[key]); }); setSearchParams(params, { replace: true }); }, [filters, setSearchParams]); return (
void exportDocuments(rows)}>导出 Excel} /> 流程材料共 {rows.length} 份材料 item.bank))} onChange={(value) => update("bank", value)} /> item.modelName))} onChange={(value) => update("modelName", value)} /> item.modelId))} onChange={(value) => update("modelId", value)} /> item.stage))} onChange={(value) => update("stage", value)} /> 流程银行模型名称模型版本模型ID环节材料名称上传人上传时间确认状态操作{rows.length ? rows.map((document) => {document.workflowTitle}{document.bank}{document.modelName}{document.modelVersion}{document.commonModel && 通用}{document.modelId}{document.stage}{document.name}{document.uploadedBy}{document.uploadedAt}{document.confirmed ? 已确认 : 待确认}) : 当前筛选条件下暂无材料}
); }