feat: 订场页改为网格时间表,支持多场地多时段选择
- private/index.vue 重写为场地×时间网格,双向滚动,sticky表头 - 当前时间红线指示,已过时灰块/已占用浅红/已选中蓝色 - 支持多场地连续时段选择,非连续会提示 - 日期改为近7天,Tab栏样式与约课页统一 - 底部按钮:未选时全宽长条,选中后显示摘要+小按钮 - privateBooking.js 新增 getPrivateBookingGrid API - quote/create 改为 items[] 格式,每场地独立时间段 - confirm.vue 按 items 逐条展示 - pages/private/index.vue onShow 自动刷新 - .env 冰场馆URL修正
This commit is contained in:
@@ -10,12 +10,22 @@ const toQuoteCourt = (backendCourt = {}) => ({
|
||||
court_type_label: backendCourt.court_type_label || ''
|
||||
})
|
||||
|
||||
const toQuoteItem = (backendItem = {}) => ({
|
||||
court_id: backendItem.court_id ?? null,
|
||||
court_name: backendItem.court_name || '',
|
||||
start_at: backendItem.start_at || '',
|
||||
end_at: backendItem.end_at || '',
|
||||
unit_count: toNumber(backendItem.unit_count),
|
||||
amount: backendItem.amount || '0.00'
|
||||
})
|
||||
|
||||
const toPrivateQuote = (backendQuote = {}) => ({
|
||||
amount: backendQuote.amount || '0.00',
|
||||
unit_count: toNumber(backendQuote.unit_count),
|
||||
start_at: backendQuote.start_at || '',
|
||||
end_at: backendQuote.end_at || '',
|
||||
courts: toArray(backendQuote.courts).map(toQuoteCourt)
|
||||
courts: toArray(backendQuote.courts).map(toQuoteCourt),
|
||||
items: toArray(backendQuote.items).map(toQuoteItem)
|
||||
})
|
||||
|
||||
const toPrivateCreateResult = (backendData = {}) => ({
|
||||
@@ -44,6 +54,34 @@ const toPrivateBookingOptions = (backendData = {}) => ({
|
||||
time_options: toArray(backendData.time_options).map(toPrivateTimeOption)
|
||||
})
|
||||
|
||||
const toGridCourt = (backendCourt = {}) => ({
|
||||
id: backendCourt.id ?? null,
|
||||
name: backendCourt.name || ''
|
||||
})
|
||||
|
||||
const toGridSlot = (backendSlot = {}) => ({
|
||||
start: backendSlot.start || '',
|
||||
end: backendSlot.end || ''
|
||||
})
|
||||
|
||||
const toGridOccupation = (backendOcc = {}) => ({
|
||||
court_id: backendOcc.court_id ?? null,
|
||||
start_at: backendOcc.start_at || '',
|
||||
end_at: backendOcc.end_at || ''
|
||||
})
|
||||
|
||||
const toPrivateBookingGrid = (backendData = {}) => ({
|
||||
date: backendData.date || '',
|
||||
court_type: backendData.court_type || '',
|
||||
court_type_label: backendData.court_type_label || '',
|
||||
open_time: backendData.open_time || '',
|
||||
close_time: backendData.close_time || '',
|
||||
unit_price: backendData.unit_price || '0.00',
|
||||
courts: toArray(backendData.courts).map(toGridCourt),
|
||||
time_slots: toArray(backendData.time_slots).map(toGridSlot),
|
||||
occupations: toArray(backendData.occupations).map(toGridOccupation)
|
||||
})
|
||||
|
||||
export const privateBookingApi = {
|
||||
getPrivateBookingOptions(params = {}) {
|
||||
return request({
|
||||
@@ -55,25 +93,33 @@ export const privateBookingApi = {
|
||||
})
|
||||
}).then(toPrivateBookingOptions)
|
||||
},
|
||||
|
||||
getPrivateBookingGrid(params = {}) {
|
||||
return request({
|
||||
url: '/api/bookings/private/grid',
|
||||
data: compactParams({
|
||||
date: params.date,
|
||||
court_type: params.courtType || params.court_type
|
||||
})
|
||||
}).then(toPrivateBookingGrid)
|
||||
},
|
||||
|
||||
quotePrivateBooking(payload = {}) {
|
||||
return request({
|
||||
url: '/api/bookings/private/quote',
|
||||
method: 'POST',
|
||||
data: {
|
||||
court_ids: toArray(payload.court_ids),
|
||||
start_at: payload.start_at,
|
||||
end_at: payload.end_at
|
||||
items: toArray(payload.items)
|
||||
}
|
||||
}).then(toPrivateQuote)
|
||||
},
|
||||
|
||||
createPrivateBooking(payload = {}) {
|
||||
return request({
|
||||
url: '/api/bookings/private',
|
||||
method: 'POST',
|
||||
data: {
|
||||
court_ids: toArray(payload.court_ids),
|
||||
start_at: payload.start_at,
|
||||
end_at: payload.end_at
|
||||
items: toArray(payload.items)
|
||||
}
|
||||
}).then(toPrivateCreateResult)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user