194 lines
5.4 KiB
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
|
|
}
|
|
}
|
|
}
|