223 lines
8.6 KiB
JavaScript
223 lines
8.6 KiB
JavaScript
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 || '守护会员';
|
||
}
|
||
});
|
||
|