import { useCallback, useEffect, useMemo, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import PageHeader from '@dukang/shared-ui/PageHeader'; import PullToRefresh from '@dukang/shared-ui/PullToRefresh'; import type { PartnerBillDto } from '@dukang/shared-types'; import { isLoggedIn, request } from '../lib/api'; type StatusFilter = 'all' | 'pending' | 'settled' | 'reviewing' | 'rejected'; function fmtMoney(n: number) { return n.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); } function billStatusLabel(status: string) { switch (status) { case 'AWAITING_CONFIRM': return '待确认'; case 'UNPAID': return '未打款'; case 'PAID': return '已打款'; case 'REJECTED': return '已驳回'; default: return status; } } function billStatusClass(status: string) { switch (status) { case 'AWAITING_CONFIRM': return 'partner-settlement-status--pending'; case 'UNPAID': return 'partner-settlement-status--reviewing'; case 'PAID': return 'partner-settlement-status--settled'; case 'REJECTED': return 'partner-settlement-status--rejected'; 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'); const loadBills = useCallback(() => { return request('PARTNER_H5', '/partner/settlement/bills').then(setBills); }, []); useEffect(() => { if (!isLoggedIn()) { navigate('/login'); return; } void loadBills(); }, [navigate, loadBills]); const summary = useMemo(() => { const pending = bills.filter((b) => b.status === 'AWAITING_CONFIRM'); 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 === 'AWAITING_CONFIRM'; if (statusFilter === 'settled') return b.status === 'PAID'; if (statusFilter === 'reviewing') return b.status === 'UNPAID'; if (statusFilter === 'rejected') return b.status === 'REJECTED'; 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: 'reviewing', label: '未打款' }, { key: 'rejected', label: '已驳回' }, { key: 'settled', 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 && (

已展示全部记录

)}
); }