// =========================================== // 多班级版班级管理系统 - Go 后端 // // 开发者: Canglan // 联系方式: admin@sea-studio.top // 版权归属: Sea Network Technology Studio // 许可证: Apache License 2.0 // // 版权所有 © Sea Network Technology Studio // =========================================== package service import ( "hz-gitea.sea-studio.top/canglan/SharedClassManager/internal/repository" ) // RankingService 排行榜服务 type RankingService struct { studentRepo *repository.StudentRepo conductRepo *repository.ConductRepo } // NewRankingService 创建排行榜服务 func NewRankingService( studentRepo *repository.StudentRepo, conductRepo *repository.ConductRepo, ) *RankingService { return &RankingService{ studentRepo: studentRepo, conductRepo: conductRepo, } } // GetRankings 获取排行榜 func (s *RankingService) GetRankings(classID int, rankType string, limit int) (map[string]interface{}, error) { switch rankType { case "attendance", "homework", "conduct": return s.getTypedRanking(classID, rankType, limit) default: // 默认按操行分总分排行 ranking, err := s.studentRepo.GetRanking(classID, limit) if err != nil { return nil, err } totalStudents, _ := s.studentRepo.GetTotalCount(classID) return map[string]interface{}{ "ranking": ranking, "total_students": totalStudents, "type": "all", }, nil } } // getTypedRanking 获取分项排行榜(使用 SQL 层聚合,避免全量加载) func (s *RankingService) getTypedRanking(classID int, relatedType string, limit int) (map[string]interface{}, error) { dbType := relatedType if relatedType == "conduct" { dbType = "manual" } results, err := s.conductRepo.GetStudentPointsByType(classID, dbType, limit) if err != nil { return nil, err } var rankings []map[string]interface{} for _, r := range results { rankings = append(rankings, map[string]interface{}{ "student_id": r.StudentID, "student_no": r.StudentNo, "name": r.Name, "points": r.TotalPoints, }) } return map[string]interface{}{ "ranking": rankings, "type": relatedType, }, nil }