You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
4.3 KiB
113 lines
4.3 KiB
/**
|
|
* 根据场地信息生成可用时间段
|
|
* @param venueInfo 场地信息对象
|
|
* @returns 时间段数组,格式为["08:00-09:00", "09:00-10:00"]
|
|
*/
|
|
export const generateTimeSlots = (venueInfo: any) => {
|
|
if (!venueInfo) return []
|
|
|
|
const timeSlots: string[] = []
|
|
|
|
// 如果场地已有预设时间段,优先使用
|
|
if (venueInfo.time_slots && Array.isArray(venueInfo.time_slots)) {
|
|
return venueInfo.time_slots.map((slot: string) => slot.trim());
|
|
}
|
|
|
|
// 根据time_range_type生成不同的时间段
|
|
switch (venueInfo.time_range_type) {
|
|
case 'fixed':
|
|
// 从fixed_time_ranges中获取固定时间段
|
|
try {
|
|
// 确保fixed_time_ranges是数组
|
|
const fixedRanges = Array.isArray(venueInfo.fixed_time_ranges)
|
|
? venueInfo.fixed_time_ranges
|
|
: (typeof venueInfo.fixed_time_ranges === 'string'
|
|
? JSON.parse(venueInfo.fixed_time_ranges || '[]')
|
|
: []);
|
|
|
|
fixedRanges.forEach((range: any) => {
|
|
// 确保start_time和end_time存在
|
|
if (range && range.start_time && range.end_time) {
|
|
timeSlots.push(`${range.start_time}-${range.end_time}`)
|
|
}
|
|
})
|
|
} catch (error) {
|
|
console.error('解析固定时间段失败:', error)
|
|
}
|
|
break
|
|
|
|
case 'all':
|
|
// 全天可用,但中午12:30-14:00不可用
|
|
// 早上8点到中午12:30,步长60分钟
|
|
for (let hour = 8; hour <= 12; hour++) {
|
|
for (let minute = 0; minute < 60; minute += 60) {
|
|
if (hour === 12 && minute === 30) continue // 跳过12:30
|
|
|
|
const startHour = hour
|
|
const startMinute = minute
|
|
const endHour = minute === 30 ? hour + 1 : hour
|
|
const endMinute = minute === 30 ? 0 : 30
|
|
|
|
const startTime = `${startHour.toString().padStart(2, '0')}:${startMinute.toString().padStart(2, '0')}`
|
|
const endTime = `${endHour.toString().padStart(2, '0')}:${endMinute.toString().padStart(2, '0')}`
|
|
|
|
timeSlots.push(`${startTime}-${endTime}`)
|
|
}
|
|
}
|
|
|
|
// 下午14:00到晚上22:00,步长60分钟
|
|
for (let hour = 14; hour < 22; hour++) {
|
|
for (let minute = 0; minute < 60; minute += 60) {
|
|
const startHour = hour
|
|
const startMinute = minute
|
|
const endHour = minute === 30 ? hour + 1 : hour
|
|
const endMinute = minute === 30 ? 0 : 30
|
|
|
|
const startTime = `${startHour.toString().padStart(2, '0')}:${startMinute.toString().padStart(2, '0')}`
|
|
const endTime = `${endHour.toString().padStart(2, '0')}:${endMinute.toString().padStart(2, '0')}`
|
|
|
|
timeSlots.push(`${startTime}-${endTime}`)
|
|
}
|
|
}
|
|
break
|
|
|
|
case 'range':
|
|
// 使用指定的时间范围,步长60分钟
|
|
if (venueInfo.time_range_start && venueInfo.time_range_end) {
|
|
const startTimeParts = venueInfo.time_range_start.split(':')
|
|
const endTimeParts = venueInfo.time_range_end.split(':')
|
|
|
|
if (startTimeParts.length === 2 && endTimeParts.length === 2) {
|
|
const startHour = parseInt(startTimeParts[0])
|
|
const startMinute = parseInt(startTimeParts[1])
|
|
const endHour = parseInt(endTimeParts[0])
|
|
const endMinute = parseInt(endTimeParts[1])
|
|
|
|
// 计算总分钟数
|
|
const startTotalMinutes = startHour * 60 + startMinute
|
|
const endTotalMinutes = endHour * 60 + endMinute
|
|
|
|
// 以60分钟为步长生成时间段
|
|
for (let minutes = startTotalMinutes; minutes < endTotalMinutes; minutes += 60) {
|
|
const startHour = Math.floor(minutes / 60)
|
|
const startMinute = minutes % 60
|
|
const endHour = Math.floor((minutes + 60) / 60)
|
|
const endMinute = (minutes + 60) % 60
|
|
|
|
const startTime = `${startHour.toString().padStart(2, '0')}:${startMinute.toString().padStart(2, '0')}`
|
|
const endTime = `${endHour.toString().padStart(2, '0')}:${endMinute.toString().padStart(2, '0')}`
|
|
|
|
timeSlots.push(`${startTime}-${endTime}`)
|
|
}
|
|
}
|
|
}
|
|
break
|
|
}
|
|
|
|
// 添加现有时间段,如果有的话
|
|
if (venueInfo.time_slot && !timeSlots.includes(venueInfo.time_slot)) {
|
|
timeSlots.push(venueInfo.time_slot);
|
|
}
|
|
|
|
return timeSlots
|
|
}
|