import React, { useEffect, useState, useCallback } from 'react' import { View, Text, ScrollView } from '@tarojs/components' import Taro from '@tarojs/taro' import NavBar from '@/components/NavBar' import { pageShopOrder } from '@/api/shop/shopOrder' definePageConfig({ navigationBarTitleText: '数据看板', }) interface DashboardStats { orders: number revenue: number paidOrders: number pendingOrders: number canceledOrders: number } const StatisticsDashboardPage: React.FC = () => { const [loading, setLoading] = useState(true) const [todayStats, setTodayStats] = useState({ orders: 0, revenue: 0, paidOrders: 0, pendingOrders: 0, canceledOrders: 0 }) const [weekStats, setWeekStats] = useState({ orders: 0, revenue: 0, paidOrders: 0, pendingOrders: 0, canceledOrders: 0 }) const formatDate = (date: Date) => { const y = date.getFullYear() const m = String(date.getMonth() + 1).padStart(2, '0') const d = String(date.getDate()).padStart(2, '0') return `${y}-${m}-${d}` } const calcStats = (orders: any[]): DashboardStats => { const paidOrders = orders.filter(o => o.payStatus === true || o.payStatus === 1) const revenue = paidOrders.reduce((sum, o) => sum + parseFloat(o.payPrice || '0'), 0) const pendingOrders = orders.filter(o => o.orderStatus === 0 || (!o.payStatus && o.orderStatus !== 2)) const canceledOrders = orders.filter(o => o.orderStatus === 2) return { orders: orders.length, revenue, paidOrders: paidOrders.length, pendingOrders: pendingOrders.length, canceledOrders: canceledOrders.length, } } const loadData = useCallback(async () => { setLoading(true) try { const now = new Date() const todayStr = formatDate(now) const weekAgo = new Date(now.getTime() - 6 * 24 * 60 * 60 * 1000) const weekAgoStr = formatDate(weekAgo) const [todayRes, weekRes] = await Promise.all([ pageShopOrder({ page: 1, limit: 200, startTime: `${todayStr} 00:00:00`, endTime: `${todayStr} 23:59:59` } as any).catch(() => null), pageShopOrder({ page: 1, limit: 500, startTime: `${weekAgoStr} 00:00:00`, endTime: `${todayStr} 23:59:59` } as any).catch(() => null), ]) if (todayRes?.list) { setTodayStats(calcStats(todayRes.list)) } if (weekRes?.list) { setWeekStats(calcStats(weekRes.list)) } } catch (e) { console.error('加载统计数据失败', e) } finally { setLoading(false) } }, []) useEffect(() => { loadData() }, [loadData]) const goTo = (path: string) => { Taro.navigateTo({ url: path }) } const renderStatCard = (label: string, value: string | number, color: string, sub?: string) => ( {label} {value} {sub && {sub}} ) return ( {loading ? ( 加载中... ) : ( {/* 今日数据 */} 今日数据 实时 {renderStatCard('今日订单', todayStats.orders, '#3b82f6')} {renderStatCard('今日销售额', `¥${todayStats.revenue.toFixed(2)}`, '#ef4444')} {renderStatCard('已支付', todayStats.paidOrders, '#10b981')} {renderStatCard('待支付', todayStats.pendingOrders, '#f59e0b')} {todayStats.canceledOrders > 0 && ( 今日取消订单 {todayStats.canceledOrders} 单 )} {/* 近7天数据 */} 近7天数据 滚动统计 总订单数 {weekStats.orders} 单 总销售额 ¥{weekStats.revenue.toFixed(2)} 已支付订单 {weekStats.paidOrders} 单 客单价 ¥{weekStats.paidOrders > 0 ? (weekStats.revenue / weekStats.paidOrders).toFixed(2) : '0.00'} {/* 快捷入口 */} 详细数据 goTo('/pages/statistics/sales')} > 📊 销售统计 goTo('/pages/statistics/users')} > 👥 用户分析 goTo('/pages/order/list')} > 📋 查看所有订单 {/* 刷新按钮 */} 点击刷新数据 )} ) } export default StatisticsDashboardPage