import { useState, useEffect } from 'react'; import { useRouter } from 'next/router'; import Head from 'next/head'; import { toast } from 'react-hot-toast'; import { MagnifyingGlassIcon, EyeIcon, ClockIcon, CheckCircleIcon, XCircleIcon, ExclamationTriangleIcon, ChevronLeftIcon, ChevronRightIcon, PhoneIcon, VideoCameraIcon, DocumentTextIcon, HandRaisedIcon, SpeakerWaveIcon } from '@heroicons/react/24/outline'; import { supabase, TABLES } from '@/lib/supabase'; import { getDemoData } from '@/lib/demo-data'; import { formatTime, formatCurrency } from '@/utils'; import Layout from '@/components/Layout'; interface Order { id: string; order_number: string; user_id: string; user_name: string; user_email: string; service_type: 'ai_voice_translation' | 'ai_video_translation' | 'sign_language_translation' | 'human_interpretation' | 'document_translation'; service_name: string; source_language: string; target_language: string; duration?: number; // 分钟 pages?: number; // 页数 status: 'pending' | 'processing' | 'completed' | 'cancelled' | 'failed'; priority: 'low' | 'normal' | 'high' | 'urgent'; cost: number; currency: string; // 时间信息 scheduled_at?: string; started_at?: string; completed_at?: string; created_at: string; updated_at: string; // 额外信息 notes?: string; interpreter_id?: string; interpreter_name?: string; } interface OrderFilters { search: string; status: 'all' | 'pending' | 'processing' | 'completed' | 'cancelled' | 'failed'; service_type: 'all' | 'ai_voice_translation' | 'ai_video_translation' | 'sign_language_translation' | 'human_interpretation' | 'document_translation'; priority: 'all' | 'low' | 'normal' | 'high' | 'urgent'; date_range: 'all' | 'today' | 'week' | 'month'; sortBy: 'created_at' | 'cost' | 'scheduled_at'; sortOrder: 'asc' | 'desc'; } export default function OrdersPage() { const [orders, setOrders] = useState([]); const [loading, setLoading] = useState(true); const [currentPage, setCurrentPage] = useState(1); const [totalPages, setTotalPages] = useState(1); const [totalCount, setTotalCount] = useState(0); const [isDemoMode, setIsDemoMode] = useState(false); const [filters, setFilters] = useState({ search: '', status: 'all', service_type: 'all', priority: 'all', date_range: 'all', sortBy: 'created_at', sortOrder: 'desc' }); const router = useRouter(); const pageSize = 20; // 获取订单数据 const fetchOrders = async (page = 1) => { try { setLoading(true); // 检查是否为演示模式 const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL; const isDemo = !supabaseUrl || supabaseUrl === 'https://demo.supabase.co' || supabaseUrl === ''; setIsDemoMode(isDemo); if (isDemo) { // 使用演示数据 const result = await getDemoData.orders(); setOrders(result); setTotalCount(result.length); setTotalPages(Math.ceil(result.length / pageSize)); setCurrentPage(page); } else { // 使用真实数据 - 这里需要根据实际数据库结构调整 // 暂时使用演示数据 const result = await getDemoData.orders(); setOrders(result); setTotalCount(result.length); setTotalPages(Math.ceil(result.length / pageSize)); setCurrentPage(page); } } catch (error) { console.error('Error fetching orders:', error); toast.error('获取订单数据失败'); } finally { setLoading(false); } }; useEffect(() => { fetchOrders(1); }, []); // 处理筛选变更 const handleFilterChange = (key: keyof OrderFilters, value: any) => { setFilters(prev => ({ ...prev, [key]: value })); }; // 应用筛选 const applyFilters = () => { setCurrentPage(1); fetchOrders(1); }; // 重置筛选 const resetFilters = () => { setFilters({ search: '', status: 'all', service_type: 'all', priority: 'all', date_range: 'all', sortBy: 'created_at', sortOrder: 'desc' }); setCurrentPage(1); fetchOrders(1); }; // 获取状态颜色 const getStatusColor = (status: string) => { switch (status) { case 'pending': return 'bg-yellow-100 text-yellow-800'; case 'processing': return 'bg-blue-100 text-blue-800'; case 'completed': return 'bg-green-100 text-green-800'; case 'cancelled': return 'bg-gray-100 text-gray-800'; case 'failed': return 'bg-red-100 text-red-800'; default: return 'bg-gray-100 text-gray-800'; } }; // 获取状态文本 const getStatusText = (status: string) => { switch (status) { case 'pending': return '待处理'; case 'processing': return '处理中'; case 'completed': return '已完成'; case 'cancelled': return '已取消'; case 'failed': return '失败'; default: return status; } }; // 获取优先级颜色 const getPriorityColor = (priority: string) => { switch (priority) { case 'urgent': return 'bg-red-100 text-red-800'; case 'high': return 'bg-orange-100 text-orange-800'; case 'normal': return 'bg-blue-100 text-blue-800'; case 'low': return 'bg-gray-100 text-gray-800'; default: return 'bg-gray-100 text-gray-800'; } }; // 获取优先级文本 const getPriorityText = (priority: string) => { switch (priority) { case 'urgent': return '紧急'; case 'high': return '高'; case 'normal': return '普通'; case 'low': return '低'; default: return priority; } }; // 获取服务类型图标 const getServiceIcon = (serviceType: string) => { switch (serviceType) { case 'ai_voice_translation': return ; case 'ai_video_translation': return ; case 'sign_language_translation': return ; case 'human_interpretation': return ; case 'document_translation': return ; default: return ; } }; return ( 订单管理 - 口译服务管理系统

订单管理

管理所有口译服务订单

{/* 搜索和筛选 */}
handleFilterChange('search', e.target.value)} />
{/* 订单列表 */}
{loading ? (

加载中...

) : (
{orders.map((order) => ( ))}
订单信息 客户信息 服务详情 状态 优先级 费用 时间 操作
{order.order_number}
{getServiceIcon(order.service_type)} {order.service_name}
{order.user_name}
{order.user_email}
{order.source_language} → {order.target_language}
{order.duration && `时长: ${order.duration}分钟`} {order.pages && `页数: ${order.pages}页`}
{order.interpreter_name && (
译员: {order.interpreter_name}
)}
{getStatusText(order.status)} {getPriorityText(order.priority)}
{formatCurrency(order.cost)}
创建: {formatTime(order.created_at)}
{order.scheduled_at && (
预约: {formatTime(order.scheduled_at)}
)} {order.completed_at && (
完成: {formatTime(order.completed_at)}
)}
)}
{/* 分页 */} {totalPages > 1 && (
显示第 {(currentPage - 1) * pageSize + 1} - {Math.min(currentPage * pageSize, totalCount)} 条,共 {totalCount} 条
{currentPage} / {totalPages}
)}
); }