61 lines
2.2 KiB
Python
61 lines
2.2 KiB
Python
# api/statistics_api.py
|
|||
|
|
# 统计分析模块(动态查询与综合能力锻炼):
|
||
|
|
# 聚合 / 分组 / 关联 / 动态查询条件全部沉在 dao.statistics_dao,这里只暴露接口。
|
||
|
|
|
||
|
|
from typing import Optional
|
||
|
|
|
||
|
|
from fastapi import APIRouter, Depends, Query
|
||
|
|
from sqlalchemy.orm import Session
|
||
|
|
|
||
|
|
from dao import statistics_dao
|
||
|
|
from database import get_db
|
||
|
|
|
||
|
|
router = APIRouter()
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/overview", summary="系统总览统计")
|
||
|
|
def overview(db: Session = Depends(get_db)):
|
||
|
|
"""统计学生、班级、教师、顾问、已就业人数及就业率。"""
|
||
|
|
return statistics_dao.overview(db)
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/student/gender", summary="学生性别分布")
|
||
|
|
def student_gender_distribution(db: Session = Depends(get_db)):
|
||
|
|
return statistics_dao.student_gender_distribution(db)
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/student/education", summary="学生学历分布")
|
||
|
|
def student_education_distribution(db: Session = Depends(get_db)):
|
||
|
|
return statistics_dao.student_education_distribution(db)
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/student/state", summary="学生就读状态分布")
|
||
|
|
def student_state_distribution(db: Session = Depends(get_db)):
|
||
|
|
return statistics_dao.student_state_distribution(db)
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/student/hometown", summary="学生生源地分布(Top N)")
|
||
|
|
def student_hometown_distribution(
|
||
|
|
limit: int = Query(10, ge=1, le=100, description="返回前 N 个生源地"),
|
||
|
|
db: Session = Depends(get_db),
|
||
|
|
):
|
||
|
|
return statistics_dao.student_hometown_distribution(db, limit=limit)
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/score/summary", summary="成绩综合统计(平均/最高/最低/及格率)")
|
||
|
|
def score_summary(
|
||
|
|
cls_id: Optional[str] = Query(None, description="按班级过滤(不传则统计全部)"),
|
||
|
|
db: Session = Depends(get_db),
|
||
|
|
):
|
||
|
|
"""统计平均分、最高分、最低分、及格人数与及格率,可动态按班级过滤(关联 stu_info)。"""
|
||
|
|
return statistics_dao.score_summary(db, cls_id=cls_id)
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/score/distribution", summary="成绩等级分布")
|
||
|
|
def score_level_distribution(db: Session = Depends(get_db)):
|
||
|
|
return statistics_dao.score_level_distribution(db)
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/employ/summary", summary="就业综合统计(就业率/薪资)")
|
||
|
|
def employ_summary(db: Session = Depends(get_db)):
|
||
|
|
return statistics_dao.employ_summary(db)
|