feat(M08-C): 补管理员订单处置与代下单
This commit is contained in:
@@ -0,0 +1,124 @@
|
||||
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())}`
|
||||
},
|
||||
})
|
||||
Reference in New Issue
Block a user