import { useEffect, useState } from 'react' import { useParams, useNavigate } from 'react-router-dom' import { Card, Table, Button, Tag, Select, Input, message, Divider, Spin } from 'antd' import { LeftOutlined } from '@ant-design/icons' import { apiService } from '../services/api' import { formatUSDC } from '../utils' import { useMediaQuery } from 'react-responsive' import { useTranslation } from 'react-i18next' import type { SellOrderInfo, OrderTrackingRequest, OrderTrackingListResponse } from '../types' const { Option } = Select const CopyTradingSellOrdersPage: React.FC = () => { const { t } = useTranslation() const { copyTradingId } = useParams<{ copyTradingId: string }>() const navigate = useNavigate() const isMobile = useMediaQuery({ maxWidth: 768 }) const [loading, setLoading] = useState(false) const [orders, setOrders] = useState([]) const [total, setTotal] = useState(0) const [page, setPage] = useState(1) const [limit, setLimit] = useState(20) const [filters, setFilters] = useState<{ marketId?: string side?: string }>({}) useEffect(() => { if (copyTradingId) { fetchOrders() } }, [copyTradingId, page, limit, filters]) const fetchOrders = async () => { if (!copyTradingId) return setLoading(true) try { const request: OrderTrackingRequest = { copyTradingId: parseInt(copyTradingId), type: 'sell', page, limit, ...filters } const response = await apiService.orderTracking.list(request) if (response.data.code === 0 && response.data.data) { const data = response.data.data as OrderTrackingListResponse setOrders((data.list || []) as SellOrderInfo[]) setTotal(data.total || 0) } else { message.error(response.data.msg || '获取卖出订单列表失败') } } catch (error: any) { message.error(error.message || '获取卖出订单列表失败') } finally { setLoading(false) } } const getPnlColor = (value: string): string => { const num = parseFloat(value) if (isNaN(num)) return '#666' return num >= 0 ? '#3f8600' : '#cf1322' } const columns = [ { title: '订单ID', dataIndex: 'orderId', key: 'orderId', width: isMobile ? 100 : 150, render: (text: string) => ( {isMobile ? `${text.slice(0, 6)}...${text.slice(-4)}` : `${text.slice(0, 8)}...${text.slice(-6)}` } ) }, { title: 'Leader 交易ID', dataIndex: 'leaderTradeId', key: 'leaderTradeId', width: isMobile ? 100 : 150, render: (text: string) => ( {isMobile ? `${text.slice(0, 6)}...${text.slice(-4)}` : `${text.slice(0, 8)}...${text.slice(-6)}` } ) }, { title: '市场', dataIndex: 'marketId', key: 'marketId', width: isMobile ? 100 : 150, render: (text: string) => ( {isMobile ? `${text.slice(0, 6)}...${text.slice(-4)}` : `${text.slice(0, 8)}...${text.slice(-6)}` } ) }, { title: '方向', dataIndex: 'side', key: 'side', width: isMobile ? 60 : 80, render: (side: string) => { // 将0/1转换为YES/NO const displaySide = side === '0' ? 'YES' : side === '1' ? 'NO' : side return {displaySide} } }, { title: '卖出数量', dataIndex: 'quantity', key: 'quantity', width: isMobile ? 80 : 100, render: (value: string) => ( {formatUSDC(value)} ) }, { title: '卖出价格', dataIndex: 'price', key: 'price', width: isMobile ? 80 : 100, render: (value: string) => ( {formatUSDC(value)} ) }, { title: '卖出金额', key: 'amount', width: isMobile ? 100 : 120, render: (_: any, record: SellOrderInfo) => { const amount = (parseFloat(record.quantity) * parseFloat(record.price)).toString() return ( {isMobile ? formatUSDC(amount) : `${formatUSDC(amount)} USDC`} ) } }, { title: '已实现盈亏', dataIndex: 'realizedPnl', key: 'realizedPnl', width: isMobile ? 100 : 120, render: (value: string) => ( {isMobile ? formatUSDC(value) : `${formatUSDC(value)} USDC`} ) }, { title: '创建时间', dataIndex: 'createdAt', key: 'createdAt', width: isMobile ? 120 : 160, render: (timestamp: number) => ( {isMobile ? new Date(timestamp).toLocaleDateString('zh-CN') : new Date(timestamp).toLocaleString('zh-CN') } ) } ] return (

卖出订单列表

setFilters({ ...filters, marketId: e.target.value || undefined })} />
{isMobile ? ( // 移动端卡片布局
{loading ? (
) : orders.length === 0 ? (
暂无卖出订单
) : (
{orders.map((order) => { const date = new Date(order.createdAt) const formattedDate = date.toLocaleString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' }) const amount = (parseFloat(order.quantity) * parseFloat(order.price)).toString() const displaySide = order.side === '0' ? 'YES' : order.side === '1' ? 'NO' : order.side return ( {/* 订单ID和方向 */}
{order.orderId.slice(0, 8)}...{order.orderId.slice(-6)}
{displaySide}
{/* 卖出信息 */}
卖出信息
数量: {formatUSDC(order.quantity)} | 价格: {formatUSDC(order.price)}
金额: {formatUSDC(amount)} USDC
{/* 已实现盈亏 */}
已实现盈亏
{formatUSDC(order.realizedPnl)} USDC
{/* Leader 交易ID */}
Leader 交易ID
{order.leaderTradeId.slice(0, 8)}...{order.leaderTradeId.slice(-6)}
{/* 市场ID */}
市场ID
{order.marketId.slice(0, 8)}...{order.marketId.slice(-6)}
{/* 创建时间 */}
创建时间: {formattedDate}
) })}
)}
) : ( // 桌面端表格布局 `共 ${total} 条`, onChange: (newPage, newLimit) => { setPage(newPage) setLimit(newLimit) } }} /> )} ) } export default CopyTradingSellOrdersPage