162 lines
5.7 KiB
JavaScript
162 lines
5.7 KiB
JavaScript
const { request, ensureLogin, cents } = require('../../utils/api.js')
|
|
|
|
Page({
|
|
data: {
|
|
loading: false,
|
|
submitting: false,
|
|
errorMessage: '',
|
|
storeId: '',
|
|
storeName: '',
|
|
rooms: [],
|
|
roomIndex: 0,
|
|
memberLoading: false,
|
|
memberSearch: '',
|
|
members: [],
|
|
selectedMemberId: '',
|
|
selectedMemberName: '',
|
|
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 Promise.all([this.loadRooms(), this.loadMembers()])
|
|
},
|
|
|
|
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 })
|
|
}
|
|
},
|
|
|
|
inputMemberSearch(event) { this.setData({ memberSearch: String(event.detail.value || '').trim() }) },
|
|
searchMembers() { this.loadMembers() },
|
|
selectMember(event) {
|
|
const memberId = event.currentTarget.dataset.memberId
|
|
const member = this.data.members.find((item) => item.memberId === memberId)
|
|
if (!member) return
|
|
this.setData({ selectedMemberId: member.memberId, selectedMemberName: member.displayName })
|
|
},
|
|
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 loadMembers() {
|
|
this.setData({ memberLoading: true, errorMessage: '' })
|
|
try {
|
|
await ensureLogin()
|
|
const search = this.data.memberSearch
|
|
? `&search=${encodeURIComponent(this.data.memberSearch)}`
|
|
: ''
|
|
const response = await request(`/management/members?page=1&pageSize=20&status=ACTIVE${search}`)
|
|
const members = (response.data?.items || []).map((member) => ({
|
|
...member,
|
|
displayName: `${member.nickname || '未命名会员'} · ${member.maskedPhone || `ID ${member.memberId}`}`,
|
|
balanceText: cents(member.wallet?.totalBalanceCents),
|
|
}))
|
|
const selectedStillVisible = members.some((member) => member.memberId === this.data.selectedMemberId)
|
|
this.setData({
|
|
members,
|
|
selectedMemberId: selectedStillVisible ? this.data.selectedMemberId : '',
|
|
selectedMemberName: selectedStillVisible ? this.data.selectedMemberName : '',
|
|
})
|
|
} catch (error) {
|
|
this.setData({ errorMessage: error.message || '会员加载失败' })
|
|
} finally {
|
|
this.setData({ memberLoading: false })
|
|
}
|
|
},
|
|
|
|
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.selectedMemberId
|
|
if (!userId) {
|
|
this.setData({ errorMessage: '请从授权范围内选择会员' })
|
|
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())}`
|
|
},
|
|
})
|