125 lines
4.2 KiB
JavaScript
125 lines
4.2 KiB
JavaScript
const { request, ensureLogin, cents } = require('../../utils/api.js')
|
|
|
|
Page({
|
|
data: {
|
|
loading: false,
|
|
submitting: false,
|
|
errorMessage: '',
|
|
storeId: '',
|
|
storeName: '',
|
|
rooms: [],
|
|
roomIndex: 0,
|
|
userId: '',
|
|
startDate: '',
|
|
startTime: '',
|
|
endDate: '',
|
|
endTime: '',
|
|
pricingModes: [
|
|
{ value: 'HOURLY', label: '小时' },
|
|
{ value: 'OVERNIGHT', label: '过夜' },
|
|
{ value: 'FULL_DAY', label: '全天' },
|
|
],
|
|
pricingModeIndex: 0,
|
|
},
|
|
|
|
async onLoad(options) {
|
|
const start = new Date(Date.now() + 60 * 60 * 1000)
|
|
start.setMinutes(0, 0, 0)
|
|
const end = new Date(start.getTime() + 2 * 60 * 60 * 1000)
|
|
this.setData({
|
|
storeId: options.storeId || '',
|
|
storeName: options.storeName ? decodeURIComponent(options.storeName) : '',
|
|
startDate: this.datePart(start),
|
|
startTime: this.timePart(start),
|
|
endDate: this.datePart(end),
|
|
endTime: this.timePart(end),
|
|
})
|
|
await this.loadRooms()
|
|
},
|
|
|
|
async loadRooms() {
|
|
if (!this.data.storeId) {
|
|
this.setData({ errorMessage: '缺少授权门店信息' })
|
|
return
|
|
}
|
|
this.setData({ loading: true, errorMessage: '' })
|
|
try {
|
|
await ensureLogin()
|
|
const response = await request(`/management/stores/${encodeURIComponent(this.data.storeId)}/rooms`)
|
|
const rooms = (response.data || [])
|
|
.filter((room) => room.configurationStatus === 'ENABLED')
|
|
.map((room) => ({
|
|
...room,
|
|
displayName: `${room.name} · ${room.roomNo} · ${cents(room.basePriceCents)}起`,
|
|
}))
|
|
this.setData({ rooms, roomIndex: 0 })
|
|
} catch (error) {
|
|
this.setData({ errorMessage: error.message || '房间加载失败' })
|
|
} finally {
|
|
this.setData({ loading: false })
|
|
}
|
|
},
|
|
|
|
inputUserId(event) { this.setData({ userId: String(event.detail.value || '').trim() }) },
|
|
selectRoom(event) { this.setData({ roomIndex: Number(event.detail.value) }) },
|
|
selectPricingMode(event) { this.setData({ pricingModeIndex: Number(event.detail.value) }) },
|
|
changeStartDate(event) { this.setData({ startDate: event.detail.value }) },
|
|
changeStartTime(event) { this.setData({ startTime: event.detail.value }) },
|
|
changeEndDate(event) { this.setData({ endDate: event.detail.value }) },
|
|
changeEndTime(event) { this.setData({ endTime: event.detail.value }) },
|
|
|
|
async submit() {
|
|
if (this.data.submitting) return
|
|
const room = this.data.rooms[this.data.roomIndex]
|
|
const pricingMode = this.data.pricingModes[this.data.pricingModeIndex]?.value
|
|
const userId = this.data.userId
|
|
if (!/^[1-9]\d{0,19}$/.test(userId)) {
|
|
this.setData({ errorMessage: '请输入有效的会员用户 ID' })
|
|
return
|
|
}
|
|
if (!room) {
|
|
this.setData({ errorMessage: '请选择可用房间' })
|
|
return
|
|
}
|
|
const startAt = new Date(`${this.data.startDate}T${this.data.startTime}:00`)
|
|
const endAt = new Date(`${this.data.endDate}T${this.data.endTime}:00`)
|
|
if (Number.isNaN(startAt.getTime()) || Number.isNaN(endAt.getTime()) || endAt <= startAt) {
|
|
this.setData({ errorMessage: '结束时间必须晚于开始时间' })
|
|
return
|
|
}
|
|
this.setData({ submitting: true, errorMessage: '' })
|
|
try {
|
|
const response = await request('/management/orders/reserve-on-behalf', {
|
|
method: 'POST',
|
|
data: {
|
|
userId,
|
|
roomId: room.id,
|
|
startAt: startAt.toISOString(),
|
|
endAt: endAt.toISOString(),
|
|
pricingMode,
|
|
},
|
|
})
|
|
wx.showModal({
|
|
title: '代下单成功',
|
|
content: `订单 ${response.data?.orderNo || response.data?.orderId || ''} 已创建,价格由服务端计算。`,
|
|
showCancel: false,
|
|
success: () => wx.navigateBack(),
|
|
})
|
|
} catch (error) {
|
|
this.setData({ errorMessage: error.message || '代下单失败' })
|
|
} finally {
|
|
this.setData({ submitting: false })
|
|
}
|
|
},
|
|
|
|
datePart(value) {
|
|
const pad = (part) => String(part).padStart(2, '0')
|
|
return `${value.getFullYear()}-${pad(value.getMonth() + 1)}-${pad(value.getDate())}`
|
|
},
|
|
|
|
timePart(value) {
|
|
const pad = (part) => String(part).padStart(2, '0')
|
|
return `${pad(value.getHours())}:${pad(value.getMinutes())}`
|
|
},
|
|
})
|