82 lines
2.4 KiB
Go
82 lines
2.4 KiB
Go
|
|
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
|
|||
|
|
}
|