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, PartnerSettlementPreviewDto } from '@dukang/shared-types'; import { isLoggedIn, request } from '../lib/api'; import { formatBillPeriod, formatIssueLabel } from '../lib/settlement'; type StatusFilter = 'all' | 'unpaid' | 'paid'; function fmtMoney(n: number) { return n.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); } function billStatusLabel(status: string) { switch (status) { case 'UNPAID': return '未打款'; case 'PAID': return '已打款'; default: return status; } } function billStatusClass(status: string) { switch (status) { case 'UNPAID': return 'partner-settlement-status--reviewing'; case 'PAID': return 'partner-settlement-status--settled'; default: return ''; } } function billPeriodLabel(bill: PartnerBillDto) { return formatBillPeriod(bill.periodStart, bill.periodEnd); } export default function SettlementPage() { const navigate = useNavigate(); const [bills, setBills] = useState([]); const [preview, setPreview] = useState(null); const [statusFilter, setStatusFilter] = useState('all'); const loadBills = useCallback(() => { return Promise.all([ request('PARTNER_H5', '/partner/settlement/bills').then(setBills), request('PARTNER_H5', '/partner/settlement/preview') .then(setPreview) .catch(() => setPreview(null)), ]).then(() => undefined); }, []); useEffect(() => { if (!isLoggedIn()) { navigate('/login'); return; } void loadBills(); }, [navigate, loadBills]); const summary = useMemo(() => { const unpaid = bills.filter((b) => b.status === 'UNPAID'); const settled = bills.filter((b) => b.status === 'PAID'); return { pendingTotal: unpaid.reduce((s, b) => s + Number(b.totalAmount || 0), 0), settledTotal: settled.reduce((s, b) => s + Number(b.totalAmount || 0), 0), }; }, [bills]); const filteredBills = useMemo(() => { return bills.filter((b) => { if (statusFilter === 'all') return true; if (statusFilter === 'unpaid') return b.status === 'UNPAID'; if (statusFilter === 'paid') return b.status === 'PAID'; return true; }); }, [bills, statusFilter]); 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: 'unpaid', label: '未打款' }, { key: 'paid', label: '已打款' }, ]; return ( navigate('/')} />
account_balance_wallet

待结算总额

¥ {fmtMoney(summary.pendingTotal)}

累计已结算

¥{fmtMoney(summary.settledTotal)}

本周预付款

¥{fmtMoney(preview?.prepaymentAmount ?? 0)}

账期 {formatBillPeriod(preview?.periodStart, preview?.periodEnd)} · {formatIssueLabel(preview)}

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

对账明细记录

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

已展示全部记录

)}
); }