/** * 数据统计页面 * [2026-01-04] 更新:新增系统账户报表Tab * [2026-01-06] 更新:认种统计改为真实数据,实现趋势图表 * 回滚方式:删除 SystemAccountsTab 导入及相关 mainTab state 和切换逻辑 */ 'use client'; import { useState, useEffect } from 'react'; import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, Legend, } from 'recharts'; import { PageContainer } from '@/components/layout'; import { cn } from '@/utils/helpers'; // [2026-01-04] 新增:系统账户报表Tab import { SystemAccountsTab } from '@/components/features/system-account-report'; import { dashboardService } from '@/services/dashboardService'; import type { PlantingGlobalStats, PlantingTrendPeriod, PlantingTrendDataPoint } from '@/types'; import styles from './statistics.module.scss'; /** * 格式化数字显示 */ function formatNumber(num: number): string { return num.toLocaleString('zh-CN'); } /** * 格式化金额显示(积分) */ function formatAmount(amount: string): string { const num = parseFloat(amount); if (isNaN(num)) return '0'; return num.toLocaleString('zh-CN', { maximumFractionDigits: 2 }); } /** * 格式化趋势图标签 */ function formatTrendLabel(label: string, period: PlantingTrendPeriod): string { if (!label) return ''; switch (period) { case 'day': // 2026-01-06 -> 01-06 return label.slice(5); case 'week': // 2026-W01 -> W01 return label.slice(5); case 'month': // 2026-01 -> 01月 return label.slice(5) + '月'; case 'quarter': // 2026-Q1 -> Q1 return label.slice(5); case 'year': // 2026 -> 2026年 return label + '年'; default: return label; } } /** * 数据统计页面 * [2026-01-04] 更新:新增系统账户报表Tab * [2026-01-06] 更新:认种统计改为真实数据,实现趋势图表 */ export default function StatisticsPage() { // [2026-01-04] 新增:主Tab切换 - 数据统计 vs 系统账户 const [mainTab, setMainTab] = useState<'statistics' | 'system-accounts'>('statistics'); // 趋势图时间维度 const [trendPeriod, setTrendPeriod] = useState('day'); // [2026-01-06] 新增:认种统计数据状态 const [plantingStats, setPlantingStats] = useState(null); const [statsLoading, setStatsLoading] = useState(true); const [statsError, setStatsError] = useState(null); // [2026-01-06] 新增:趋势数据状态 const [trendData, setTrendData] = useState([]); const [trendLoading, setTrendLoading] = useState(true); const [trendError, setTrendError] = useState(null); // [2026-01-06] 新增:获取认种统计数据 useEffect(() => { async function fetchPlantingStats() { try { setStatsLoading(true); setStatsError(null); const response = await dashboardService.getPlantingStats(); if (response.code === 0 && response.data) { setPlantingStats(response.data); } else { setStatsError(response.message || '获取统计数据失败'); } } catch (error) { console.error('获取认种统计失败:', error); setStatsError('获取统计数据失败'); } finally { setStatsLoading(false); } } fetchPlantingStats(); }, []); // [2026-01-06] 新增:获取趋势数据 useEffect(() => { async function fetchTrendData() { try { setTrendLoading(true); setTrendError(null); const response = await dashboardService.getPlantingTrendData(trendPeriod); if (response.code === 0 && response.data) { setTrendData(response.data); } else { setTrendError(response.message || '获取趋势数据失败'); } } catch (error) { console.error('获取趋势数据失败:', error); setTrendError('获取趋势数据失败'); } finally { setTrendLoading(false); } } fetchTrendData(); }, [trendPeriod]); // 处理趋势数据用于图表显示 const chartData = trendData.map(item => ({ name: formatTrendLabel(item.label, trendPeriod), 认种棵数: item.treeCount, 订单数: item.orderCount, })); return (
{/* 页面标题 */}

数据统计

{/* [2026-01-04] 新增:主Tab切换 */}
{/* [2026-01-04] 新增:系统账户报表Tab内容 */} {mainTab === 'system-accounts' && } {/* 认种统计内容 - 仅在 statistics tab 显示 */} {mainTab === 'statistics' && ( <> {/* 统计概览卡片 - [2026-01-06] 改为真实数据 */}
榴莲树认种总量
{statsLoading ? (

加载中...

) : statsError ? (

--

) : ( <>

{formatNumber(plantingStats?.totalTreeCount ?? 0)}

积分: {formatAmount(plantingStats?.totalAmount ?? '0')}
)}
今日认种数量
{statsLoading ? (

加载中...

) : statsError ? (

--

) : ( <>

{formatNumber(plantingStats?.todayStats?.treeCount ?? 0)}

积分: {formatAmount(plantingStats?.todayStats?.amount ?? '0')}
)}
本月认种数量
{statsLoading ? (

加载中...

) : statsError ? (

--

) : ( <>

{formatNumber(plantingStats?.monthStats?.treeCount ?? 0)}

积分: {formatAmount(plantingStats?.monthStats?.amount ?? '0')}
)}
{/* 榴莲树认种数量趋势 - [2026-01-06] 实现真实图表 */}
榴莲树认种数量趋势
{(['day', 'week', 'month', 'quarter', 'year'] as const).map((period) => ( ))}
{trendLoading ? (
加载中...
) : trendError ? (
{trendError}
) : chartData.length === 0 ? (
暂无数据
) : ( )}
)}
); }