package service import ( "time" "gorm.io/gorm" "github.com/sundynix/pets-be/internal/model" ) // ListTasks 列出宠物任务(date 为空则取今天) func (s *Service) ListTasks(userID, petID uint, date *time.Time) ([]model.DailyTask, error) { if _, err := s.ownedPet(userID, petID); err != nil { return nil, err } q := s.db.Where("pet_id = ?", petID) if date != nil { start := time.Date(date.Year(), date.Month(), date.Day(), 0, 0, 0, 0, date.Location()) end := start.AddDate(0, 0, 1) q = q.Where("task_date >= ? AND task_date < ?", start, end) } var tasks []model.DailyTask err := q.Order("id asc").Find(&tasks).Error return tasks, err } // ToggleTask 切换任务完成状态 func (s *Service) ToggleTask(userID, taskID uint) (*model.DailyTask, error) { var task model.DailyTask if err := s.db.Where("id = ? AND user_id = ?", taskID, userID).First(&task).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, ErrNotFound } return nil, err } task.Done = !task.Done if task.Done { now := time.Now() task.CompletedAt = &now } else { task.CompletedAt = nil } if err := s.db.Save(&task).Error; err != nil { return nil, err } return &task, nil } // CompleteAllTasks 完成宠物今日全部任务 func (s *Service) CompleteAllTasks(userID, petID uint) ([]model.DailyTask, error) { if _, err := s.ownedPet(userID, petID); err != nil { return nil, err } now := time.Now() start := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location()) end := start.AddDate(0, 0, 1) if err := s.db.Model(&model.DailyTask{}). Where("pet_id = ? AND task_date >= ? AND task_date < ?", petID, start, end). Updates(map[string]any{"done": true, "completed_at": now}).Error; err != nil { return nil, err } return s.ListTasks(userID, petID, &now) }