// @ts-nocheck /** * Phase 4 剩余 - 推广系统管理页面 * 推广活动、分销链接、返佣记录、推广统计、排行榜 */ import React, { useState, useEffect, useCallback } from 'react'; import { adminAPI } from '@/api'; // ==================== 类型定义 ==================== interface Promotion { id: number; title: string; description: string; reward_type: string; reward_value: number; min_payout: number; start_date: string; end_date: string; status: string; max_referrals: number; coupon_id: string; created_by: number; creator_name: string; created_at: string; updated_at: string; link_count: number; total_rewards: number; } interface ReferralLink { id: number; code: string; user_id: number; username: string; promotion_id: number; promotion_title: string; target_url: string; channel: string; qr_code_url: string; total_clicks: number; total_registrations: number; total_conversions: number; status: string; created_at: string; } interface ReferralReward { id: number; referral_code: string; referrer_name: string; referee_name: string; order_id: string; reward_type: string; reward_amount: number; reward_points: number; status: string; payout_method: string; paid_at: string; created_at: string; } interface PromotionStats { total_promotions: number; active_promotions: number; total_referral_links: number; active_referral_links: number; rewards_by_status: Record; total_clicks: number; total_registrations: number; total_conversions: number; total_revenue: number; total_rewards_paid: number; } // ==================== 主组件 ==================== const Promotion: React.FC = () => { const [activeTab, setActiveTab] = useState('overview'); const [loading, setLoading] = useState(false); const [error, setError] = useState(''); // 数据 const [stats, setStats] = useState(null); const [promotions, setPromotions] = useState([]); const [referralLinks, setReferralLinks] = useState([]); const [rewards, setRewards] = useState([]); const [leaderboard, setLeaderboard] = useState([]); // 分页 const [promoPage, setPromoPage] = useState(1); const [linkPage, setLinkPage] = useState(1); const [rewardPage, setRewardPage] = useState(1); const [totalPromos, setTotalPromos] = useState(0); const [totalLinks, setTotalLinks] = useState(0); const [totalRewards, setTotalRewards] = useState(0); // 弹窗 const [showPromoModal, setShowPromoModal] = useState(false); const [showLinkModal, setShowLinkModal] = useState(false); const [editingPromo, setEditingPromo] = useState(null); // 加载概览数据 const loadStats = useCallback(async () => { try { const res = await adminAPI.getPromotionStats(); if (res.data) { setStats(res.data); } } catch (err: any) { console.error('Failed to load stats:', err); } }, []); // 加载推广活动 const loadPromotions = useCallback(async (page: number) => { setLoading(true); try { const res = await adminAPI.getPromotions({ page, page_size: 20 }); if (res.data) { setPromotions(res.data.items); setTotalPromos(res.data.total); setPromoPage(page); } } catch (err: any) { setError(err.message || '加载失败'); } finally { setLoading(false); } }, []); // 加载分销链接 const loadLinks = useCallback(async (page: number) => { setLoading(true); try { const res = await adminAPI.getReferralLinks({ page, page_size: 20 }); if (res.data) { setReferralLinks(res.data.items); setTotalLinks(res.data.total); setLinkPage(page); } } catch (err: any) { setError(err.message || '加载失败'); } finally { setLoading(false); } }, []); // 加载返佣记录 const loadRewards = useCallback(async (page: number) => { setLoading(true); try { const res = await adminAPI.getReferralRewards({ page, page_size: 20 }); if (res.data) { setRewards(res.data.items); setTotalRewards(res.data.total); setRewardPage(page); } } catch (err: any) { setError(err.message || '加载失败'); } finally { setLoading(false); } }, []); // 加载排行榜 const loadLeaderboard = useCallback(async () => { try { const res = await adminAPI.getPromotionLeaderboard({ limit: 50 }); if (res.data) { setLeaderboard(res.data.items || res.data.leaderboard || []); } } catch (err: any) { console.error('Failed to load leaderboard:', err); } }, []); useEffect(() => { loadStats(); }, [loadStats]); useEffect(() => { if (activeTab === 'promotions') { loadPromotions(1); } else if (activeTab === 'links') { loadLinks(1); } else if (activeTab === 'rewards') { loadRewards(1); } else if (activeTab === 'leaderboard') { loadLeaderboard(); } }, [activeTab, loadPromotions, loadLinks, loadRewards, loadLeaderboard]); // 创建/更新推广活动 const handleSavePromo = async (formData: any) => { setLoading(true); try { if (editingPromo) { await adminAPI.updatePromotion(editingPromo.id, formData); } else { await adminAPI.createPromotion(formData); } setShowPromoModal(false); setEditingPromo(null); loadPromotions(promoPage); loadStats(); } catch (err: any) { setError(err.message || '保存失败'); } finally { setLoading(false); } }; // 切换活动状态 const handleTogglePromo = async (id: number) => { try { await adminAPI.togglePromotion(id); loadPromotions(promoPage); } catch (err: any) { setError(err.message || '操作失败'); } }; // 删除活动 const handleDeletePromo = async (id: number) => { if (!window.confirm('确定删除此推广活动?')) return; try { await adminAPI.deletePromotion(id); loadPromotions(promoPage); loadStats(); } catch (err: any) { setError(err.message || '删除失败'); } }; // 生成分销链接 const handleGenerateLink = async (formData: any) => { setLoading(true); try { await adminAPI.generateReferralLink(formData); setShowLinkModal(false); loadLinks(linkPage); loadStats(); } catch (err: any) { setError(err.message || '生成失败'); } finally { setLoading(false); } }; // 审核返佣 const handleApproveReward = async (id: number) => { try { await adminAPI.approveReward(id); loadRewards(rewardPage); } catch (err: any) { setError(err.message || '操作失败'); } }; // 标记已打款 const handleMarkPaid = async (id: number) => { const payout_method = prompt('请输入提现方式(wechat/alipay/bank/balance):'); const payout_account = prompt('请输入提现账号:'); if (!payout_method || !payout_account) return; try { await adminAPI.markRewardPaid(id, { payout_method, payout_account, payout_transaction_id: `TXN${Date.now()}` }); loadRewards(rewardPage); } catch (err: any) { setError(err.message || '操作失败'); } }; // ==================== 渲染 ==================== const renderOverview = () => { if (!stats) return
加载中...
; // 计算返佣状态分布条的宽度 const totalRewardsCount = Object.values(stats.rewards_by_status || {}).reduce((a: number, b: any) => a + (b.count || 0), 0) || 1; const statusBars = Object.entries(stats.rewards_by_status || {}).map(([status, data]: [string, any]) => ({ status, data, width: Math.min(100, ((data.count || 0) / totalRewardsCount) * 100) })); return (
📢
{stats.total_promotions}
推广活动总数
✅
{stats.active_promotions}
进行中的活动
🔗
{stats.total_referral_links}
分销链接总数
👥
{stats.total_registrations || 0}
总注册数
💰
¥{(stats.total_revenue || 0).toFixed(2)}
产生收入
💸
¥{(stats.total_rewards_paid || 0).toFixed(2)}
已发返佣
{/* 返佣状态分布 */} {statusBars.length > 0 && (

返佣状态分布

{statusBars.map(bar => (
{bar.status === 'pending' ? '待审核' : bar.status === 'approved' ? '已通过' : bar.status === 'paid' ? '已打款' : '已取消'}
{bar.data.count} 笔 (¥{bar.data.total.toFixed(2)})
))}
)}
); }; const renderPromotions = () => (

推广活动列表

{error &&
{error}
} {promotions.map(promo => ( ))}
ID 活动标题 返佣类型 返佣值 状态 链接数 已发返佣 创建时间 操作
{promo.id}
{promo.title}
{promo.description &&
{promo.description}
}
{promo.reward_type === 'percentage' ? '百分比' : promo.reward_type === 'fixed' ? '固定金额' : '积分'} {promo.reward_type === 'percentage' ? `${promo.reward_value}%` : promo.reward_type === 'fixed' ? `¥${promo.reward_value.toFixed(2)}` : `${promo.reward_value} 分`} {promo.status === 'active' ? '进行中' : promo.status === 'inactive' ? '已停用' : '已过期'} {promo.link_count || 0} ¥{(promo.total_rewards || 0).toFixed(2)} {new Date(promo.created_at).toLocaleDateString()}
{/* 分页 */}
第 {promoPage} 页 / 共 {Math.ceil(totalPromos / 20)} 页
); const renderLinks = () => (

分销链接列表

{referralLinks.map(link => ( ))}
ID 推广短码 推广人 关联活动 点击数 注册数 转化数 状态 创建时间 操作
{link.id} {link.code} {link.username} {link.promotion_title || '-'} {link.total_clicks || 0} {link.total_registrations || 0} {link.total_conversions || 0} {link.status === 'active' ? '活跃' : '停用'} {new Date(link.created_at).toLocaleDateString()}
); const renderRewards = () => (

返佣记录

{rewards.map(reward => ( ))}
ID 推广码 推广人 被推荐人 订单号 返佣类型 返佣金额 状态 打款时间 操作
{reward.id} {reward.referral_code} {reward.referrer_name} {reward.referee_name} {reward.order_id || '-'} {reward.reward_type === 'registration' ? '注册奖励' : reward.reward_type === 'first_purchase' ? '首购返佣' : '续费返佣'} ¥{reward.reward_amount.toFixed(2)} {reward.status === 'pending' ? '待审核' : reward.status === 'approved' ? '已通过' : reward.status === 'paid' ? '已打款' : '已取消'} {reward.paid_at ? new Date(reward.paid_at).toLocaleDateString() : '-'}
{reward.status === 'pending' && ( )} {reward.status === 'approved' && ( )}
); const renderLeaderboard = () => (

推广排行榜

{leaderboard.map((entry, index) => ( ))}
排名 用户 点击数 注册数 转化数 产生收入 获得返佣
{index === 0 ? '🥇' : index === 1 ? '🥈' : index === 2 ? '🥉' : entry.rank} {entry.username} {entry.total_clicks || 0} {entry.total_registrations || 0} {entry.total_conversions || 0} ¥{(entry.total_revenue || 0).toFixed(2)} ¥{(entry.total_rewards || 0).toFixed(2)}
); return (

📢 推广系统管理

管理推广活动、分销链接、返佣记录和推广统计

{error &&
{error}
}
{activeTab === 'overview' && renderOverview()} {activeTab === 'promotions' && renderPromotions()} {activeTab === 'links' && renderLinks()} {activeTab === 'rewards' && renderRewards()} {activeTab === 'leaderboard' && renderLeaderboard()}
{/* 推广活动弹窗 */} {showPromoModal && ( { setShowPromoModal(false); setEditingPromo(null); }} /> )} {/* 生成链接弹窗 */} {showLinkModal && ( setShowLinkModal(false)} /> )}
); }; // ==================== 推广活动弹窗 ==================== interface PromotionModalProps { promotion: Promotion | null; onSave: (data: any) => void; onCancel: () => void; } const PromotionModal: React.FC = ({ promotion, onSave, onCancel }) => { const [formData, setFormData] = useState({ title: promotion?.title || '', description: promotion?.description || '', reward_type: promotion?.reward_type || 'percentage', reward_value: promotion?.reward_value || 5, min_payout: promotion?.min_payout || 10, start_date: promotion?.start_date ? promotion.start_date.slice(0, 16) : '', end_date: promotion?.end_date ? promotion.end_date.slice(0, 16) : '', max_referrals: promotion?.max_referrals || 0, status: promotion?.status || 'active' }); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); onSave(formData); }; return (

{promotion ? '编辑推广活动' : '创建推广活动'}

setFormData({ ...formData, title: e.target.value })} placeholder="例如:新用户推广计划" />