Files
qipai/miniapp/pages/orders/detail.js
T
2026-06-24 21:42:02 +08:00

97 lines
2.8 KiB
JavaScript

const { request, ensureLogin, cents } = require('../../utils/api.js')
Page({
data: {
orderId: '',
loading: false,
errorMessage: '',
successMessage: '',
order: null,
history: [],
cancellation: null,
},
onLoad(options) {
this.setData({ orderId: options.orderId || '' })
if (options.orderId) this.loadOrder(options.orderId)
},
async loadOrder(orderId = this.data.orderId) {
const targetOrderId = typeof orderId === 'string' ? orderId : this.data.orderId
this.setData({ loading: true, errorMessage: '', successMessage: '' })
try {
await ensureLogin()
const [orderResponse, historyResponse] = await Promise.all([
request(`/orders/${encodeURIComponent(targetOrderId)}`),
request(`/orders/${encodeURIComponent(targetOrderId)}/history`),
])
this.setData({
order: formatOrder(orderResponse.data),
history: (historyResponse.data || []).map((item) => ({
...item,
createdText: formatTime(item.createdAt),
})),
})
} catch (error) {
this.setData({ errorMessage: error.message || '订单加载失败' })
} finally {
this.setData({ loading: false })
}
},
async loadCancellationQuote() {
if (!this.data.orderId) return
await this.withOrderRequest(async () => {
const response = await request(`/orders/${encodeURIComponent(this.data.orderId)}/cancellation-quote`)
this.setData({
cancellation: {
...response.data,
feeText: cents(response.data.feeCents),
refundableText: cents(response.data.refundableCents),
},
successMessage: '取消测算已更新',
})
})
},
async cancelOrder() {
if (!this.data.orderId) return
await this.withOrderRequest(async () => {
await request(`/orders/${encodeURIComponent(this.data.orderId)}/cancel`, {
method: 'POST',
data: { reason: '用户小程序取消' },
})
this.setData({ successMessage: '订单已提交取消' })
await this.loadOrder(this.data.orderId)
})
},
async withOrderRequest(work) {
this.setData({ loading: true, errorMessage: '', successMessage: '' })
try {
await ensureLogin()
await work()
} catch (error) {
this.setData({ errorMessage: error.message || '订单操作失败' })
} finally {
this.setData({ loading: false })
}
},
})
function formatOrder(order) {
return {
...order,
totalText: cents(order.totalAmountCents),
paidText: cents(order.paidAmountCents),
startText: formatTime(order.startAt),
endText: formatTime(order.endAt),
}
}
function formatTime(value) {
const date = new Date(value)
const pad = (input) => String(input).padStart(2, '0')
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}`
}