package utils import ( "fmt" "time" "yuyue/database" "yuyue/models" ) // GenerateTwoMonthsTimeSlots 生成最近两个月的预约时间槽 func GenerateTwoMonthsTimeSlots() error { // 计算日期范围:明天开始的两个月 now := time.Now() startDate := time.Date(now.Year(), now.Month(), now.Day()+1, 0, 0, 0, 0, now.Location()) // 明天 endDate := startDate.AddDate(0, 2, 0) // 两个月后 fmt.Printf("开始生成时间槽:%s 到 %s\n", startDate.Format("2006-01-02"), endDate.Format("2006-01-02")) generatedSlots := []models.TimeSlot{} conflictCount := 0 currentDate := startDate for !currentDate.After(endDate) { // 排除周末 weekday := currentDate.Weekday() if weekday == time.Saturday || weekday == time.Sunday { currentDate = currentDate.AddDate(0, 0, 1) continue } // 生成工作日的时间槽 (9:00-18:00,每小时一个时段) startTime := time.Date(currentDate.Year(), currentDate.Month(), currentDate.Day(), 9, 0, 0, 0, currentDate.Location()) endTime := time.Date(currentDate.Year(), currentDate.Month(), currentDate.Day(), 18, 0, 0, 0, currentDate.Location()) currentSlotTime := startTime for currentSlotTime.Before(endTime) { slotEnd := currentSlotTime.Add(time.Hour) // 检查是否已经存在相同的时间槽 var existingSlot models.TimeSlot err := database.GetDB().Where("date = ? AND start_time = ? AND end_time = ?", currentDate, currentSlotTime, slotEnd).First(&existingSlot).Error if err != nil { // 不存在,创建新的时间槽 newSlot := models.TimeSlot{ Date: currentDate, StartTime: currentSlotTime, EndTime: slotEnd, MaxPeople: 5, // 每个时段最多5人 CurrentPeople: 0, IsActive: true, } generatedSlots = append(generatedSlots, newSlot) } else { conflictCount++ } currentSlotTime = slotEnd } currentDate = currentDate.AddDate(0, 0, 1) } // 批量插入到数据库 if len(generatedSlots) > 0 { if err := database.GetDB().CreateInBatches(generatedSlots, 100).Error; err != nil { return fmt.Errorf("批量创建时间槽失败: %v", err) } fmt.Printf("成功生成 %d 个时间槽\n", len(generatedSlots)) } if conflictCount > 0 { fmt.Printf("跳过 %d 个已存在的时间槽\n", conflictCount) } fmt.Printf("总共处理 %d 个时间槽\n", len(generatedSlots)+conflictCount) return nil }