ai-c/pages/team/team.js

223 lines
8.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
});
} else {
// API不成功使用本地推断的角色
this.setData({ cardTitle: 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 || '守护会员';
}
});