import React, { useState, useRef, useEffect, useCallback } from 'react' import { View, Text } from '@tarojs/components' import { Cell, Button, Form, Input, CellGroup, Radio, Tabs, Tag, Empty, Loading, PullToRefresh } from '@nutui/nutui-react-taro' import { Wallet } from '@nutui/icons-react-taro' import { businessGradients } from '@/styles/gradients' import Taro from '@tarojs/taro' import { useDealerUser } from '@/hooks/useDealerUser' import { pageShopDealerWithdraw, addShopDealerWithdraw } from '@/api/shop/shopDealerWithdraw' import type { ShopDealerWithdraw } from '@/api/shop/shopDealerWithdraw/model' interface WithdrawRecordWithDetails extends ShopDealerWithdraw { accountDisplay?: string } const DealerWithdraw: React.FC = () => { const [activeTab, setActiveTab] = useState('0') const [selectedAccount, setSelectedAccount] = useState('') const [loading, setLoading] = useState(false) const [refreshing, setRefreshing] = useState(false) const [submitting, setSubmitting] = useState(false) const [availableAmount, setAvailableAmount] = useState('0.00') const [withdrawRecords, setWithdrawRecords] = useState([]) const formRef = useRef(null) const { dealerUser } = useDealerUser() // 获取可提现余额 const fetchBalance = useCallback(async () => { try { setAvailableAmount(dealerUser?.money || '0.00') } catch (error) { console.error('获取余额失败:', error) } }, []) // 获取提现记录 const fetchWithdrawRecords = useCallback(async () => { if (!dealerUser?.userId) return try { setLoading(true) const result = await pageShopDealerWithdraw({ page: 1, limit: 100, userId: dealerUser.userId }) if (result?.list) { const processedRecords = result.list.map(record => ({ ...record, accountDisplay: getAccountDisplay(record) })) setWithdrawRecords(processedRecords) } } catch (error) { console.error('获取提现记录失败:', error) Taro.showToast({ title: '获取提现记录失败', icon: 'error' }) } finally { setLoading(false) } }, [dealerUser?.userId]) // 格式化账户显示 const getAccountDisplay = (record: ShopDealerWithdraw) => { if (record.payType === 10) { return '微信钱包' } else if (record.payType === 20 && record.alipayAccount) { return `支付宝(${record.alipayAccount.slice(-4)})` } else if (record.payType === 30 && record.bankCard) { return `${record.bankName || '银行卡'}(尾号${record.bankCard.slice(-4)})` } return '未知账户' } // 刷新数据 const handleRefresh = async () => { setRefreshing(true) await Promise.all([fetchBalance(), fetchWithdrawRecords()]) setRefreshing(false) } // 初始化加载数据 useEffect(() => { if (dealerUser?.userId) { fetchBalance().then() fetchWithdrawRecords().then() } }, [fetchBalance, fetchWithdrawRecords]) const getStatusText = (status?: number) => { switch (status) { case 40: return '已到账' case 20: return '审核通过' case 10: return '待审核' case 30: return '已驳回' default: return '未知' } } const getStatusColor = (status?: number) => { switch (status) { case 40: return 'success' case 20: return 'success' case 10: return 'warning' case 30: return 'danger' default: return 'default' } } const handleSubmit = async (values: any) => { if (!dealerUser?.userId) { Taro.showToast({ title: '用户信息获取失败', icon: 'error' }) return } // 验证提现金额 const amount = parseFloat(values.amount) const available = parseFloat(availableAmount.replace(',', '')) if (amount < 100) { Taro.showToast({ title: '最低提现金额为100元', icon: 'error' }) return } if (amount > available) { Taro.showToast({ title: '提现金额超过可用余额', icon: 'error' }) return } try { setSubmitting(true) const withdrawData: ShopDealerWithdraw = { userId: dealerUser.userId, money: values.amount, payType: values.accountType === 'wechat' ? 10 : values.accountType === 'alipay' ? 20 : 30, applyStatus: 10, // 待审核 platform: 'MiniProgram' } // 根据提现方式设置账户信息 if (values.accountType === 'alipay') { withdrawData.alipayAccount = values.account withdrawData.alipayName = values.accountName } else if (values.accountType === 'bank') { withdrawData.bankCard = values.account withdrawData.bankAccount = values.accountName withdrawData.bankName = values.bankName || '银行卡' } await addShopDealerWithdraw(withdrawData) Taro.showToast({ title: '提现申请已提交', icon: 'success' }) // 重置表单 formRef.current?.resetFields() setSelectedAccount('') // 刷新数据 await handleRefresh() // 切换到提现记录页面 setActiveTab('1') } catch (error: any) { console.error('提现申请失败:', error) Taro.showToast({ title: error.message || '提现申请失败', icon: 'error' }) } finally { setSubmitting(false) } } const quickAmounts = ['100', '300', '500', '1000'] const setQuickAmount = (amount: string) => { formRef.current?.setFieldsValue({ amount }) } const setAllAmount = () => { formRef.current?.setFieldsValue({ amount: availableAmount.replace(',', '') }) } const renderWithdrawForm = () => ( {/* 余额卡片 */} {/* 装饰背景 - 小程序兼容版本 */} 可提现余额 ¥{availableAmount} 最低提现金额:¥100 | 手续费:免费
{/* 快捷金额 */} 快捷金额 {quickAmounts.map(amount => ( ))} setSelectedAccount}> 微信钱包 支付宝 银行卡 {selectedAccount === 'alipay' && ( <> )} {selectedAccount === 'bank' && ( <> )} {selectedAccount === 'wechat' && ( 微信钱包提现将直接转入您的微信零钱 )}
) const renderWithdrawRecords = () => ( {loading ? ( 加载中... ) : withdrawRecords.length > 0 ? ( withdrawRecords.map(record => ( 提现金额:¥{record.money} 提现账户:{record.accountDisplay} {getStatusText(record.applyStatus)} 申请时间:{record.createTime} {record.auditTime && ( 审核时间:{new Date(record.auditTime).toLocaleString()} )} {record.rejectReason && ( 驳回原因:{record.rejectReason} )} )) ) : ( )} ) if (!dealerUser) { return ( 加载中... ) } return ( setActiveTab}> {renderWithdrawForm()} {renderWithdrawRecords()} ) } export default DealerWithdraw