第五版_完整

This commit is contained in:
jianqi
2026-09-14 16:39:48 +08:00
parent c2909191d2
commit e8be87eca0
5 changed files with 147 additions and 53 deletions
+56 -19
View File
@@ -6,32 +6,35 @@ from typing import List, Optional
from database import get_db
from dao.statistics_dao import StatisticsDao
from scheme.statistics_scheme import ClassGenderDistributionItem, StuInfoAllExamAboveScore, FailingStudentItem, ClassExamAvgScoreItem, \
TopSalaryStudentItem, StudentEmpDurationItem, ClassAvgEmpDurationItem, StudentAgeDetailItem
from scheme.statistics_scheme import ClassGenderDistributionItem, \
TopSalaryStudentItem, StudentEmpDurationItem, ClassAvgEmpDurationItem, StudentAgeDetailItem
router = APIRouter()
#### 2.6.1 基本信息动态统计
# - **动态年龄范围查询**:支持用户输入年龄阈值及比较条件(如大于、小于、等于、区间等),动态查询符合条件的学员信息。
@router.get("/api/stats/students/age_filter",
@router.get("/students/age_filter",
response_model=List[StudentAgeDetailItem],
summary="动态年龄范围查询",
description="支持用户输入年龄阈值及比较条件(如大于、小于、等于、区间等),动态查询符合条件的学员信息。")
def get_students_by_age_condition(db: Session = Depends(get_db),
operator: str = Query(..., description="比较条件: gt/gte/lt/lte/eq/between"),
operator: str = Query(...,
description="""比较条件: gt/ge/lt/le/eq/between <br> 或者:>/>=/</<=/==/between <br>"""),
age: Optional[int] = Query(None, ge=0, description="单值比较时的年龄(gt/lt/eq等用)"),
min_age: Optional[int] = Query(None, ge=0,description="区间比较时的最小年龄(between用)"),
max_age: Optional[int] = Query(None, ge=0,description="区间比较时的最大年龄(between用)")
min_age: Optional[int] = Query(None, ge=0,
description="区间比较时的最小年龄(between用)"),
max_age: Optional[int] = Query(None, ge=0,
description="区间比较时的最大年龄(between用)")
):
if operator == "between":
if min_age is None or max_age is None:
raise HTTPException(status_code=400, detail="最大/最小值 都得输入")
raise HTTPException(status_code=400, detail="between功能: 最大/最小值 都得输入")
if min_age > max_age:
raise HTTPException(status_code=400, detail="最小值 要 小于 最大值!")
raise HTTPException(status_code=400, detail="between功能: 最小值 要 小于 最大值!")
else:
if age is None:
raise HTTPException(status_code=400, detail="age 不能不写!")
raise HTTPException(status_code=400, detail="非between功能: age 不能不写!")
data = StatisticsDao.find_students_by_age_condition(db = db,
operator = operator,
@@ -41,9 +44,9 @@ def get_students_by_age_condition(db: Session = Depends(get_db),
return data
# **多维度班级统计**:统计每个班级的总人数,以及按性别(男、女)细分的人数分布。
@router.get("/api/stats/class/gender_distribution",
@router.get("/class/gender_distribution",
response_model=List[ClassGenderDistributionItem],
summary="班级性别统计",
summary="班级人数及性别统计",
description="统计每个班级的总人数,以及按性别(男、女)细分的人数分布。")
def get_class_stats(db: Session = Depends(get_db)):
data = StatisticsDao.get_class_gender_distribution(db)
@@ -61,21 +64,26 @@ def get_class_stats(db: Session = Depends(get_db)):
def get_students_all_exams_above_score(
db: Session = Depends(get_db),
choose: int = Query(..., ge=1, le=3, description="功能选择(1-3): 参考提示"),
player_num: int | float = Query(..., ge=0, le=100, description="输入的具体参数,参考提示")
param: int | float = Query(..., description="输入的具体参数,参考提示")
):
if choose == 1:
# 查询每次考试成绩都在输入分数线(如80分)以上的学生的编号、姓名和成绩 -- 参数: 分数
if player_num > 100 or player_num < 0:
if param > 100 or param < 0:
raise HTTPException(status_code=400, detail="成绩需要在[0-100]区间")
data = StatisticsDao.get_stu_info_all_exams_above_score(db, player_num)
data = StatisticsDao.get_stu_info_all_exams_above_score(db, param)
elif choose == 2:
# 2、查询有输入指定次数(如两次)以上不及格的学生的姓名、班级和不及格成绩明细 -- 参数: 不及格次数
data = StatisticsDao.find_students_fail_count(db, player_num)
data = StatisticsDao.find_students_fail_count(db, param)
elif choose == 3:
# 统计每次考试每个班级的平均分,并支持按分数从高到低或从低到高动态排序 -- 参数: 1:低到高, 2:高到低
data = StatisticsDao.find_class_exam_averages(db, player_num)
if param not in [1, 2]:
raise HTTPException(status_code=400, detail="排序只有两种: 1:低到高, 2:高到低")
data = StatisticsDao.find_class_exam_averages(db, param)
return data
@@ -119,9 +127,37 @@ def get_class_exams_avg_scores(
return data
"""
#### 2.6.3 就业数据统计: all
@router.get("/employment_time",
summary="就业数据统计",
description= """
1、统计就业薪资排名 Top N(动态输入 N)的学生的姓名、班级、就业时间和就业公司。 -- 参数: top_N<br>
2、统计每个学生的就业时长(计算公式:offer下发时间 - 就业开放时间) -- 参数: 无<br>
3、统计每个班级的平均就业时长(仅统计进入就业阶段,即有就业开放时间的学生) -- 参数: 无<br>
""")
def get_students_all_exams_above_score(
db: Session = Depends(get_db),
choose: int = Query(..., ge=1, le=3, description="功能选择(1-3): 参考提示"),
player_num: int = Query(10, ge=0, le=100, description="功能1 输入的具体参数,参考提示(其他功能无效)")
):
if choose == 1:
# 1、统计就业薪资排名 Top N(动态输入 N)的学生的姓名、班级、就业时间和就业公司。 -- 参数: top_N
data = StatisticsDao.find_top_salary_students(db, player_num)
elif choose == 2:
# 2、统计每个学生的就业时长(计算公式:offer下发时间 - 就业开放时间) -- 参数: 无
data = StatisticsDao.find_students_employment_duration(db)
elif choose == 3:
# 3、统计每个班级的平均就业时长(仅统计进入就业阶段,即有就业开放时间的学生) -- 参数: 无<br>
data = StatisticsDao.find_class_avg_employment_duration(db)
return data
# 2.6.3 就业数据统计 单独版
"""
#### 2.6.3 就业数据统计
# - 统计就业薪资排名 Top N(动态输入 N)的学生的姓名、班级、就业时间和就业公司。
@router.get("/api/stats/employment/top_salaries",
@router.get("/employment/top_salaries",
response_model=List[TopSalaryStudentItem],
summary="就业薪资top_N",
description="统计就业薪资排名 Top N(动态输入 N)的学生的姓名、班级、就业时间和就业公司")
@@ -132,7 +168,7 @@ def get_top_salary_students(
return data
# - 统计每个学生的就业时长(计算公式:offer下发时间 - 就业开放时间)。
@router.get("/api/stats/employment/job_seeking_duration",
@router.get("/employment/job_seeking_duration",
response_model=List[StudentEmpDurationItem],
summary="统计就业时长",
description="统计每个学生的就业时长(计算公式:offer下发时间 - 就业开放时间)")
@@ -141,10 +177,11 @@ def get_students_job_seeking_duration(db: Session = Depends(get_db)):
return data
# - 统计每个班级的平均就业时长(仅统计进入就业阶段,即有就业开放时间的学生)
@router.get("/api/stats/class/avg_employment_duration",
@router.get("/class/avg_employment_duration",
response_model=List[ClassAvgEmpDurationItem],
summary="班级平均就业时长",
description="统计每个班级的平均就业时长(仅统计进入就业阶段,即有就业开放时间的学生)")
def get_class_avg_employment_duration(db: Session = Depends(get_db)):
data = StatisticsDao.find_class_avg_employment_duration(db)
return data
"""