feat(M08-A): 接入顾客端选店下单入口
This commit is contained in:
@@ -1,7 +1,32 @@
|
||||
const {
|
||||
request,
|
||||
ensureLogin,
|
||||
cents,
|
||||
clientRequestId,
|
||||
} = require('../../utils/api.js')
|
||||
|
||||
function defaultStartAt() {
|
||||
const date = new Date(Date.now() + 30 * 60 * 1000)
|
||||
date.setSeconds(0, 0)
|
||||
return date
|
||||
}
|
||||
|
||||
function isoMinutesAfter(date, minutes) {
|
||||
return new Date(date.getTime() + minutes * 60 * 1000).toISOString()
|
||||
}
|
||||
|
||||
Page({
|
||||
data: {
|
||||
storeId: '',
|
||||
roomId: '',
|
||||
loading: false,
|
||||
errorMessage: '',
|
||||
successMessage: '',
|
||||
durationMinutes: 120,
|
||||
pricingMode: 'HOURLY',
|
||||
quote: null,
|
||||
order: null,
|
||||
payment: null,
|
||||
},
|
||||
onLoad(options) {
|
||||
this.setData({
|
||||
@@ -9,4 +34,104 @@ Page({
|
||||
roomId: options.roomId || '',
|
||||
})
|
||||
},
|
||||
|
||||
setDuration(event) {
|
||||
this.setData({
|
||||
durationMinutes: Number(event.currentTarget.dataset.minutes),
|
||||
quote: null,
|
||||
order: null,
|
||||
payment: null,
|
||||
errorMessage: '',
|
||||
successMessage: '',
|
||||
})
|
||||
},
|
||||
|
||||
async quote() {
|
||||
await this.withRequest(async () => {
|
||||
const payload = this.pricingPayload()
|
||||
const response = await request('/pricing/quote', { method: 'POST', data: payload })
|
||||
this.setData({
|
||||
quote: {
|
||||
...response.data,
|
||||
totalText: cents(response.data.totalCents),
|
||||
depositText: cents(response.data.depositCents),
|
||||
},
|
||||
successMessage: '报价已生成',
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
async reserve() {
|
||||
await this.withRequest(async () => {
|
||||
const payload = this.pricingPayload()
|
||||
const response = await request('/orders/reserve', { method: 'POST', data: payload })
|
||||
this.setData({
|
||||
order: response.data,
|
||||
successMessage: '时段已预占,请继续支付',
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
async createTestPayment() {
|
||||
if (!this.data.order || !this.data.order.orderId) {
|
||||
this.setData({ errorMessage: '请先预占订单' })
|
||||
return
|
||||
}
|
||||
await this.withRequest(async () => {
|
||||
const response = await request('/payments', {
|
||||
method: 'POST',
|
||||
data: {
|
||||
orderId: this.data.order.orderId,
|
||||
provider: 'TEST',
|
||||
clientRequestId: clientRequestId('miniapp-pay'),
|
||||
},
|
||||
})
|
||||
this.setData({
|
||||
payment: {
|
||||
...response.data,
|
||||
amountText: cents(response.data.amountCents),
|
||||
},
|
||||
successMessage: '测试支付单已创建',
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
async completeTestPayment() {
|
||||
if (!this.data.payment || !this.data.payment.paymentId) {
|
||||
this.setData({ errorMessage: '请先创建测试支付单' })
|
||||
return
|
||||
}
|
||||
await this.withRequest(async () => {
|
||||
await request(`/payments/${encodeURIComponent(this.data.payment.paymentId)}/test-complete`, {
|
||||
method: 'POST',
|
||||
data: {
|
||||
callbackId: clientRequestId('miniapp-callback'),
|
||||
amountCents: this.data.payment.amountCents,
|
||||
},
|
||||
})
|
||||
this.setData({ successMessage: '测试支付已完成,生产环境将切换微信支付' })
|
||||
})
|
||||
},
|
||||
|
||||
pricingPayload() {
|
||||
const start = defaultStartAt()
|
||||
return {
|
||||
roomId: this.data.roomId,
|
||||
startAt: start.toISOString(),
|
||||
endAt: isoMinutesAfter(start, this.data.durationMinutes),
|
||||
pricingMode: this.data.pricingMode,
|
||||
}
|
||||
},
|
||||
|
||||
async withRequest(work) {
|
||||
this.setData({ loading: true, errorMessage: '', successMessage: '' })
|
||||
try {
|
||||
await ensureLogin()
|
||||
await work()
|
||||
} catch (error) {
|
||||
this.setData({ errorMessage: error.message || '操作失败' })
|
||||
} finally {
|
||||
this.setData({ loading: false })
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user