import { useState } from 'react' import { Button, Card, Form, Input, message, Row, Col, Divider, Typography, Space } from 'antd' import { FileTextOutlined, DownloadOutlined } from '@ant-design/icons' import ReactMarkdown from 'react-markdown' import remarkGfm from 'remark-gfm' import { submitContractReview } from '@/api/contract-review' const { Title, Paragraph } = Typography const { TextArea } = Input const ContractReview = () => { const [form] = Form.useForm() const [loading, setLoading] = useState(false) const [reviewResult, setReviewResult] = useState('') const [currentContract, setCurrentContract] = useState('') const maxChars = 10000 const handleReview = async () => { try { const contract_text = form.getFieldValue('contract_fragment') || '' const knowledge_base = '通用合同审核规则' // 固定使用通用知识库 // 验证输入 if (!contract_text.trim()) { message.warning('请输入需要审核的合同片段') return } setLoading(true) setReviewResult('') const response = await submitContractReview(contract_text, knowledge_base) if (!response.ok) { const errorText = await response.text() throw new Error(`审核请求失败: ${response.status} ${errorText}`) } if (!response.body) { throw new Error('响应体为空') } const reader = response.body.getReader() const decoder = new TextDecoder('utf-8') let buffer = '' let fullContent = '' try { while (true) { const { done, value } = await reader.read() if (done) break buffer += decoder.decode(value, { stream: true }) const lines = buffer.split('\n') buffer = lines.pop() || '' for (const line of lines) { const trimmedLine = line.trim() if (!trimmedLine || trimmedLine === 'data: [DONE]') { if (trimmedLine === 'data: [DONE]') { message.success('审核完成') setLoading(false) return } continue } if (trimmedLine.startsWith('data: ')) { try { const data = trimmedLine.slice(6) const parsed = JSON.parse(data) if (parsed.event === 'message' && parsed.answer) { fullContent += parsed.answer setReviewResult(fullContent) } else if (parsed.event === 'error') { throw new Error(parsed.message || 'Dify API 返回错误') } } catch (parseError) { console.warn('跳过无法解析的行:', trimmedLine) } } } } } finally { reader.releaseLock() } if (fullContent) { message.success('审核完成') } else { throw new Error('未收到审核结果') } } catch (error) { console.error('审核错误:', error) message.error(error instanceof Error ? error.message : '审核失败,请稍后重试') } finally { setLoading(false) } } const handleClear = () => { form.resetFields() setReviewResult('') setCurrentContract('') message.info('已清空内容') } const handleExport = () => { if (!reviewResult) { message.warning('没有可导出的内容') return } // 创建下载链接 const element = document.createElement('a') const file = new Blob([reviewResult], { type: 'text/plain;charset=utf-8' }) element.href = URL.createObjectURL(file) element.download = `合同审核报告_${new Date().toLocaleString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' }).replace(/\//g, '-')}.txt` document.body.appendChild(element) element.click() document.body.removeChild(element) message.success('导出成功') } return (