Files
qipai/miniapp/pages/manager/order-create.js
T

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