/** * 根据场地信息生成可用时间段 * @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 }