// api/app/calendar.go // 日历数据聚合接口 package app import ( "fmt" "simple-memo/global" "simple-memo/models" "simple-memo/utils" "time" "github.com/gin-gonic/gin" "gorm.io/gorm" ) type CalendarHandler struct { db *gorm.DB } func NewCalendarHandler() *CalendarHandler { return &CalendarHandler{db: global.DB} } // CalendarDayData 单日数据 type CalendarDayData struct { Todo bool `json:"todo"` // 有待办 TodoDone bool `json:"todo_done"` // 待办全部完成 TodoUndone bool `json:"todo_undone"` // 有待办未完成 Mood bool `json:"mood"` // 有心情 Bill bool `json:"bill"` // 有账单 } // GetCalendarData 获取日历数据(按日期聚合) func (h *CalendarHandler) GetCalendarData(c *gin.Context) { year := time.Now().Year() month := int(time.Now().Month()) // 尝试从请求体获取年月 var req struct { Year int `json:"year"` Month int `json:"month"` } c.ShouldBindJSON(&req) if req.Year > 0 { year = req.Year } if req.Month > 0 && req.Month <= 12 { month = req.Month } userID := c.GetUint("userID") // 计算月份范围 startDate := fmt.Sprintf("%d-%02d-01", year, month) _, lastDay := utils.GetMonthLastDay(year, month) endDate := fmt.Sprintf("%d-%02d-%02d", year, month, lastDay) // 初始化结果 calendarData := make(map[string]*CalendarDayData) // 1. 查询待办数据(按日期分组,检查是否有未完成) var todos []models.Todo h.db.Where("user_id = ? AND date BETWEEN ? AND ?", userID, startDate, endDate). Find(&todos) // 按日期聚合待办状态 todoByDate := make(map[string]struct { HasTodo bool AllDone bool HasUndone bool }) for _, todo := range todos { date := todo.Date status := todoByDate[date] status.HasTodo = true if todo.Done == 1 { if !status.HasUndone { status.AllDone = true } } else { status.HasUndone = true status.AllDone = false } todoByDate[date] = status } for date, status := range todoByDate { if calendarData[date] == nil { calendarData[date] = &CalendarDayData{} } calendarData[date].Todo = status.HasTodo calendarData[date].TodoDone = status.AllDone calendarData[date].TodoUndone = status.HasUndone } // 2. 查询心情数据 var moodDates []string h.db.Model(&models.Mood{}). Where("user_id = ? AND date BETWEEN ? AND ?", userID, startDate, endDate). Pluck("DISTINCT date", &moodDates).Find(&moodDates) for _, date := range moodDates { if calendarData[date] == nil { calendarData[date] = &CalendarDayData{} } calendarData[date].Mood = true } // 3. 查询账单数据 var billDates []string h.db.Model(&models.Bill{}). Where("user_id = ? AND date BETWEEN ? AND ?", userID, startDate, endDate). Pluck("DISTINCT date", &moodDates).Find(&billDates) for _, date := range billDates { if calendarData[date] == nil { calendarData[date] = &CalendarDayData{} } calendarData[date].Bill = true } utils.Ok(c, calendarData) }