const { request } = require('../../utils_new/request'); const util = require('../../utils/util'); Page({ data: { statusBarHeight: 20, navBarHeight: 44, totalNavHeight: 64, defaultAvatar: 'https://images.unsplash.com/photo-1534528741775-53994a69daeb?w=500&auto=format&fit=crop&q=60', loading: true, stats: { todayReferrals: 0, totalReferrals: 0, totalContribution: '0.00' }, cardTitle: '守护会员', list: [] }, onLoad() { const sys = wx.getSystemInfoSync(); const menu = wx.getMenuButtonBoundingClientRect(); const statusBarHeight = sys.statusBarHeight || 20; const navBarHeight = menu.height + (menu.top - statusBarHeight) * 2; this.setData({ statusBarHeight, navBarHeight, totalNavHeight: statusBarHeight + navBarHeight }); this.load(); }, onBack() { wx.navigateBack({ delta: 1 }); }, async load() { this.setData({ loading: true }); try { try { const statsRes = await request({ url: '/api/commission?action=stats', method: 'GET' }); const statsBody = statsRes.data || {}; let currentRoleText = '守护会员'; // 默认 // 尝试从本地存储获取当前用户信息来判断角色 try { const userStr = wx.getStorageSync('user'); if (userStr) { const user = JSON.parse(userStr); // 优先使用 distributorRole,其次 userRole,再次 vip_level const role = user.distributorRole || user.userRole; const roleMap = { 'soulmate': '心伴会员', 'guardian': '守护会员', 'companion': '陪伴会员', 'listener': '倾听会员', 'partner': '城市合伙人' }; if (role && roleMap[role]) { currentRoleText = roleMap[role]; } else if (user.isDistributor) { // 如果是分销商但没有明确role,可能是早期数据,根据cardType判断 // 但这里更直接用API返回的 } } } catch (e) { console.error('解析用户信息失败', e); } if (statsBody.success) { const d = statsBody.data || {}; // 如果API返回了明确的等级名称或类型,优先使用API的 if (d.cardType || d.level) { currentRoleText = this.getCardTitle(d.cardType || d.level); } this.setData({ stats: { todayReferrals: Number(d.todayReferrals || d.today_referrals || 0), // 团队总人数:优先使用 teamMembers (新字段),兼容 totalReferrals totalReferrals: Number(d.teamMembers || d.team_members || d.totalReferrals || d.total_referrals || 0), // 直推人数:优先使用 directReferrals (新字段) directReferrals: Number(d.directReferrals || d.direct_referrals || 0), totalContribution: Number(d.totalContribution || d.total_contribution || 0).toFixed(2) }, cardTitle: currentRoleText, isSoulmate: currentRoleText === '心伴会员' // 判断是否为心伴会员 }); } else { // API不成功,使用本地推断的角色 this.setData({ cardTitle: currentRoleText, isSoulmate: currentRoleText === '心伴会员' }); } const res = await request({ url: '/api/commission?action=referrals&page=1&pageSize=50', method: 'GET' }); const body = res.data || {}; console.log('[团队页面] API响应:', JSON.stringify(body, null, 2)); // Flexible data extraction let rawList = []; let totalDirects = 0; // Initialize total count if (Array.isArray(body.data)) { rawList = body.data; totalDirects = rawList.length; } else if (body.data && Array.isArray(body.data.list)) { rawList = body.data.list; totalDirects = body.data.total || rawList.length; // Use total from API if available } else if (body.list && Array.isArray(body.list)) { rawList = body.list; totalDirects = body.total || rawList.length; } console.log('[团队页面] rawList:', JSON.stringify(rawList.slice(0, 2), null, 2)); const roleMap = { 'soulmate': '心伴会员', 'guardian': '守护会员', 'companion': '陪伴会员', 'listener': '倾听会员', 'partner': '城市合伙人' }; const list = rawList.map((x) => { // ... (mapping logic) ... const user = x.user || {}; // Map fields robustly let avatar = x.avatarUrl || x.avatar_url || x.userAvatar || user.avatarUrl || user.avatar_url || ''; if (avatar) { avatar = util.getFullImageUrl(avatar); } const name = x.userName || x.nickname || x.nickName || user.nickname || user.nickName || ('用户' + (x.userId || x.id || '')); const contribution = Number(x.totalContribution || x.total_contribution || x.amount || 0).toFixed(2); const dateStr = x.boundAt || x.created_at || x.createdAt || Date.now(); // Get Member Level - 优先使用API返回的中文等级名称,其次根据角色映射 const levelText = x.userRoleName || user.userRoleName || roleMap[x.userRole] || roleMap[user.userRole] || roleMap[x.distributorRole] || roleMap[user.distributorRole] || roleMap[x.role] || roleMap[user.role] || '普通用户'; // Determine level class const rawRole = x.userRole || user.userRole || x.distributorRole || user.distributorRole || x.role || user.role || ''; let levelClass = ''; if (rawRole.includes('soulmate')) levelClass = 'tag-soulmate'; else if (rawRole.includes('guardian')) levelClass = 'tag-guardian'; else if (rawRole.includes('companion')) levelClass = 'tag-companion'; else if (rawRole.includes('listener')) levelClass = 'tag-listener'; else if (rawRole.includes('partner')) levelClass = 'tag-partner'; return { ...x, userId: x.userId || x.id, userAvatar: avatar || this.data.defaultAvatar, userName: name, levelText: levelText, levelClass: levelClass, totalContribution: contribution, boundAtText: this.formatDate(new Date(dateStr)) }; }); // 优先使用 stats API 返回的 directReferrals // 如果 stats API 未返回有效值 (<=0),则回退使用列表接口的 total 或长度 const currentStatsDirects = this.data.stats.directReferrals; const finalDirects = (currentStatsDirects && currentStatsDirects > 0) ? currentStatsDirects : totalDirects; this.setData({ list, 'stats.directReferrals': finalDirects }); } catch (err) { console.log('API failed, using mock data', err); this.setData({ stats: { todayReferrals: 2, totalReferrals: 15, totalContribution: '128.50' }, list: [ { userId: 1, userName: '小王', userAvatar: '', boundAtText: '2025-01-20 10:30:45', totalContribution: '12.50' }, { userId: 2, userName: 'Alice', userAvatar: '', boundAtText: '2025-01-18 14:22:30', totalContribution: '30.00' }, { userId: 3, userName: 'Bob', userAvatar: '', boundAtText: '2025-01-15 09:15:00', totalContribution: '5.00' } ] }); } } finally { this.setData({ loading: false }); } }, formatDate(d) { const y = d.getFullYear(); const m = String(d.getMonth() + 1).padStart(2, '0'); const day = String(d.getDate()).padStart(2, '0'); const h = String(d.getHours()).padStart(2, '0'); const min = String(d.getMinutes()).padStart(2, '0'); const s = String(d.getSeconds()).padStart(2, '0'); return `${y}-${m}-${day} ${h}:${min}:${s}`; }, onAvatarError(e) { const index = e.currentTarget.dataset.index; if (index !== undefined) { const list = this.data.list; list[index].userAvatar = this.data.defaultAvatar; this.setData({ list }); } }, getCardTitle(type) { const map = { 'guardian_card': '守护会员', 'companion_card': '陪伴会员', 'soulmate_card': '心伴会员', 'listener_card': '倾听会员', 'guardian': '守护会员', 'companion': '陪伴会员', 'soulmate': '心伴会员', 'listener': '倾听会员', 'identity_card': '身份会员', 'vip': 'VIP会员', 'partner': '城市合伙人' }; return map[type] || type || '守护会员'; } });