import { request } from "../../utils/request"; import { appId } from "../../env"; import { receiveRedPacket } from "../../utils/util"; const app = getApp(); const formatDate = (isoString: string): string => { const date = new Date(isoString); const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, "0"); const day = String(date.getDate()).padStart(2, "0"); const hours = String(date.getHours()).padStart(2, "0"); const minutes = String(date.getMinutes()).padStart(2, "0"); return `${year}-${month}-${day} ${hours}:${minutes}`; }; const RED_STATE_MAP: Record = { 10: "未发送", 11: "等待领取", 20: "正在发送", 21: "等待确认", 30: "发送失败", 31: "个数不够", 32: "账户余额不足", 33: "客户未实名", 34: "其它原因", 40: "已领取", 50: "已过期", }; const getStateText = (state: number) => { return RED_STATE_MAP[state] || "发放中"; }; const FAILED_STATES = [30, 31, 32, 33, 34]; const canReceive = (state: number) => { return state === 11 || state === 21 || FAILED_STATES.includes(state); }; const isRetry = (state: number) => { return FAILED_STATES.includes(state); }; Page({ data: { list: [] as any[], loading: false, hasMore: true, current: 1, pageSize: 15, activeTab: 0, tabs: [ { label: '待领取', value: 0, type: 1 }, { label: '已领取', value: 1, type: 2 }, { label: '已过期', value: 2, type: 3 }, ], summary: { totalAmount: '0.00', receivedAmount: '0.00', pendingAmount: '0.00', expiredAmount: '0.00', }, store: {}, safeBottom: app.globalData.safeBottom, safeTop: app.globalData.safeTop, }, async onLoad() { await this.fetchRecords(1, false, this.data.tabs[0].type); }, onReachBottom() { if (this.data.loading || !this.data.hasMore) return; const nextPage = this.data.current + 1; this.fetchRecords(nextPage, true, this.data.tabs[this.data.activeTab].type); }, onTabChange(e: any) { const index = e.detail.index; const tab = this.data.tabs[index]; this.setData({ activeTab: index }); this.fetchRecords(1, false, tab.type); }, async handleReceive(e: any) { const { id, outrewardsid } = e.currentTarget.dataset; const params: Record = { appId: appId, outRewardsId: outrewardsid, openId: wx.getStorageSync("openId"), }; if (outrewardsid) params.outRewardsId = outrewardsid; if (id) params.redId = id; try { await receiveRedPacket( params, '/app/general/receive-red', appId ); // 乐观更新:先立即更新本地数据,避免后端状态同步延迟导致展示不友好 const { list, summary, activeTab, tabs } = this.data; const targetItem = list.find((item: any) => item.id === id); if (targetItem) { const amount = targetItem.amount || 0; const amountYuan = amount / 100; const updatedList = list.map((item: any) => item.id === id ? { ...item, state: 40, stateText: getStateText(40), canReceive: false, isRetry: false } : item ); const updatedSummary = { ...summary, pendingAmount: Math.max(0, parseFloat(summary.pendingAmount) - amountYuan).toFixed(2), receivedAmount: (parseFloat(summary.receivedAmount) + amountYuan).toFixed(2), }; this.setData({ list: updatedList, summary: updatedSummary }); } // 确保后端有足够时间同步,直接刷新 setTimeout(() => { this.fetchRecords(1, false, tabs[activeTab].type); }, 3000); } catch (err) { console.error('领取红包失败:', err); } }, async fetchRecords(page: number, append = false, type: number) { const openId = wx.getStorageSync("openId"); this.setData({ store: app.globalData.store, }); if (!openId) { wx.showToast({ title: "请先登录", icon: "none" }); return; } if (append) { this.setData({ loading: true }); } else { wx.showLoading({ title: "加载中" }); } try { const params: Record = {}; params.openId = openId; params.appId = appId; params.current = page; params.pageSize = 15; params.type = type; const res = await request({ options: { url: "/app/saas/query-red", data: params, }, isLoading: !append, // needLogin: false, }); const records = res.data?.records || res.records || []; const items = records.map((item: any) => ({ ...item, date: formatDate(item.createdTime), stateText: getStateText(item.state), amountText: `${(item.amount / 100).toFixed(2)}`, canReceive: canReceive(item.state), isRetry: isRetry(item.state), })); this.setData({ list: append ? [...this.data.list, ...items] : items, current: page, hasMore: records.length >= this.data.pageSize, }); // 汇总数据在 res.data 根层级,单位是分,转为元 const d = res.data; if (d && d.totalAmount !== undefined) { this.setData({ summary: { totalAmount: (d.totalAmount / 100).toFixed(2), receivedAmount: (d.receivedAmount / 100).toFixed(2), pendingAmount: (d.pendingAmount / 100).toFixed(2), expiredAmount: (d.expiredAmount / 100).toFixed(2), }, }); } } catch (err) { console.error("加载红包记录失败:", err); } finally { if (append) { this.setData({ loading: false }); } else { wx.hideLoading(); } } }, });