ai-c/pages/performance/performance.js
2026-02-02 18:21:32 +08:00

215 lines
6.0 KiB
JavaScript
Raw Permalink 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 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' });
}
});
}
})