import { useEffect, useMemo, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import PageHeader from '@dukang/shared-ui/PageHeader'; import type { PartnerBillDto } from '@dukang/shared-types'; import { isLoggedIn, request } from '../lib/api'; type StatusFilter = 'all' | 'pending' | 'settled' | 'reviewing'; function fmtMoney(n: number) { return n.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); } function billStatusLabel(status: string) { switch (status) { case 'DRAFT': return '待结算'; case 'CONFIRMED': return '审核中'; case 'PAID': return '已结算'; default: return status; } } function billStatusClass(status: string) { switch (status) { case 'DRAFT': return 'partner-settlement-status--pending'; case 'CONFIRMED': return 'partner-settlement-status--reviewing'; case 'PAID': return 'partner-settlement-status--settled'; default: return ''; } } function billPeriodLabel(periodStart: string) { const d = new Date(periodStart); if (Number.isNaN(d.getTime())) return '—'; return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}`; } function billMonthLabel(year: number, month: number) { return `${year}年${month}月`; } export default function SettlementPage() { const navigate = useNavigate(); const [bills, setBills] = useState([]); const now = new Date(); const [month, setMonth] = useState({ year: now.getFullYear(), month: now.getMonth() + 1 }); const [statusFilter, setStatusFilter] = useState('all'); useEffect(() => { if (!isLoggedIn()) { navigate('/login'); return; } request('PARTNER_H5', '/partner/settlement/bills').then(setBills); }, [navigate]); const summary = useMemo(() => { const pending = bills.filter((b) => b.status === 'DRAFT'); const settled = bills.filter((b) => b.status === 'PAID'); const currentMonth = bills.filter((b) => { const d = new Date(b.periodStart); return d.getFullYear() === now.getFullYear() && d.getMonth() === now.getMonth(); }); return { pendingTotal: pending.reduce((s, b) => s + Number(b.totalAmount || 0), 0), settledTotal: settled.reduce((s, b) => s + Number(b.totalAmount || 0), 0), monthEstimate: currentMonth.reduce((s, b) => s + Number(b.totalAmount || 0), 0), }; }, [bills, now]); const filteredBills = useMemo(() => { return bills.filter((b) => { const d = new Date(b.periodStart); const matchMonth = d.getFullYear() === month.year && d.getMonth() + 1 === month.month; if (!matchMonth) return false; if (statusFilter === 'all') return true; if (statusFilter === 'pending') return b.status === 'DRAFT'; if (statusFilter === 'settled') return b.status === 'PAID'; if (statusFilter === 'reviewing') return b.status === 'CONFIRMED'; return true; }); }, [bills, month, statusFilter]); const monthOptions = useMemo(() => { const opts: Array<{ year: number; month: number }> = []; for (let i = 0; i < 6; i++) { const d = new Date(now.getFullYear(), now.getMonth() - i, 1); opts.push({ year: d.getFullYear(), month: d.getMonth() + 1 }); } return opts; }, [now]); function openBill(bill: PartnerBillDto) { navigate(bill.id ? `/center/bills?id=${bill.id}` : '/center/bills'); } const statusTabs: Array<{ key: StatusFilter; label: string }> = [ { key: 'all', label: '全部' }, { key: 'pending', label: '待结算' }, { key: 'settled', label: '已结算' }, { key: 'reviewing', label: '审核中' }, ]; return (
navigate('/')} />
account_balance_wallet

待结算总额

¥ {fmtMoney(summary.pendingTotal)}

累计已结算

¥{fmtMoney(summary.settledTotal)}

本月预估收益

¥{fmtMoney(summary.monthEstimate)}

{statusTabs.map((tab) => ( ))}

对账明细记录

{filteredBills.length === 0 && (
暂无对账记录
)}
{filteredBills.map((bill) => ( ))}
{filteredBills.length > 0 && (

已展示全部记录

)}
); }