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

119 lines
3.4 KiB
JavaScript

const api = require('../../utils/api');
Page({
data: {
statusBarHeight: 20,
navBarHeight: 44,
totalNavHeight: 64,
loading: true,
currentTab: 'all', // all, pending, paid, completed
list: []
},
onLoad() {
const sys = wx.getSystemInfoSync();
const menu = wx.getMenuButtonBoundingClientRect();
const statusBarHeight = sys.statusBarHeight || 20;
const navBarHeight = menu.height + (menu.top - statusBarHeight) * 2;
this.setData({
statusBarHeight,
navBarHeight,
totalNavHeight: statusBarHeight + navBarHeight
});
this.load();
},
onBack() {
wx.navigateBack({ delta: 1 });
},
async load(isRefresh = false) {
if (!isRefresh) {
this.setData({ loading: true });
}
try {
// Use payment.getOrders to show the recharge/vip/etc orders
// Pass confirm: 1 on initial load or refresh to ensure status is up to date
const params = { page: 1, pageSize: 50, confirm: 1 };
if (this.data.currentTab !== 'all') {
params.status = this.data.currentTab;
}
const res = await api.payment.getOrders(params);
// Get list from response structure
let orders = [];
if (res.data && Array.isArray(res.data.list)) {
orders = res.data.list;
} else if (res.data && Array.isArray(res.data.orders)) {
orders = res.data.orders;
} else if (Array.isArray(res.data)) {
orders = res.data;
}
const list = orders.map((o) => ({
id: o.id || o.orderNo,
remark: this.formatOrderType(o.orderType || 'order'),
amountText: this.formatAmount(o.amount),
status: this.formatStatus(o.status),
statusClass: `status-${o.status}`,
createdAtText: this.formatDateTime(new Date(o.createdAt || o.created_at || Date.now())),
// visual adjustment: ensure it looks like income/recharge style
transactionType: o.orderType || 'recharge'
}));
this.setData({ list });
} catch (err) {
console.error('API failed', err);
// Fallback empty list
if (!isRefresh) {
this.setData({ list: [] });
}
} finally {
this.setData({ loading: false });
if (isRefresh) {
wx.stopPullDownRefresh();
}
}
},
onPullDownRefresh() {
this.load(true);
},
switchTab(e) {
const tab = e.currentTarget.dataset.tab;
if (tab === this.data.currentTab) return;
this.setData({ currentTab: tab }, () => {
this.load();
});
},
formatOrderType(type) {
const map = {
'recharge': '充值',
'vip': '会员购买',
'agent_purchase': '智能体购买',
'companion_chat': '陪聊服务',
'identity_card': '身份卡'
};
return map[String(type)] || '订单';
},
formatStatus(status) {
const map = {
'pending': '待支付',
'paid': '已支付',
'refunding': '退款中',
'refunded': '已退款',
'cancelled': '已取消',
'completed': '已完成'
};
return map[String(status)] || status;
},
formatDateTime(d) {
const y = d.getFullYear();
const m = String(d.getMonth() + 1).padStart(2, '0');
const day = String(d.getDate()).padStart(2, '0');
const hh = String(d.getHours()).padStart(2, '0');
const mm = String(d.getMinutes()).padStart(2, '0');
return `${y}-${m}-${day} ${hh}:${mm}`;
},
formatAmount(amount) {
const n = Number(amount || 0);
return `¥${n.toFixed(2)}`;
}
});