// 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(); } }, }); }, });