13
This commit is contained in:
42
utils/response.go
Normal file
42
utils/response.go
Normal file
@@ -0,0 +1,42 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
)
|
||||
|
||||
type Response struct {
|
||||
Code int `json:"code"`
|
||||
Message string `json:"message"`
|
||||
Data interface{} `json:"data,omitempty"`
|
||||
}
|
||||
|
||||
func Success(c *fiber.Ctx, data interface{}) error {
|
||||
return c.JSON(Response{
|
||||
Code: 200,
|
||||
Message: "success",
|
||||
Data: data,
|
||||
})
|
||||
}
|
||||
|
||||
func Error(c *fiber.Ctx, code int, message string) error {
|
||||
return c.Status(code).JSON(Response{
|
||||
Code: code,
|
||||
Message: message,
|
||||
})
|
||||
}
|
||||
|
||||
func BadRequest(c *fiber.Ctx, message string) error {
|
||||
return Error(c, fiber.StatusBadRequest, message)
|
||||
}
|
||||
|
||||
func Unauthorized(c *fiber.Ctx, message string) error {
|
||||
return Error(c, fiber.StatusUnauthorized, message)
|
||||
}
|
||||
|
||||
func NotFound(c *fiber.Ctx, message string) error {
|
||||
return Error(c, fiber.StatusNotFound, message)
|
||||
}
|
||||
|
||||
func InternalServerError(c *fiber.Ctx, message string) error {
|
||||
return Error(c, fiber.StatusInternalServerError, message)
|
||||
}
|
||||
81
utils/timeslot_generator.go
Normal file
81
utils/timeslot_generator.go
Normal file
@@ -0,0 +1,81 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user