// =========================================== // 多班级版班级管理系统 - Go 后端 // // 开发者: Canglan // 联系方式: admin@sea-studio.top // 版权归属: Sea Network Technology Studio // 许可证: Apache License 2.0 // // 版权所有 © Sea Network Technology Studio // =========================================== package repository import ( "time" "gorm.io/gorm" "hz-gitea.sea-studio.top/canglan/SharedClassManager/internal/model" ) // AssignmentRepo 作业数据访问层 type AssignmentRepo struct { db *gorm.DB } // NewAssignmentRepo 创建作业 Repository func NewAssignmentRepo(db *gorm.DB) *AssignmentRepo { return &AssignmentRepo{db: db} } // ========== Assignment 操作 ========== // CreateAssignment 创建作业 func (r *AssignmentRepo) CreateAssignment(assignment *model.Assignment) (int, error) { if err := r.db.Create(assignment).Error; err != nil { return 0, err } return assignment.AssignmentID, nil } // GetAssignmentByID 根据ID获取作业 func (r *AssignmentRepo) GetAssignmentByID(assignmentID int) (*model.Assignment, error) { var assignment model.Assignment if err := r.db.Where("assignment_id = ?", assignmentID).First(&assignment).Error; err != nil { return nil, err } return &assignment, nil } // GetAssignmentsByClass 获取班级作业列表 func (r *AssignmentRepo) GetAssignmentsByClass(classID int, subjectID int, page, pageSize int) ([]model.Assignment, int64, error) { var assignments []model.Assignment var total int64 query := r.db.Model(&model.Assignment{}).Where("class_id = ?", classID) if subjectID > 0 { query = query.Where("subject_id = ?", subjectID) } if err := query.Count(&total).Error; err != nil { return nil, 0, err } offset := (page - 1) * pageSize if err := query.Order("created_at DESC"). Limit(pageSize). Offset(offset). Find(&assignments).Error; err != nil { return nil, 0, err } return assignments, total, nil } // GetAssignmentsBySubject 获取科目关联的作业列表 func (r *AssignmentRepo) GetAssignmentsBySubject(subjectID int) ([]model.Assignment, error) { var assignments []model.Assignment if err := r.db.Where("subject_id = ?", subjectID). Order("created_at DESC"). Find(&assignments).Error; err != nil { return nil, err } return assignments, nil } // DeleteAssignment 删除作业 func (r *AssignmentRepo) DeleteAssignment(assignmentID int) error { return r.db.Where("assignment_id = ?", assignmentID).Delete(&model.Assignment{}).Error } // GetHomeworkStatsByDateRange 通过作业截止日期范围查询学生作业提交统计 func (r *AssignmentRepo) GetHomeworkStatsByDateRange(startDate, endDate time.Time) ([]struct { StudentID int Status string Count int64 }, error) { var stats []struct { StudentID int Status string Count int64 } err := r.db.Table("homework_submissions hs"). Select("hs.student_id, hs.status, COUNT(*) as count"). Joins("JOIN assignments a ON hs.assignment_id = a.assignment_id"). Where("a.deadline BETWEEN ? AND ?", startDate, endDate). Group("hs.student_id, hs.status"). Find(&stats).Error if err != nil { return nil, err } return stats, nil } // ========== AssignmentSubmission 操作 ========== // CreateSubmission 创建作业提交记录 func (r *AssignmentRepo) CreateSubmission(submission *model.AssignmentSubmission) (int, error) { if err := r.db.Create(submission).Error; err != nil { return 0, err } return submission.SubmissionID, nil } // GetSubmissionByAssignmentAndStudent 获取指定作业和学生的提交记录 func (r *AssignmentRepo) GetSubmissionByAssignmentAndStudent(assignmentID, studentID int) (*model.AssignmentSubmission, error) { var submission model.AssignmentSubmission if err := r.db.Where("assignment_id = ? AND student_id = ?", assignmentID, studentID). First(&submission).Error; err != nil { return nil, err } return &submission, nil } // GetSubmissionsByAssignment 获取作业的所有提交记录 func (r *AssignmentRepo) GetSubmissionsByAssignment(assignmentID int) ([]model.AssignmentSubmission, error) { var submissions []model.AssignmentSubmission if err := r.db.Where("assignment_id = ?", assignmentID). Find(&submissions).Error; err != nil { return nil, err } return submissions, nil } // GetSubmissionsByStudent 获取学生的所有提交记录 func (r *AssignmentRepo) GetSubmissionsByStudent(studentID int) ([]model.AssignmentSubmission, error) { var submissions []model.AssignmentSubmission if err := r.db.Where("student_id = ?", studentID). Find(&submissions).Error; err != nil { return nil, err } return submissions, nil } // UpdateSubmission 更新提交记录 func (r *AssignmentRepo) UpdateSubmission(submissionID int, updates map[string]interface{}) error { return r.db.Model(&model.AssignmentSubmission{}). Where("submission_id = ?", submissionID). Updates(updates).Error } // BatchCreateSubmissions 批量创建提交记录 func (r *AssignmentRepo) BatchCreateSubmissions(submissions []model.AssignmentSubmission) error { if len(submissions) == 0 { return nil } return r.db.Create(&submissions).Error }