import { useEffect, useState, useCallback } from 'react' import { Card, Table, Typography, Space, Select, Tag, message, Button, Modal, Form, Input, InputNumber, Radio, Statistic, Row, Col, Image, } from 'antd' import { WalletOutlined, PlusOutlined, DollarCircleOutlined, LockOutlined, CheckCircleOutlined, HourglassOutlined, } from '@ant-design/icons' import { fetchSiteWallet, fetchSiteWithdrawals, applySiteWithdrawal, listSites, formatMoney, getMe, type SiteWallet, type SiteWithdrawal, type Site, } from '../api' import { useMember } from '../MemberContext' const STATUS_CONFIG: Record = { pending: { label: '待审核', color: 'orange' }, processing: { label: '处理中/审核通过', color: 'blue' }, completed: { label: '已打款', color: 'success' }, rejected: { label: '已拒绝', color: 'error' }, } export default function Wallet() { const member = useMember() const [sites, setSites] = useState([]) const [siteID, setSiteID] = useState(member?.site_id) const [wallet, setWallet] = useState(null) const [withdrawals, setWithdrawals] = useState([]) const [total, setTotal] = useState(0) const [page, setPage] = useState(1) const pageSize = 20 const [loading, setLoading] = useState(false) const [modalVisible, setModalVisible] = useState(false) const [submitting, setSubmitting] = useState(false) const [form] = Form.useForm() const loadData = useCallback(async (targetPage: number) => { if (!siteID) return setLoading(true) try { const [walletRes, wdRes] = await Promise.all([ fetchSiteWallet(siteID), fetchSiteWithdrawals(siteID, targetPage, pageSize), ]) setWallet(walletRes) setWithdrawals(wdRes.items) setTotal(wdRes.total) setPage(wdRes.page) } catch { message.error('加载钱包与提现数据失败') } finally { setLoading(false) } }, [siteID]) useEffect(() => { async function init() { let currentMember = member if (!currentMember) { try { currentMember = await getMe() } catch { // ignore } } const activeSiteID = currentMember?.site_id if (activeSiteID) { setSiteID(activeSiteID) } if (currentMember?.is_superadmin) { try { const rows = await listSites() setSites(rows) if (!activeSiteID && rows.length > 0) { setSiteID(rows[0].id) } } catch { // ignore } } } void init() }, [member]) useEffect(() => { void loadData(1) }, [loadData]) async function handleApplyWithdrawal(values: { amount: number account_type: 'alipay' | 'bank' account_name: string account_no: string bank_name?: string bank_branch?: string }) { if (!siteID) return const amountCent = Math.round(values.amount * 100) if (amountCent <= 0) { message.error('提现金额必须大于0') return } if (wallet && amountCent > wallet.available_balance_cent) { message.error('提现金额不能超过当前可提现余额') return } setSubmitting(true) try { await applySiteWithdrawal({ site_id: siteID, amount_cent: amountCent, account_type: values.account_type, account_name: values.account_name, account_no: values.account_no, bank_name: values.bank_name, bank_branch: values.bank_branch, }) message.success('提现申请提交成功,请等待主站财务审核打款') setModalVisible(false) form.resetFields() void loadData(1) } catch (error: unknown) { const respMessage = (error as { response?: { data?: { message?: string } } })?.response?.data?.message message.error(respMessage || '提现申请提交失败') } finally { setSubmitting(false) } } const selectedSite = sites.find((s) => s.id === siteID) return (
资金管理与商户提现 查看分销结算收益到账情况,申请提取收益并实时追踪财务打款流水。 {wallet?.settlement_hold_days != null ? ` 当前站点冷却期 ${wallet.settlement_hold_days} 天。` : ''}
{member?.is_superadmin && sites.length > 1 && ( { form.setFieldsValue({ amount: (wallet?.available_balance_cent ?? 0) / 100, }) }} > 全部提现 } /> 支付宝 银行卡 prev.account_type !== cur.account_type} > {({ getFieldValue }) => getFieldValue('account_type') === 'bank' ? ( <> ) : null } ) }