import React, { useState, useEffect, useCallback } from 'react' import { View, Text } from '@tarojs/components' import { Empty, Tabs, Avatar, Tag, Progress, Loading, PullToRefresh } from '@nutui/nutui-react-taro' import { User, Star, StarFill } from '@nutui/icons-react-taro' import Taro from '@tarojs/taro' import { useDealerUser } from '@/hooks/useDealerUser' import { listShopDealerReferee } from '@/api/shop/shopDealerReferee' import { pageShopDealerOrder } from '@/api/shop/shopDealerOrder' import type { ShopDealerReferee } from '@/api/shop/shopDealerReferee/model' interface TeamMemberWithStats extends ShopDealerReferee { name?: string avatar?: string orderCount?: number commission?: string status?: 'active' | 'inactive' subMembers?: number joinTime?: string } const DealerTeam: React.FC = () => { const [activeTab, setActiveTab] = useState('0') const [loading, setLoading] = useState(false) const [refreshing, setRefreshing] = useState(false) const [teamMembers, setTeamMembers] = useState([]) const [teamStats, setTeamStats] = useState({ total: 0, firstLevel: 0, secondLevel: 0, thirdLevel: 0, monthlyCommission: '0.00' }) const { dealerUser } = useDealerUser() // 获取团队数据 const fetchTeamData = useCallback(async () => { if (!dealerUser?.userId) return try { setLoading(true) // 获取团队成员关系 const refereeResult = await listShopDealerReferee({ dealerId: dealerUser.userId }) if (refereeResult) { // 处理团队成员数据 const processedMembers: TeamMemberWithStats[] = refereeResult.map(member => ({ ...member, name: `用户${member.userId}`, avatar: '', orderCount: 0, commission: '0.00', status: 'active' as const, subMembers: 0, joinTime: member.createTime })) // 并行获取每个成员的订单统计 const memberStats = await Promise.all( processedMembers.map(async (member) => { try { const orderResult = await pageShopDealerOrder({ page: 1, limit: 100, userId: member.userId }) if (orderResult?.list) { const orders = orderResult.list const orderCount = orders.length const commission = orders.reduce((sum, order) => { const levelCommission = member.level === 1 ? order.firstMoney : member.level === 2 ? order.secondMoney : order.thirdMoney return sum + parseFloat(levelCommission || '0') }, 0).toFixed(2) // 判断活跃状态(30天内有订单为活跃) const thirtyDaysAgo = new Date() thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30) const hasRecentOrder = orders.some(order => new Date(order.createTime || '') > thirtyDaysAgo ) return { ...member, orderCount, commission, status: hasRecentOrder ? 'active' as const : 'inactive' as const } } return member } catch (error) { console.error(`获取成员${member.userId}订单失败:`, error) return member } }) ) setTeamMembers(memberStats) // 计算统计数据 const stats = { total: memberStats.length, firstLevel: memberStats.filter(m => m.level === 1).length, secondLevel: memberStats.filter(m => m.level === 2).length, thirdLevel: memberStats.filter(m => m.level === 3).length, monthlyCommission: memberStats.reduce((sum, member) => sum + parseFloat(member.commission || '0'), 0 ).toFixed(2) } setTeamStats(stats) } } catch (error) { console.error('获取团队数据失败:', error) Taro.showToast({ title: '获取团队数据失败', icon: 'error' }) } finally { setLoading(false) } }, [dealerUser?.userId]) // 刷新数据 const handleRefresh = async () => { setRefreshing(true) await fetchTeamData() setRefreshing(false) } // 初始化加载数据 useEffect(() => { if (dealerUser?.userId) { fetchTeamData().then() } }, [fetchTeamData]) const getLevelColor = (level: number) => { switch (level) { case 1: return '#f59e0b' case 2: return '#8b5cf6' case 3: return '#ec4899' default: return '#6b7280' } } const getLevelIcon = (level: number) => { switch (level) { case 1: return case 2: return case 3: return default: return } } const renderMemberItem = (member: TeamMemberWithStats) => ( } className="mr-3" /> {member.name} {getLevelIcon(Number(member.level))} {member.level}级 加入时间:{member.joinTime} {member.status === 'active' ? '活跃' : '沉默'} {member.orderCount} 订单数 ¥{member.commission} 贡献佣金 {member.subMembers} 团队成员 ) const renderOverview = () => ( {/* 团队统计卡片 */} {/* 装饰背景 - 小程序兼容版本 */} 团队总览 {teamStats.total} 团队总人数 ¥{teamStats.monthlyCommission} 本月团队佣金 {/* 层级分布 */} 层级分布 一级成员 {teamStats.firstLevel} 二级成员 {teamStats.secondLevel} 三级成员 {teamStats.thirdLevel} {/* 最新成员 */} 最新成员 {teamMembers.slice(0, 3).map(renderMemberItem)} ) const renderMemberList = (level?: number) => ( {loading ? ( 加载中... ) : teamMembers .filter(member => !level || member.level === level) .length > 0 ? ( teamMembers .filter(member => !level || member.level === level) .map(renderMemberItem) ) : ( )} ) if (!dealerUser) { return ( 加载中... ) } return ( setActiveTab}> {renderOverview()} {renderMemberList(1)} {renderMemberList(2)} {renderMemberList(3)} ) } export default DealerTeam