import { useCallback, useEffect, useMemo, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import type { PartnerWeeklyReportResponse } from '@dukang/shared-types'; import PageHeader from '@dukang/shared-ui/PageHeader'; import PullToRefresh from '@dukang/shared-ui/PullToRefresh'; import { fetchPartnerWeeklyReport } from '../lib/weeklyReport'; import { usePartnerPageView } from '../lib/usePageView'; function fmtMoney(n: number) { return n.toLocaleString('zh-CN', { minimumFractionDigits: 0, maximumFractionDigits: 0 }); } function fmtGrowth(n: number) { const sign = n > 0 ? '+' : ''; return `${sign}${n}%`; } export default function WeeklyReportPage() { usePartnerPageView('partner_weekly_report_view'); const navigate = useNavigate(); const [selectedStart, setSelectedStart] = useState(); const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const loadWeeklyReport = useCallback(() => { setLoading(true); setError(''); return fetchPartnerWeeklyReport(selectedStart) .then(setData) .catch((e) => { setData(null); setError(e instanceof Error ? e.message : '加载失败'); }) .finally(() => setLoading(false)); }, [selectedStart]); useEffect(() => { void loadWeeklyReport(); }, [loadWeeklyReport]); const maxDailyGmv = useMemo(() => { if (!data?.dailyGmv.length) return 1; return Math.max(1, ...data.dailyGmv.map((item) => item.amount)); }, [data]); const topStores = data?.storeRanking.slice(0, 3) ?? []; const summary = data?.summary; const growthPositive = (summary?.gmvGrowthPercent ?? 0) >= 0; return ( navigate('/')} />

经营数据周报

{data && (
{data.availablePeriods.map((period) => ( ))}
)}
{loading &&

加载中…

} {!loading && error && (

{error}

)} {!loading && !error && data && summary && ( <>

累计成交额 (GMV)

¥{fmtMoney(summary.gmv)}

{growthPositive ? 'trending_up' : 'trending_down'} {fmtGrowth(summary.gmvGrowthPercent)}

活跃门店

{summary.activeStoreCount} / {summary.totalStoreCount}

订单总量

{summary.orderCount}

storefront

本周新签约门店

{summary.newStoreCount} / {summary.newStoreTarget}

已完成本周目标的 {summary.newStoreProgressPercent}%。 {summary.newStoreCount < summary.newStoreTarget ? `还差 ${summary.newStoreTarget - summary.newStoreCount} 家!` : '目标已达成!'}

每日成交趋势

过去 7 天
{data.dailyGmv.map((item) => { const height = Math.max(8, Math.round((item.amount / maxDailyGmv) * 100)); const isMax = item.amount === maxDailyGmv && item.amount > 0; return (
); })}
{data.dailyGmv.map((item) => ( {item.weekdayLabel} ))}

门店业绩排行

{topStores.length === 0 ? (

本周暂无核销排行数据

) : (
{topStores.map((store) => (
{store.rank === 1 ? ( workspace_premium ) : ( {store.rank} )}

{store.name}

{store.subtitle && (

{store.subtitle}

)}

¥{fmtMoney(store.redeemAmount)}

))}
)}
tips_and_updates

合伙人经营策略

{data.insight}

)}
); }