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