import { useEffect, useState, useCallback } from 'react' import { Card, Table, Typography, Statistic, Space, Row, Col, Select, Tag, Button, message, } from 'antd' import { ShoppingCartOutlined, DollarCircleOutlined, WalletOutlined, AppstoreOutlined, LineChartOutlined, ArrowRightOutlined, SkinOutlined, TeamOutlined, ShoppingOutlined, } from '@ant-design/icons' import { Link } from 'react-router-dom' import { listOrders, listSites, fetchDashboardAnalytics, formatMoney, getMe, type Site, type DistributionAnalytics, type DistributionOrder, } from '../api' import { useMember } from '../MemberContext' const ORDER_STATUS_MAP: Record = { pending_payment: { label: '待支付', color: 'orange' }, pending_handoff: { label: '待上号交付', color: 'processing' }, renting: { label: '在租中', color: 'cyan' }, overdue: { label: '已逾期', color: 'volcano' }, pending_checkout_confirm: { label: '待结单确认', color: 'blue' }, pending_checkout_accept: { label: '待号主验收', color: 'blue' }, checkout_disputing: { label: '结单争议中', color: 'magenta' }, disputing: { label: '维权中', color: 'magenta' }, abnormal: { label: '异常', color: 'error' }, completed: { label: '已完成', color: 'success' }, refunded: { label: '已退款', color: 'purple' }, cancelled: { label: '已取消', color: 'default' }, closed: { label: '已关闭', color: 'default' }, } const SETTLEMENT_STATUS_MAP: Record = { settled: { label: '已结算', color: 'success' }, pending: { label: '待结算', color: 'warning' }, unsettled: { label: '未结算', color: 'default' }, settling: { label: '结算中', color: 'processing' }, disputed: { label: '争议冻结', color: 'magenta' }, failed: { label: '结算异常', color: 'error' }, arbitrated: { label: '已仲裁结算', color: 'purple' }, closed: { label: '已关闭', color: 'default' }, } function formatGameName(gameName?: string): string { if (!gameName) return '' const lower = gameName.toLowerCase().trim() if ( lower === 'delta_force' || lower === 'deltaforce' || lower === 'delta' || lower.includes('delta_force') || lower.includes('delta') || gameName.includes('三角洲') ) { return '三角洲' } if (lower.includes('honor') || gameName.includes('王者')) { return '王者荣耀' } if (lower.includes('genshin') || gameName.includes('原神')) { return '原神' } if (lower.includes('cs') || lower.includes('csgo')) { return 'CS2' } return gameName } function formatLoginPlatform(platform?: string): string { if (!platform) return '' const lower = platform.toLowerCase().trim() if (lower === 'qq') return 'QQ' if (lower === 'wechat' || lower === 'wx') return '微信' if (lower === 'steam') return 'Steam' if (lower === 'epic') return 'Epic' if (lower === 'wegame') return 'WeGame' if (lower === 'mobile') return '手游端' if (lower === 'pc') return 'PC端' return platform } export default function Dashboard() { const member = useMember() const [sites, setSites] = useState([]) const [siteID, setSiteID] = useState(member?.site_id) const [analytics, setAnalytics] = useState(null) const [recentOrders, setRecentOrders] = useState([]) const [loading, setLoading] = useState(false) const loadData = useCallback(async (sid: number) => { setLoading(true) try { const [anaRes, ordRes] = await Promise.all([ fetchDashboardAnalytics(sid), listOrders({ siteID: sid, pageSize: 8 }), ]) setAnalytics(anaRes) setRecentOrders(ordRes.items) } catch { message.error('加载大盘数据失败') } finally { setLoading(false) } }, []) useEffect(() => { async function init() { let currentMember = member if (!currentMember) { try { currentMember = await getMe() } catch { // ignore } } const activeSiteID = currentMember?.site_id if (activeSiteID) { setSiteID(activeSiteID) void loadData(activeSiteID) } if (currentMember?.is_superadmin) { try { const rows = await listSites() setSites(rows) if (!activeSiteID && rows.length > 0) { setSiteID(rows[0].id) void loadData(rows[0].id) } } catch { // ignore } } } void init() }, [member, loadData]) const selectedSiteName = member?.site_name || sites.find((s) => s.id === siteID)?.site_name || '当前分销商' return (
运营数据大盘 当前站点:{selectedSiteName} · 实时聚合收号、货架、订单与结算收益
{member?.is_superadmin && sites.length > 1 && (