216 lines
6.2 KiB
JavaScript
216 lines
6.2 KiB
JavaScript
// pages/zuzhangfenhongjilu/zuzhangfenhongjilu.js
|
|
import request from '../../utils/request.js';
|
|
|
|
const PAGE_SIZE = 5; // 每页数据条数
|
|
const REFRESH_COOLDOWN = 2000; // 刷新冷却时间 (ms)
|
|
|
|
const app = getApp();
|
|
|
|
Page({
|
|
data: {
|
|
// 统计数据
|
|
fenhongZonge: '0.00', // 分红总额
|
|
yaoqingGuanshi: 0, // 邀请管事数
|
|
fenhongCishu: 0, // 分红次数
|
|
|
|
// 列表数据
|
|
jiluList: [], // 分红记录列表
|
|
totalCount: 0, // 总记录数(后端返回)
|
|
currentPage: 1, // 当前页码
|
|
hasMore: true, // 是否还有更多数据
|
|
loading: false, // 首次加载中
|
|
loadingMore: false, // 加载更多中
|
|
refreshDisabled: false, // 刷新按钮是否冷却
|
|
|
|
// 错误状态
|
|
errorMsg: '', // 错误提示信息
|
|
},
|
|
|
|
onLoad() {
|
|
this.loadFirstPage();
|
|
},
|
|
|
|
onShow() {
|
|
this.registerNotification();
|
|
},
|
|
|
|
// 注册全局通知组件
|
|
registerNotification() {
|
|
const notificationComp = this.selectComponent('#global-notification');
|
|
if (notificationComp && notificationComp.showNotification) {
|
|
app.globalData.globalNotification = {
|
|
show: (data) => notificationComp.showNotification(data),
|
|
hide: () => notificationComp.hideNotification()
|
|
};
|
|
}
|
|
},
|
|
|
|
// 加载第一页数据
|
|
loadFirstPage() {
|
|
this.setData({
|
|
currentPage: 1,
|
|
hasMore: true,
|
|
jiluList: [],
|
|
errorMsg: ''
|
|
});
|
|
this.fetchData(true);
|
|
},
|
|
|
|
// 刷新数据(点击刷新按钮)
|
|
onRefresh() {
|
|
if (this.data.refreshDisabled) {
|
|
wx.showToast({
|
|
title: `请稍后重试`,
|
|
icon: 'none',
|
|
duration: 1000
|
|
});
|
|
return;
|
|
}
|
|
|
|
// 启用冷却
|
|
this.setData({ refreshDisabled: true });
|
|
setTimeout(() => {
|
|
this.setData({ refreshDisabled: false });
|
|
}, REFRESH_COOLDOWN);
|
|
|
|
// 显示刷新动画(让按钮旋转)
|
|
// 执行刷新
|
|
this.loadFirstPage();
|
|
},
|
|
|
|
// 上拉加载更多
|
|
onLoadMore() {
|
|
const { hasMore, loading, loadingMore, currentPage } = this.data;
|
|
if (!hasMore || loading || loadingMore) return;
|
|
|
|
this.setData({ loadingMore: true });
|
|
this.fetchData(false, currentPage + 1);
|
|
},
|
|
|
|
// 核心数据获取方法
|
|
async fetchData(reset = false, page = 1) {
|
|
const url = '/shangpin/zuzhangfenhong'; // 假设后端接口地址
|
|
|
|
if (reset) {
|
|
this.setData({ loading: true, errorMsg: '' });
|
|
}
|
|
|
|
try {
|
|
const res = await request({
|
|
url,
|
|
method: 'POST',
|
|
data: {
|
|
page: page,
|
|
page_size: PAGE_SIZE
|
|
}
|
|
});
|
|
|
|
if (res.data.code === 200) {
|
|
const data = res.data.data || {};
|
|
// 更新统计数据
|
|
this.setData({
|
|
fenhongZonge: data.fenhong_zonge || '0.00',
|
|
yaoqingGuanshi: data.yaoqing_guanshi || 0,
|
|
fenhongCishu: data.fenhong_cishu || 0,
|
|
totalCount: data.total || 0
|
|
});
|
|
|
|
// 处理列表数据(拼接头像)
|
|
const rawList = data.list || [];
|
|
const processedList = this.processList(rawList);
|
|
|
|
if (reset) {
|
|
// 第一页
|
|
this.setData({
|
|
jiluList: processedList,
|
|
currentPage: page,
|
|
hasMore: processedList.length === PAGE_SIZE, // 如果等于页大小,认为可能还有更多
|
|
});
|
|
} else {
|
|
// 加载更多
|
|
const newList = [...this.data.jiluList, ...processedList];
|
|
this.setData({
|
|
jiluList: newList,
|
|
currentPage: page,
|
|
hasMore: processedList.length === PAGE_SIZE,
|
|
});
|
|
}
|
|
|
|
// 如果加载后数据为空且是第一页,可以给出提示
|
|
if (reset && processedList.length === 0) {
|
|
// 空状态已在 wxml 处理
|
|
}
|
|
} else {
|
|
// 业务错误
|
|
this.setData({
|
|
errorMsg: res.data.msg || '数据加载失败'
|
|
});
|
|
this.showNotification('error', res.data.msg || '数据加载失败');
|
|
}
|
|
} catch (err) {
|
|
console.error('获取分红记录失败', err);
|
|
this.setData({
|
|
errorMsg: '网络异常,请检查网络'
|
|
});
|
|
this.showNotification('error', '网络异常');
|
|
} finally {
|
|
if (reset) {
|
|
this.setData({ loading: false });
|
|
} else {
|
|
this.setData({ loadingMore: false });
|
|
}
|
|
}
|
|
},
|
|
|
|
// 处理列表项:拼接头像、格式化金额和时间
|
|
processList(list) {
|
|
const ossUrl = app.globalData.ossImageUrl || '';
|
|
const defaultAvatar = ossUrl + (app.globalData.morentouxiang || 'avatar/default.jpg');
|
|
|
|
return list.map(item => ({
|
|
// 打手信息
|
|
dashouAvatar: this.getFullUrl(item.dashou_avatar, ossUrl, defaultAvatar),
|
|
dashouNicheng: item.dashou_nicheng || '打手',
|
|
dashouYonghuid: item.dashou_yonghuid || '',
|
|
// 管事信息
|
|
guanshiAvatar: this.getFullUrl(item.guanshi_avatar, ossUrl, defaultAvatar),
|
|
guanshiNicheng: item.guanshi_nicheng || '管事',
|
|
guanshiYonghuid: item.guanshi_yonghuid || '',
|
|
// 分红信息
|
|
fenhong: parseFloat(item.fenhong || 0).toFixed(2),
|
|
shijian: this.formatTime(item.create_time)
|
|
}));
|
|
},
|
|
|
|
// 拼接完整图片URL
|
|
getFullUrl(relativePath, ossUrl, defaultUrl) {
|
|
if (!relativePath) return defaultUrl;
|
|
if (relativePath.startsWith('http')) return relativePath;
|
|
const full = ossUrl + (relativePath.startsWith('/') ? relativePath : '/' + relativePath);
|
|
return full || defaultUrl;
|
|
},
|
|
|
|
// 格式化时间(根据实际后端返回调整)
|
|
formatTime(timestamp) {
|
|
if (!timestamp) return '';
|
|
try {
|
|
const date = new Date(timestamp);
|
|
return `${date.getMonth() + 1}月${date.getDate()}日 ${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`;
|
|
} catch {
|
|
return timestamp.substring(0, 10) || '';
|
|
}
|
|
},
|
|
|
|
// 重试加载(当错误提示出现时)
|
|
onRetry() {
|
|
this.loadFirstPage();
|
|
},
|
|
|
|
// 显示通知(可选)
|
|
showNotification(type, msg) {
|
|
const noti = app.globalData.globalNotification;
|
|
if (noti && noti.show) {
|
|
noti.show({ type, message: msg });
|
|
}
|
|
}
|
|
}); |