import React, {useState, useEffect, useCallback} from 'react' import {View, Text} from '@tarojs/components' import { Cell, Space, Button, Input, CellGroup, Tabs, Tag, Empty, ActionSheet, Loading, PullToRefresh } from '@nutui/nutui-react-taro' import {Wallet, ArrowRight} 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' import {ShopDealerBank} from "@/api/shop/shopDealerBank/model"; import {listShopDealerBank} from "@/api/shop/shopDealerBank"; import {listCmsWebsiteField} from "@/api/cms/cmsWebsiteField"; interface WithdrawRecordWithDetails extends ShopDealerWithdraw { accountDisplay?: string } const DealerWithdraw: React.FC = () => { const [activeTab, setActiveTab] = useState('0') const [loading, setLoading] = useState(false) const [refreshing, setRefreshing] = useState(false) const [submitting, setSubmitting] = useState(false) const [banks, setBanks] = useState([]) const [bank, setBank] = useState() const [isVisible, setIsVisible] = useState(false) const [availableAmount, setAvailableAmount] = useState('0.00') const [withdrawRecords, setWithdrawRecords] = useState([]) const [withdrawAmount, setWithdrawAmount] = useState('') const [withdrawValue, setWithdrawValue] = useState('') const {dealerUser} = useDealerUser() // Tab 切换处理函数 const handleTabChange = (value: string | number) => { console.log('Tab切换到:', value) setActiveTab(value) // 如果切换到提现记录页面,刷新数据 if (String(value) === '1') { fetchWithdrawRecords().then() } } // 获取可提现余额 const fetchBalance = useCallback(async () => { console.log(dealerUser, 'dealerUser...') try { setAvailableAmount(String(dealerUser?.money || '0.00')) } catch (error) { console.error('获取余额失败:', error) } }, [dealerUser]) // 获取提现记录 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]) function fetchBanks() { listShopDealerBank({}).then(data => { const list = data.map(d => { d.name = d.bankName; d.type = d.bankName; return d; }) setBanks(list.concat({ name: '管理银行卡', type: 'add' })) setBank(data[0]) }) } // 格式化账户显示 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) } const handleSelect = (item: ShopDealerBank) => { if(item.type === 'add'){ return Taro.navigateTo({ url: '/dealer/bank/index' }) } setBank(item) setIsVisible(false) } function fetchCmsField() { listCmsWebsiteField({ name: 'WithdrawValue'}).then(res => { if(res && res.length > 0){ const text = res[0].value; setWithdrawValue(text || '') } }) } // 初始化加载数据 useEffect(() => { if (dealerUser?.userId) { fetchBalance().then() fetchWithdrawRecords().then() fetchBanks() fetchCmsField() } }, [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 () => { if (!dealerUser?.userId) { Taro.showToast({ title: '用户信息获取失败', icon: 'error' }) return } if (!bank) { Taro.showToast({ title: '请选择提现银行卡', icon: 'error' }) return } // 验证提现金额 const amount = parseFloat(withdrawAmount) const availableStr = String(availableAmount || '0') const available = parseFloat(availableStr.replace(/,/g, '')) if (isNaN(amount) || amount <= 0) { Taro.showToast({ title: '请输入有效的提现金额', icon: 'error' }) return } if (amount < 100) { Taro.showToast({ title: '最低提现金额为100元', icon: 'error' }) return } if (amount > available) { Taro.showToast({ title: '提现金额超过可用余额', icon: 'error' }) return } // 验证银行卡信息 if (!bank.bankCard || !bank.bankAccount || !bank.bankName) { Taro.showToast({ title: '银行卡信息不完整', icon: 'error' }) return } try { setSubmitting(true) const withdrawData: ShopDealerWithdraw = { userId: dealerUser.userId, money: withdrawAmount, payType: 30, // 银行卡提现 applyStatus: 10, // 待审核 platform: 'MiniProgram', bankCard: bank.bankCard, bankAccount: bank.bankAccount, bankName: bank.bankName } await addShopDealerWithdraw(withdrawData) Taro.showToast({ title: '提现申请已提交', icon: 'success' }) // 重置表单 setWithdrawAmount('') // 刷新数据 await handleRefresh() // 切换到提现记录页面 setActiveTab('1') } catch (error: any) { console.error('提现申请失败:', error) Taro.showToast({ title: error.message || '提现申请失败', icon: 'error' }) } finally { setSubmitting(false) } } // 格式化金额 const formatMoney = (money?: string) => { if (!money) return '0.00' return parseFloat(money).toFixed(2) } // 计算预计到账金额 const calculateExpectedAmount = (amount: string) => { if (!amount || isNaN(parseFloat(amount))) return '0.00' const withdrawAmount = parseFloat(amount) // 提现费率 16% + 3元 const feeRate = 0.16 const fixedFee = 3 const totalFee = withdrawAmount * feeRate + fixedFee const expectedAmount = withdrawAmount - totalFee return Math.max(0, expectedAmount).toFixed(2) } const renderWithdrawForm = () => ( {/* 余额卡片 */} {/* 装饰背景 - 小程序兼容版本 */} {formatMoney(dealerUser?.money)} 可提现余额 最低提现金额:¥100 setWithdrawAmount(value)} style={{ padding: '0 10px', fontSize: '20px' }} /> } /> setIsVisible(true)} extra={ {bank ? {bank.bankName} : 请选择} }/> ¥{calculateExpectedAmount(withdrawAmount)} }/> 说明:{withdrawValue}}/> ) const renderWithdrawRecords = () => { console.log('渲染提现记录:', {loading, recordsCount: withdrawRecords.length, dealerUserId: dealerUser?.userId}) return ( {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} )} )) ) : ( )} ) } return ( {renderWithdrawForm()} {renderWithdrawRecords()} setIsVisible(false)} /> ) } export default DealerWithdraw