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())}` }