'use client' import { useState, useEffect } from 'react' import { useRouter, useParams, useSearchParams } from 'next/navigation' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card' import { Button } from '@/components/ui/Button' import { SuccessTag, WarningTag, ErrorTag, PendingTag } from '@/components/ui/Tag' import { ReviewSteps, getReviewSteps } from '@/components/ui/ReviewSteps' import { ArrowLeft, Upload, FileText, CheckCircle, XCircle, AlertTriangle, Clock, Loader2, RefreshCw, Eye, MessageSquare } from 'lucide-react' // 模拟任务数据 const mockTask = { id: 'task-001', projectName: 'XX品牌618推广', brandName: 'XX护肤品牌', deadline: '2026-06-18', scriptStatus: 'pending_upload', // pending_upload | ai_reviewing | ai_result | agent_reviewing | agent_rejected | brand_reviewing | brand_passed | brand_rejected scriptFile: null as string | null, aiResult: null as null | { score: number violations: Array<{ type: string; content: string; suggestion: string }> complianceChecks: Array<{ item: string; passed: boolean; note?: string }> }, agencyReview: null as null | { result: 'approved' | 'rejected' comment: string reviewer: string time: string }, brandReview: null as null | { result: 'approved' | 'rejected' comment: string reviewer: string time: string }, } // 根据状态获取模拟数据 function getTaskByStatus(status: string) { const task = { ...mockTask, scriptStatus: status } if (status === 'ai_result' || status === 'agent_reviewing' || status === 'agent_rejected' || status === 'brand_reviewing' || status === 'brand_passed' || status === 'brand_rejected') { task.scriptFile = '夏日护肤推广脚本.docx' task.aiResult = { score: 85, violations: [ { type: '违禁词', content: '神器', suggestion: '建议替换为"好物"或"必备品"' }, ], complianceChecks: [ { item: '品牌名称正确', passed: true }, { item: 'SPF标注准确', passed: true }, { item: '无绝对化用语', passed: false, note: '"超级好用"建议修改' }, ], } } if (status === 'agent_rejected') { task.agencyReview = { result: 'rejected', comment: '违禁词未修改,请修改后重新提交。', reviewer: '张经理', time: '2026-02-06 15:30', } } if (status === 'brand_reviewing' || status === 'brand_passed' || status === 'brand_rejected') { task.agencyReview = { result: 'approved', comment: '脚本符合要求,建议通过。', reviewer: '张经理', time: '2026-02-06 15:30', } } if (status === 'brand_passed') { task.brandReview = { result: 'approved', comment: '脚本通过终审,可以开始拍摄视频。', reviewer: '品牌方审核员', time: '2026-02-06 18:00', } } if (status === 'brand_rejected') { task.brandReview = { result: 'rejected', comment: '产品卖点覆盖不完整,请补充后重新提交。', reviewer: '品牌方审核员', time: '2026-02-06 18:00', } } return task } function UploadSection({ onUpload }: { onUpload: () => void }) { const [file, setFile] = useState(null) const handleFileChange = (e: React.ChangeEvent) => { const selectedFile = e.target.files?.[0] if (selectedFile) { setFile(selectedFile) } } return ( 上传脚本
{file ? (
{file.name}
) : ( )}
) } function AIReviewingSection() { const [progress, setProgress] = useState(0) const [logs, setLogs] = useState(['开始解析脚本文件...']) useEffect(() => { const timer = setInterval(() => { setProgress(prev => { if (prev >= 100) { clearInterval(timer) return 100 } return prev + 10 }) }, 500) const logTimer = setTimeout(() => { setLogs(prev => [...prev, '正在提取文本内容...']) }, 1000) const logTimer2 = setTimeout(() => { setLogs(prev => [...prev, '正在进行违禁词检测...']) }, 2000) const logTimer3 = setTimeout(() => { setLogs(prev => [...prev, '正在分析卖点覆盖...']) }, 3000) return () => { clearInterval(timer) clearTimeout(logTimer) clearTimeout(logTimer2) clearTimeout(logTimer3) } }, []) return (

AI 正在审核您的脚本

请稍候,预计需要 1-2 分钟

{progress}%

处理日志

{logs.map((log, idx) => (

{log}

))}
) } function AIResultSection({ task }: { task: ReturnType }) { if (!task.aiResult) return null return ( AI 审核结果 = 85 ? 'text-accent-green' : task.aiResult.score >= 70 ? 'text-yellow-400' : 'text-accent-coral'}`}> {task.aiResult.score}分 {/* 违规检测 */} {task.aiResult.violations.length > 0 && (

违规检测 ({task.aiResult.violations.length})

{task.aiResult.violations.map((v, idx) => (
{v.type}

「{v.content}」

{v.suggestion}

))}
)} {/* 合规检查 */}

合规检查

{task.aiResult.complianceChecks.map((check, idx) => (
{check.passed ? ( ) : ( )}
{check.item} {check.note &&

{check.note}

}
))}
) } function ReviewFeedbackSection({ review, type }: { review: NonNullable; type: 'agency' | 'brand' }) { const isApproved = review.result === 'approved' const title = type === 'agency' ? '代理商审核意见' : '品牌方终审意见' return ( {isApproved ? ( ) : ( )} {title}
{review.reviewer} {isApproved ? 通过 : 驳回}

{review.comment}

{review.time}

) } function WaitingSection({ message }: { message: string }) { return (

{message}

请耐心等待,审核结果将通过消息通知您

) } function SuccessSection({ onContinue }: { onContinue: () => void }) { return (

脚本审核通过!

您可以开始拍摄视频了

) } export default function CreatorScriptPage() { const router = useRouter() const params = useParams() const searchParams = useSearchParams() const status = searchParams.get('status') || 'pending_upload' const [task, setTask] = useState(getTaskByStatus(status)) // 模拟状态切换 const simulateUpload = () => { setTask(getTaskByStatus('ai_reviewing')) setTimeout(() => { setTask(getTaskByStatus('ai_result')) }, 4000) } const handleResubmit = () => { setTask(getTaskByStatus('pending_upload')) } const handleContinueToVideo = () => { router.push(`/creator/task/${params.id}/video`) } const getStatusDisplay = () => { switch (task.scriptStatus) { case 'pending_upload': return '待上传脚本' case 'ai_reviewing': return 'AI 审核中' case 'ai_result': return 'AI 审核完成' case 'agent_reviewing': return '代理商审核中' case 'agent_rejected': return '代理商驳回' case 'brand_reviewing': return '品牌方终审中' case 'brand_passed': return '审核通过' case 'brand_rejected': return '品牌方驳回' default: return '未知状态' } } return (
{/* 顶部导航 */}

{task.projectName}

脚本阶段 · {getStatusDisplay()}

{/* 审核流程进度条 */} {/* 根据状态显示不同内容 */} {task.scriptStatus === 'pending_upload' && ( )} {task.scriptStatus === 'ai_reviewing' && ( )} {task.scriptStatus === 'ai_result' && ( <> )} {task.scriptStatus === 'agent_reviewing' && ( <> )} {task.scriptStatus === 'agent_rejected' && task.agencyReview && ( <>
)} {task.scriptStatus === 'brand_reviewing' && task.agencyReview && ( <> )} {task.scriptStatus === 'brand_passed' && task.agencyReview && task.brandReview && ( <> )} {task.scriptStatus === 'brand_rejected' && task.agencyReview && task.brandReview && ( <>
)}
) }