'use client'; import { useEffect } from 'react'; import { getPaymentDisplayInfo, formatCreatedAt } from '@/lib/pay-utils'; import type { Locale } from '@/lib/locale'; interface AuditLog { id: string; action: string; detail: string | null; operator: string | null; createdAt: string; } interface OrderDetailProps { order: { id: string; userId: number; userName: string | null; userEmail: string | null; amount: number; status: string; paymentType: string; rechargeCode: string; paymentTradeNo: string | null; refundAmount: number | null; refundReason: string | null; refundAt: string | null; forceRefund: boolean; expiresAt: string; paidAt: string | null; completedAt: string | null; failedAt: string | null; failedReason: string | null; createdAt: string; updatedAt: string; clientIp: string | null; srcHost: string | null; srcUrl: string | null; paymentSuccess?: boolean; rechargeSuccess?: boolean; rechargeStatus?: string; auditLogs: AuditLog[]; }; onClose: () => void; dark?: boolean; locale?: Locale; } export default function OrderDetail({ order, onClose, dark, locale = 'zh' }: OrderDetailProps) { const currency = locale === 'en' ? '$' : '¥'; const text = locale === 'en' ? { title: 'Order Details', auditLogs: 'Audit Logs', operator: 'Operator', emptyLogs: 'No logs', close: 'Close', yes: 'Yes', no: 'No', orderId: 'Order ID', userId: 'User ID', userName: 'Username', email: 'Email', amount: 'Amount', status: 'Status', paymentSuccess: 'Payment Success', rechargeSuccess: 'Recharge Success', rechargeStatus: 'Recharge Status', paymentChannel: 'Payment Channel', provider: 'Provider', rechargeCode: 'Recharge Code', paymentTradeNo: 'Payment Trade No.', clientIp: 'Client IP', sourceHost: 'Source Host', sourcePage: 'Source Page', createdAt: 'Created At', expiresAt: 'Expires At', paidAt: 'Paid At', completedAt: 'Completed At', failedAt: 'Failed At', failedReason: 'Failure Reason', refundAmount: 'Refund Amount', refundReason: 'Refund Reason', refundAt: 'Refunded At', forceRefund: 'Force Refund', } : { title: '订单详情', auditLogs: '审计日志', operator: '操作者', emptyLogs: '暂无日志', close: '关闭', yes: '是', no: '否', orderId: '订单号', userId: '用户ID', userName: '用户名', email: '邮箱', amount: '金额', status: '状态', paymentSuccess: '支付成功', rechargeSuccess: '充值成功', rechargeStatus: '充值状态', paymentChannel: '支付渠道', provider: '提供商', rechargeCode: '充值码', paymentTradeNo: '支付单号', clientIp: '客户端IP', sourceHost: '来源域名', sourcePage: '来源页面', createdAt: '创建时间', expiresAt: '过期时间', paidAt: '支付时间', completedAt: '完成时间', failedAt: '失败时间', failedReason: '失败原因', refundAmount: '退款金额', refundReason: '退款原因', refundAt: '退款时间', forceRefund: '强制退款', }; useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); }; document.addEventListener('keydown', handleKeyDown); return () => document.removeEventListener('keydown', handleKeyDown); }, [onClose]); const paymentInfo = getPaymentDisplayInfo(order.paymentType, locale); const fields = [ { label: text.orderId, value: order.id }, { label: text.userId, value: order.userId }, { label: text.userName, value: order.userName || '-' }, { label: text.email, value: order.userEmail || '-' }, { label: text.amount, value: `${currency}${order.amount.toFixed(2)}` }, { label: text.status, value: order.status }, { label: text.paymentSuccess, value: order.paymentSuccess ? text.yes : text.no }, { label: text.rechargeSuccess, value: order.rechargeSuccess ? text.yes : text.no }, { label: text.rechargeStatus, value: order.rechargeStatus || '-' }, { label: text.paymentChannel, value: paymentInfo.channel }, { label: text.provider, value: paymentInfo.provider || '-' }, { label: text.rechargeCode, value: order.rechargeCode }, { label: text.paymentTradeNo, value: order.paymentTradeNo || '-' }, { label: text.clientIp, value: order.clientIp || '-' }, { label: text.sourceHost, value: order.srcHost || '-' }, { label: text.sourcePage, value: order.srcUrl || '-' }, { label: text.createdAt, value: formatCreatedAt(order.createdAt, locale) }, { label: text.expiresAt, value: formatCreatedAt(order.expiresAt, locale) }, { label: text.paidAt, value: order.paidAt ? formatCreatedAt(order.paidAt, locale) : '-' }, { label: text.completedAt, value: order.completedAt ? formatCreatedAt(order.completedAt, locale) : '-' }, { label: text.failedAt, value: order.failedAt ? formatCreatedAt(order.failedAt, locale) : '-' }, { label: text.failedReason, value: order.failedReason || '-' }, ]; if (order.refundAmount) { fields.push( { label: text.refundAmount, value: `${currency}${order.refundAmount.toFixed(2)}` }, { label: text.refundReason, value: order.refundReason || '-' }, { label: text.refundAt, value: order.refundAt ? formatCreatedAt(order.refundAt, locale) : '-' }, { label: text.forceRefund, value: order.forceRefund ? text.yes : text.no }, ); } return (

{text.title}

{fields.map(({ label, value }) => (
{label}
{value}
))}
{/* Audit Logs */}

{text.auditLogs}

{order.auditLogs.map((log) => (
{log.action} {formatCreatedAt(log.createdAt, locale)}
{log.detail && (
{log.detail}
)} {log.operator && (
{text.operator}: {log.operator}
)}
))} {order.auditLogs.length === 0 && (
{text.emptyLogs}
)}
); }