215 lines
6.0 KiB
JavaScript
215 lines
6.0 KiB
JavaScript
const api = require('../../utils/api')
|
||
const util = require('../../utils/util')
|
||
|
||
Page({
|
||
data: {
|
||
statusBarHeight: 20,
|
||
navHeight: 64,
|
||
loading: false,
|
||
list: [],
|
||
page: 1,
|
||
pageSize: 20,
|
||
hasMore: true,
|
||
individualPerformance: '0',
|
||
teamTotalPerformance: '0',
|
||
pendingAmount: '210.00',
|
||
levelName: '',
|
||
defaultAvatar: 'https://images.unsplash.com/photo-1534528741775-53994a69daeb?w=500&auto=format&fit=crop&q=60',
|
||
currentTab: 'individual' // 'individual' | 'team'
|
||
},
|
||
|
||
onLoad() {
|
||
console.log('[Performance] Page onLoad');
|
||
this.loadStats()
|
||
this.loadRecords()
|
||
},
|
||
|
||
onShow() {
|
||
// 隐藏系统默认 TabBar
|
||
wx.hideTabBar({ animation: false });
|
||
},
|
||
|
||
onPullDownRefresh() {
|
||
this.setData({
|
||
page: 1,
|
||
hasMore: true,
|
||
list: []
|
||
}, () => {
|
||
Promise.all([
|
||
this.loadStats(),
|
||
this.loadRecords()
|
||
]).then(() => {
|
||
wx.stopPullDownRefresh()
|
||
})
|
||
})
|
||
},
|
||
|
||
onReachBottom() {
|
||
if (this.data.loading || !this.data.hasMore) return
|
||
this.setData({
|
||
page: this.data.page + 1
|
||
}, () => {
|
||
this.loadRecords()
|
||
})
|
||
},
|
||
|
||
async loadStats() {
|
||
try {
|
||
console.log('[Performance] Loading stats...');
|
||
const res = await api.commission.getStats()
|
||
console.log('[Performance] Stats response:', res);
|
||
if (res.success && res.data) {
|
||
const data = res.data
|
||
// Mapping levels
|
||
const roleMap = {
|
||
'soulmate': '心伴会员',
|
||
'guardian': '守护会员',
|
||
'companion': '陪伴会员',
|
||
'listener': '倾听会员',
|
||
'partner': '城市合伙人'
|
||
};
|
||
|
||
const individual = Number(data.individualPerformance || data.individual_performance || 0);
|
||
const team = Number(data.teamTotalPerformance || data.team_total_performance || 0);
|
||
|
||
this.setData({
|
||
individualPerformance: this.formatAmount(individual),
|
||
teamTotalPerformance: this.formatAmount(individual + team), // 总业绩 = 个人 + 团队
|
||
pendingAmount: Number(data.pendingAmount || data.pending_amount || 0).toFixed(2),
|
||
totalCommission: Number(data.totalCommission || data.total_commission || 0).toFixed(2),
|
||
levelName: roleMap[data.distributorRole || data.role] || data.distributorRoleName || '分销会员',
|
||
isSoulmate: (data.distributorRole || data.role) === 'soulmate'
|
||
})
|
||
}
|
||
} catch (err) {
|
||
console.error('加载统计失败', err)
|
||
}
|
||
},
|
||
|
||
/**
|
||
* 格式化金额,超过一万显示为“x.x万”
|
||
* @param {number|string} val
|
||
*/
|
||
formatAmount(val) {
|
||
const num = Number(val || 0);
|
||
if (num >= 10000) {
|
||
return (num / 10000).toFixed(1) + '万';
|
||
}
|
||
return num.toFixed(2);
|
||
},
|
||
|
||
async loadRecords() {
|
||
if (this.data.loading) return
|
||
this.setData({ loading: true })
|
||
|
||
try {
|
||
console.log('[Performance] Loading records...', { page: this.data.page, scope: this.data.currentTab });
|
||
const res = await api.commission.getRecords({
|
||
page: this.data.page,
|
||
limit: this.data.pageSize,
|
||
scope: this.data.currentTab // Suggesting this parameter to backend
|
||
})
|
||
console.log('[Performance] Records response:', res);
|
||
|
||
if (res.success && res.data) {
|
||
const records = (res.data.list || res.data || []).map(record => this.transformRecord(record))
|
||
|
||
this.setData({
|
||
list: this.data.page === 1 ? records : [...this.data.list, ...records],
|
||
hasMore: records.length === this.data.pageSize
|
||
})
|
||
}
|
||
} catch (err) {
|
||
console.error('加载记录失败', err)
|
||
wx.showToast({
|
||
title: '加载失败',
|
||
icon: 'none'
|
||
})
|
||
} finally {
|
||
this.setData({ loading: false })
|
||
}
|
||
},
|
||
|
||
switchTab(e) {
|
||
const tab = e.currentTarget.dataset.tab
|
||
if (tab === this.data.currentTab) return
|
||
|
||
this.setData({
|
||
currentTab: tab,
|
||
page: 1,
|
||
list: [],
|
||
hasMore: true
|
||
}, () => {
|
||
this.loadRecords()
|
||
})
|
||
},
|
||
|
||
transformRecord(record) {
|
||
const dateObj = new Date(record.created_at || record.createdAt)
|
||
const fmtTime = util.formatTime(dateObj)
|
||
|
||
let avatar = record.fromUserAvatar || record.userAvatar || record.avatar || '';
|
||
if (avatar) {
|
||
avatar = util.getFullImageUrl(avatar);
|
||
}
|
||
|
||
const roleMap = {
|
||
'soulmate': '心伴会员',
|
||
'guardian': '守护会员',
|
||
'companion': '陪伴会员',
|
||
'listener': '倾听会员',
|
||
'partner': '城市合伙人'
|
||
};
|
||
|
||
// 优先使用API返回的中文等级名称
|
||
const userLevel = record.fromUserRoleName || record.userRoleName || roleMap[record.fromUserRole] || roleMap[record.userRole] || record.levelText || '普通用户';
|
||
|
||
return {
|
||
id: record.id,
|
||
orderNo: record.orderNo || record.order_no || record.id || '---',
|
||
userName: record.fromUserName || record.userName || '匿名用户',
|
||
userAvatar: avatar || this.data.defaultAvatar,
|
||
productName: this.getOrderTypeText(record.orderType || record.type),
|
||
userLevel: userLevel,
|
||
orderAmount: record.orderAmount ? Number(record.orderAmount).toFixed(2) : (record.amount ? Number(record.amount).toFixed(2) : '0.00'),
|
||
time: fmtTime
|
||
}
|
||
},
|
||
|
||
onAvatarError(e) {
|
||
const index = e.currentTarget.dataset.index;
|
||
if (index !== undefined) {
|
||
const list = this.data.list;
|
||
list[index].userAvatar = '/images/default-avatar.svg';
|
||
this.setData({ list });
|
||
}
|
||
},
|
||
|
||
getOrderTypeText(type) {
|
||
const map = {
|
||
'recharge': '充值',
|
||
'vip': 'VIP会员',
|
||
'identity_card': '身份卡',
|
||
'agent_purchase': '智能体购买',
|
||
'companion_chat': '陪聊'
|
||
}
|
||
return map[type] || '推广订单'
|
||
},
|
||
|
||
goTeam() {
|
||
wx.navigateTo({
|
||
url: '/pages/team/team'
|
||
})
|
||
},
|
||
|
||
onBack() {
|
||
wx.navigateBack({
|
||
delta: 1,
|
||
fail: (err) => {
|
||
console.error('[Performance] Back failed, navigating to profile', err);
|
||
wx.switchTab({ url: '/pages/profile/profile' });
|
||
}
|
||
});
|
||
}
|
||
})
|