import React, { useState } from 'react'; import { useParams } from 'react-router-dom'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { Card, Button, Space, Typography, Row, Col, Statistic, Table, Tag, Divider, Descriptions, Select, Checkbox, message, Steps, Result, } from 'antd'; import { FileTextOutlined, FileExcelOutlined, FilePdfOutlined, FileWordOutlined, DownloadOutlined, PrinterOutlined, HistoryOutlined, CheckCircleOutlined, } from '@ant-design/icons'; import type { ColumnsType } from 'antd/es/table'; import { fetchCase, fetchAssessments, fetchReports, generateReport, getReportDownloadUrl } from '../../services/api'; const Reports: React.FC = () => { const { id = '1' } = useParams(); const qc = useQueryClient(); const [generated, setGenerated] = useState(false); const { data: currentCase } = useQuery({ queryKey: ['case', id], queryFn: () => fetchCase(id) }); const { data: assessData } = useQuery({ queryKey: ['assessments', id], queryFn: () => fetchAssessments(id) }); const { data: reportsData } = useQuery({ queryKey: ['reports', id], queryFn: () => fetchReports(id) }); const allAssessments = assessData?.items ?? []; const reportsList = reportsData?.items ?? []; const confirmedAssessments = allAssessments.filter( (a) => a.reviewStatus === 'confirmed' && a.assessedAmount > 0, ); const totalConfirmed = confirmedAssessments.reduce( (s, a) => s + a.assessedAmount, 0, ); const genMutation = useMutation({ mutationFn: (reportType: string) => generateReport(id, { report_type: reportType }), onSuccess: () => { setGenerated(true); qc.invalidateQueries({ queryKey: ['reports', id] }); message.success('报告生成成功'); }, }); if (!currentCase) return null; const historyColumns: ColumnsType<(typeof mockReports)[0]> = [ { title: '类型', dataIndex: 'type', width: 100, render: (t: string) => { const map: Record = { pdf: { icon: , label: 'PDF', color: 'red' }, excel: { icon: , label: 'Excel', color: 'green' }, word: { icon: , label: 'Word', color: 'blue' }, }; const cfg = map[t] || map.pdf; return {cfg.label}; }, }, { title: '版本', dataIndex: 'version', width: 80, render: (v: number) => `v${v}`, }, { title: '生成时间', dataIndex: 'createdAt', width: 180, }, { title: '操作', width: 120, render: () => ( ), }, ]; return (
} valueStyle={{ color: '#52c41a' }} /> } /> 生成报告 } style={{ marginBottom: 24 }} > {currentCase.caseNo} {currentCase.title} {currentCase.victimName} {currentCase.handler} ¥{totalConfirmed.toLocaleString('zh-CN', { minimumFractionDigits: 2 })} {confirmedAssessments.length} 笔 导出格式:
Excel 汇总表
选择
PDF 报告
选择
Word 文书
选择
报告内容:
被骗金额汇总表 交易明细清单(含证据索引) 资金流转路径图 交易时间轴 认定理由与排除说明 笔录辅助问询建议 原始截图附件
{!generated ? ( ) : ( } onClick={() => message.info('演示模式:下载 Excel')} > 下载 Excel , , , ]} /> )}
历史报告 } style={{ marginBottom: 24 }} >
{generated ? '点击左侧"下载"查看完整报告' : '生成报告后可在此预览'}
); }; export default Reports;