import { onMounted, ref } from 'vue'; import { adminHeader } from './AdminHeader.js'; export default { setup() { const orders = ref([]); const stats = ref({ totalOrders: 0, paidOrders: 0, pendingOrders: 0, refundedOrders: 0, revenueUsdCents: 0 }); const total = ref(0); const loading = ref(true); const error = ref(''); const filters = ref({ status: '', provider: '', search: '' }); const load = async () => { loading.value = true; error.value = ''; const params = new URLSearchParams({ page: '1', pageSize: '100' }); Object.entries(filters.value).forEach(([key, value]) => value && params.set(key, value)); try { const [orderResponse, statsResponse] = await Promise.all([ fetch('/admin/api/orders?' + params.toString(), { credentials: 'same-origin' }), fetch('/admin/api/orders/stats', { credentials: 'same-origin' }), ]); if (!orderResponse.ok || !statsResponse.ok) throw new Error('加载订单失败'); const orderPayload = await orderResponse.json(); const statsPayload = await statsResponse.json(); orders.value = orderPayload.data.list || []; total.value = orderPayload.data.total || 0; stats.value = statsPayload.data; } catch (reason) { error.value = reason instanceof Error ? reason.message : '加载订单失败'; } finally { loading.value = false; } }; const money = order => order.currency === 'USD' ? '$' + (order.amount / 100).toFixed(2) : order.providerAmount + ' ' + order.currency; const dateTime = value => value ? new Date(value).toLocaleString('zh-CN', { hour12: false }) : '-'; const statusText = status => ({ pending: '待支付', paid: '已支付', cancelled: '已关闭', refunded: '已退款' }[status] || status); const statusClass = status => ({ paid: 'bg-green-100 text-green-800', pending: 'bg-amber-100 text-amber-800', cancelled: 'bg-gray-100 text-gray-700', refunded: 'bg-blue-100 text-blue-800', }[status] || 'bg-gray-100 text-gray-700'); const providerText = provider => ({ stripe: 'Stripe', binance_pay: 'Binance Pay' }[provider] || provider || '-'); onMounted(load); return { orders, stats, total, loading, error, filters, load, money, dateTime, statusText, statusClass, providerText }; }, template: `
${adminHeader('orders')}

报告订单

{{ stats.totalOrders }}

已支付

{{ stats.paidOrders }}

待支付

{{ stats.pendingOrders }}

已退款

{{ stats.refundedOrders }}

Stripe 收入

\${{ (stats.revenueUsdCents / 100).toFixed(2) }}

PC 八字报告订单

仅显示 PC 商业版八字报告订单,共 {{ total }} 笔

{{ error }}
订单 / 报告客户渠道金额状态渠道交易号时间
正在加载订单...
暂无符合条件的订单
{{ order.orderNo }}{{ order.reportId || '-' }}{{ order.accessCode }} {{ order.customerEmail || '-' }} {{ providerText(order.provider) }} {{ money(order) }} {{ statusText(order.status) }} {{ order.providerTransactionId || order.providerOrderId || '-' }} 创建 {{ dateTime(order.createdAt) }}支付 {{ dateTime(order.payTime) }}
`, };