duidui_fiber/internal/admin/statistics/service.go
2026-03-27 10:34:03 +08:00

75 lines
2.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package statistics
import (
"dd_fiber_api/internal/camp/dao"
question_dao "dd_fiber_api/internal/question/dao"
"dd_fiber_api/pkg/database"
"fmt"
)
// Service 统计服务
type Service struct {
mysqlClient *database.MySQLClient
campDAO *dao.CampDAO
questionDAO question_dao.QuestionDAOInterface
paperDAO question_dao.PaperDAOInterface
}
// NewService 创建统计服务
func NewService(
mysqlClient *database.MySQLClient,
campDAO *dao.CampDAO,
questionDAO question_dao.QuestionDAOInterface,
paperDAO question_dao.PaperDAOInterface,
) *Service {
return &Service{
mysqlClient: mysqlClient,
campDAO: campDAO,
questionDAO: questionDAO,
paperDAO: paperDAO,
}
}
// Statistics 统计数据
type Statistics struct {
UserCount int `json:"user_count"` // 用户总数
CampCount int `json:"camp_count"` // 打卡营数量
QuestionCount int `json:"question_count"` // 题目数量
PaperCount int `json:"paper_count"` // 试卷数量
}
// GetStatistics 获取统计数据
func (s *Service) GetStatistics() (*Statistics, error) {
stats := &Statistics{}
// 统计用户总数(从 camp_user_camps 表中统计不重复的 user_id
userCountQuery := `SELECT COUNT(DISTINCT user_id) FROM camp_user_camps`
err := s.mysqlClient.DB.QueryRow(userCountQuery).Scan(&stats.UserCount)
if err != nil {
return nil, fmt.Errorf("统计用户总数失败: %v", err)
}
// 统计打卡营数量(排除已删除的)
campCountQuery := `SELECT COUNT(*) FROM camp_camps WHERE deleted_at IS NULL`
err = s.mysqlClient.DB.QueryRow(campCountQuery).Scan(&stats.CampCount)
if err != nil {
return nil, fmt.Errorf("统计打卡营数量失败: %v", err)
}
// 统计题目数量(使用 MongoDB 接口)
_, total, err := s.questionDAO.Search("", 0, nil, 1, 1)
if err != nil {
return nil, fmt.Errorf("统计题目数量失败: %v", err)
}
stats.QuestionCount = int(total)
// 统计试卷数量(使用 MongoDB 接口)
_, total, err = s.paperDAO.Search("", 1, 1)
if err != nil {
return nil, fmt.Errorf("统计试卷数量失败: %v", err)
}
stats.PaperCount = int(total)
return stats, nil
}