智慧教务系统
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

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