Study/server/service/learning/exam.go

194 lines
5.4 KiB
Go

package learning
import (
"context"
"time"
"github.com/flipped-aurora/gin-vue-admin/server/global"
"github.com/flipped-aurora/gin-vue-admin/server/model/learning"
learningReq "github.com/flipped-aurora/gin-vue-admin/server/model/learning/request"
)
type ExamService struct{}
// CreateExam 创建考试
func (examService *ExamService) CreateExam(ctx context.Context, exam *learning.Exam) (err error) {
// 设置默认值
if exam.Status == "" {
exam.Status = "draft"
}
if exam.MaxAttempts == 0 {
exam.MaxAttempts = 1
}
err = global.GVA_DB.WithContext(ctx).Create(exam).Error
return err
}
// DeleteExam 删除考试
func (examService *ExamService) DeleteExam(ctx context.Context, ID string) (err error) {
err = global.GVA_DB.WithContext(ctx).Delete(&learning.Exam{}, ID).Error
return err
}
// DeleteExamByIds 批量删除考试
func (examService *ExamService) DeleteExamByIds(ctx context.Context, IDs []string) (err error) {
err = global.GVA_DB.WithContext(ctx).Delete(&[]learning.Exam{}, "id in ?", IDs).Error
return err
}
// UpdateExam 更新考试
func (examService *ExamService) UpdateExam(ctx context.Context, exam learning.Exam) (err error) {
err = global.GVA_DB.WithContext(ctx).Model(&learning.Exam{}).Where("id = ?", exam.ID).Updates(&exam).Error
return err
}
// GetExam 根据ID获取考试
func (examService *ExamService) GetExam(ctx context.Context, ID string) (exam learning.Exam, err error) {
err = global.GVA_DB.WithContext(ctx).Where("id = ?", ID).First(&exam).Error
if err != nil {
return
}
// 手动查询关联的课程信息
examService.loadCourseInfo(ctx, &exam)
return
}
// GetExamInfoList 分页获取考试列表
func (examService *ExamService) GetExamInfoList(ctx context.Context, info learningReq.ExamSearch) (list []learning.Exam, total int64, err error) {
limit := info.PageSize
offset := info.PageSize * (info.Page - 1)
// 创建db
db := global.GVA_DB.WithContext(ctx).Model(&learning.Exam{})
var exams []learning.Exam
// 如果有条件搜索 下方会自动创建搜索语句
if info.StartCreatedAt != nil && info.EndCreatedAt != nil {
db = db.Where("created_at BETWEEN ? AND ?", info.StartCreatedAt, info.EndCreatedAt)
}
if info.Title != "" {
db = db.Where("title LIKE ?", "%"+info.Title+"%")
}
if info.CourseId != 0 {
db = db.Where("course_id = ?", info.CourseId)
}
if info.Status != "" {
db = db.Where("status = ?", info.Status)
}
err = db.Count(&total).Error
if err != nil {
return
}
if limit != 0 {
db = db.Limit(limit).Offset(offset)
}
err = db.Order("created_at desc").Find(&exams).Error
if err != nil {
return exams, total, err
}
// 批量加载关联的课程信息
for i := range exams {
examService.loadCourseInfo(ctx, &exams[i])
}
return exams, total, err
}
// GetActiveExams 获取进行中的考试列表
func (examService *ExamService) GetActiveExams(ctx context.Context) (list []learning.Exam, err error) {
now := time.Now()
err = global.GVA_DB.WithContext(ctx).
Where("status = ? AND start_time <= ? AND end_time >= ?", "published", now, now).
Order("start_time asc").
Find(&list).Error
// 批量加载关联的课程信息
for i := range list {
examService.loadCourseInfo(ctx, &list[i])
}
return
}
// GetExamsByCourse 根据课程获取考试列表
func (examService *ExamService) GetExamsByCourse(ctx context.Context, courseId uint) (list []learning.Exam, err error) {
err = global.GVA_DB.WithContext(ctx).
Where("course_id = ? AND status = ?", courseId, "published").
Order("start_time asc").
Find(&list).Error
// 批量加载关联的课程信息
for i := range list {
examService.loadCourseInfo(ctx, &list[i])
}
return
}
// PublishExam 发布考试
func (examService *ExamService) PublishExam(ctx context.Context, examId uint) (err error) {
updates := map[string]interface{}{
"status": "published",
}
err = global.GVA_DB.WithContext(ctx).Model(&learning.Exam{}).
Where("id = ?", examId).
Updates(updates).Error
return err
}
// GetExamStatistics 获取考试统计
func (examService *ExamService) GetExamStatistics(ctx context.Context) (stats learningReq.ExamStatistics, err error) {
// 总考试数
var totalExams int64
err = global.GVA_DB.WithContext(ctx).Model(&learning.Exam{}).Count(&totalExams).Error
if err != nil {
return
}
stats.TotalExams = int(totalExams)
// 进行中的考试数
now := time.Now()
var activeExams int64
err = global.GVA_DB.WithContext(ctx).Model(&learning.Exam{}).
Where("status = ? AND start_time <= ? AND end_time >= ?", "published", now, now).
Count(&activeExams).Error
if err != nil {
return
}
stats.ActiveExams = int(activeExams)
// 已结束的考试数
var completedExams int64
err = global.GVA_DB.WithContext(ctx).Model(&learning.Exam{}).
Where("status = ? AND end_time < ?", "published", now).
Count(&completedExams).Error
if err != nil {
return
}
stats.CompletedExams = int(completedExams)
// 草稿考试数
var draftExams int64
err = global.GVA_DB.WithContext(ctx).Model(&learning.Exam{}).
Where("status = ?", "draft").
Count(&draftExams).Error
if err != nil {
return
}
stats.DraftExams = int(draftExams)
return
}
// loadCourseInfo 加载课程信息
func (examService *ExamService) loadCourseInfo(ctx context.Context, exam *learning.Exam) {
if exam.CourseId != 0 {
var course learning.Course
if err := global.GVA_DB.WithContext(ctx).Where("id = ?", exam.CourseId).First(&course).Error; err == nil {
exam.Course = course
}
}
}