"use client" import { useState, useEffect } from "react" import { Button } from "@/components/ui/button" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Badge } from "@/components/ui/badge" import { Check, X, Clock, Wallet, History, RefreshCw, AlertCircle, DollarSign } from "lucide-react" interface Withdrawal { id: string userId: string userNickname: string userPhone?: string userAvatar?: string referralCode?: string amount: number status: 'pending' | 'processing' | 'success' | 'failed' wechatOpenid?: string transactionId?: string errorMessage?: string createdAt: string processedAt?: string } interface Stats { total: number pendingCount: number pendingAmount: number successCount: number successAmount: number failedCount: number } export default function WithdrawalsPage() { const [withdrawals, setWithdrawals] = useState([]) const [stats, setStats] = useState({ total: 0, pendingCount: 0, pendingAmount: 0, successCount: 0, successAmount: 0, failedCount: 0 }) const [loading, setLoading] = useState(true) const [filter, setFilter] = useState<'all' | 'pending' | 'success' | 'failed'>('all') const [processing, setProcessing] = useState(null) // 加载提现记录 const loadWithdrawals = async () => { setLoading(true) try { const res = await fetch(`/api/admin/withdrawals?status=${filter}`) const data = await res.json() if (data.success) { setWithdrawals(data.withdrawals || []) setStats(data.stats || {}) } } catch (error) { console.error('Load withdrawals error:', error) } finally { setLoading(false) } } useEffect(() => { loadWithdrawals() }, [filter]) // 批准提现 const handleApprove = async (id: string) => { if (!confirm("确认已完成打款?批准后将更新用户提现记录。")) return setProcessing(id) try { const res = await fetch('/api/admin/withdrawals', { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ id, action: 'approve' }) }) const data = await res.json() if (data.success) { loadWithdrawals() } else { alert('操作失败: ' + data.error) } } catch (error) { alert('操作失败') } finally { setProcessing(null) } } // 拒绝提现 const handleReject = async (id: string) => { const reason = prompt("请输入拒绝原因(将返还用户余额):") if (!reason) return setProcessing(id) try { const res = await fetch('/api/admin/withdrawals', { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ id, action: 'reject', reason }) }) const data = await res.json() if (data.success) { loadWithdrawals() } else { alert('操作失败: ' + data.error) } } catch (error) { alert('操作失败') } finally { setProcessing(null) } } const getStatusBadge = (status: string) => { switch (status) { case 'pending': return 待处理 case 'processing': return 处理中 case 'success': return 已完成 case 'failed': return 已拒绝 default: return {status} } } return (

分账提现管理

管理用户分销收益的提现申请

{/* 分账规则说明 */}

自动分账规则

分销比例:推广者获得订单金额的 90%

结算方式:用户付款后,分销收益自动计入推广者账户

提现方式:用户在小程序端点击提现,系统自动转账到微信零钱

审批流程:待处理的提现需管理员手动确认打款后批准

{/* 统计卡片 */}
{stats.total}
总申请
{stats.pendingCount}
待处理
¥{stats.pendingAmount.toFixed(2)}
{stats.successCount}
已完成
¥{stats.successAmount.toFixed(2)}
{stats.failedCount}
已拒绝
{/* 筛选按钮 */}
{(['all', 'pending', 'success', 'failed'] as const).map((f) => ( ))}
{/* 提现记录表格 */} {loading ? (
加载中...
) : withdrawals.length === 0 ? (

暂无提现记录

) : (
{withdrawals.map((w) => ( ))}
申请时间 用户 金额 状态 处理时间 操作
{new Date(w.createdAt).toLocaleString()}
{w.userNickname?.charAt(0) || "?"}

{w.userNickname}

{w.userPhone || w.userId.slice(0, 10)}

¥{w.amount.toFixed(2)} {getStatusBadge(w.status)} {w.errorMessage && (

{w.errorMessage}

)}
{w.processedAt ? new Date(w.processedAt).toLocaleString() : '-'} {w.status === 'pending' && (
)} {w.status === 'success' && w.transactionId && ( {w.transactionId} )}
)}
) }