Files
code-bang/frontend/miniapp/pages/promoter/index/index.js
T
2026-10-14 18:00:26 +08:00

183 lines
5.8 KiB
JavaScript

// pages/promoter/index/index.js
import { fetchPromoterInfo, fetchPromoterOrders, fetchPromoterQrcode } from '../../../services/promoter/fetchPromoter';
import { fetchConfig } from '../../../services/home/home';
import { withPromoter } from '../../../utils/promoter';
const PAGE_SIZE = 10;
Page({
data: {
// 推广概览:enabled 是否开启分佣、soft_ratio_percent 软件订单佣金比例(%)、
// demand_ratio_percent 需求订单佣金比例(%)、invite_count 推广用户数、
// order_count 推广订单数、settled_amount 累计已结算佣金(元)、pending_count 待结算订单数
overview: {},
overviewStatus: 'loading', // 概览加载状态 loading=加载中 success=成功 failed=失败
overviewError: '', // 概览加载失败原因
list: [], // 推广订单列表
page: 1, // 下一次请求的页码
hasMore: true, // 是否还有更多数据
isEmpty: false, // 列表是否为空
loadMoreStatus: 0, // 加载状态 0=空闲 1=加载中 2=没有更多 3=失败
showQrcode: false, // 是否展示推广码弹窗
qrcode: '', // 推广小程序码 data URL
qrcodeLoading: false, // 推广码生成中
saving: false, // 保存推广码中
shareImage: '', // 分享卡片预览图(后台配置 site.promotion_share_image),为空时微信默认截取当前页
},
onLoad() {
this.loadOverview();
this.loadList(true);
this.loadShareImage();
},
async loadShareImage() {
try {
const res = await fetchConfig();
if (res.code === 1 && res.data?.promotion_share_image) {
this.setData({ shareImage: res.data.promotion_share_image });
}
} catch (err) {
console.error('loadShareImage failed:', err);
}
},
async onPullDownRefresh() {
await Promise.all([this.loadOverview(), this.loadList(true)]);
wx.stopPullDownRefresh();
},
onReachBottom() {
if (this.data.hasMore && this.data.loadMoreStatus !== 1) {
this.loadList();
}
},
onShareAppMessage() {
const share = {
title: '代码邦 - 软件商城与定制开发平台',
path: withPromoter('/pages/home/home'),
};
if (this.data.shareImage) {
share.imageUrl = this.data.shareImage;
}
return share;
},
async loadOverview() {
try {
const res = await fetchPromoterInfo();
if (res.code !== 1) {
this.setData({ overviewStatus: 'failed', overviewError: res.msg || '推广信息加载失败' });
return;
}
this.setData({ overview: res.data, overviewStatus: 'success', overviewError: '' });
} catch (err) {
console.error('fetchPromoterInfo failed:', err);
this.setData({ overviewStatus: 'failed', overviewError: '网络异常,请下拉刷新重试' });
}
},
async loadList(fresh = false) {
const page = fresh ? 1 : this.data.page;
this.setData({ loadMoreStatus: 1 });
try {
const res = await fetchPromoterOrders({ page, pageSize: PAGE_SIZE });
if (res.code !== 1) {
this.setData({ loadMoreStatus: 3 });
return;
}
const { data = [], current_page: currentPage, last_page: lastPage } = res.data;
const list = fresh ? data : this.data.list.concat(data);
const hasMore = currentPage < lastPage;
this.setData({
list,
page: currentPage + 1,
hasMore,
isEmpty: list.length === 0,
loadMoreStatus: hasMore ? 0 : 2,
});
} catch (err) {
console.error('fetchPromoterOrders failed:', err);
this.setData({ loadMoreStatus: 3 });
}
},
onRetryLoad() {
this.loadList();
},
async onShowQrcode() {
this.setData({ showQrcode: true });
if (this.data.qrcode || this.data.qrcodeLoading) {
return;
}
this.setData({ qrcodeLoading: true });
try {
const res = await fetchPromoterQrcode({ envVersion: wx.$api.envVersion });
if (res.code !== 1) {
wx.showToast({ title: res.msg || '推广码生成失败', icon: 'none' });
return;
}
this.setData({ qrcode: res.data.qrcode });
} catch (err) {
console.error('fetchPromoterQrcode failed:', err);
wx.showToast({ title: '网络异常,请重试', icon: 'none' });
} finally {
this.setData({ qrcodeLoading: false });
}
},
onQrcodeVisibleChange(e) {
this.setData({ showQrcode: e.detail.visible });
},
onCloseQrcode() {
this.setData({ showQrcode: false });
},
/** 保存推广码到相册:data URL 需先写入本地文件 */
async onSaveQrcode() {
const { qrcode, saving } = this.data;
if (!qrcode || saving) {
return;
}
this.setData({ saving: true });
try {
const [meta, base64] = qrcode.split(',');
const ext = meta.indexOf('png') > -1 ? 'png' : 'jpg';
const filePath = `${wx.env.USER_DATA_PATH}/promoter_qrcode.${ext}`;
wx.getFileSystemManager().writeFileSync(filePath, base64, 'base64');
await this.saveImage(filePath);
wx.showToast({ title: '已保存到相册', icon: 'success' });
} catch (err) {
console.error('saveQrcode failed:', err);
if (err && err.errMsg && err.errMsg.indexOf('auth') > -1) {
this.guideAlbumSetting();
} else if (!(err && err.errMsg && err.errMsg.indexOf('cancel') > -1)) {
wx.showToast({ title: '保存失败,请重试', icon: 'none' });
}
} finally {
this.setData({ saving: false });
}
},
saveImage(filePath) {
return new Promise((resolve, reject) => {
wx.saveImageToPhotosAlbum({ filePath, success: resolve, fail: reject });
});
},
guideAlbumSetting() {
wx.showModal({
title: '提示',
content: '需要授权保存到相册,是否前往设置开启?',
success: (res) => {
if (res.confirm) {
wx.openSetting();
}
},
});
},
});