diff --git a/app/routes/admin.py b/app/routes/admin.py index c4375c9..3679185 100644 --- a/app/routes/admin.py +++ b/app/routes/admin.py @@ -458,6 +458,7 @@ def statistics(): """统计报表""" from sqlalchemy import desc, func, case, or_, and_ from datetime import datetime, timedelta + from collections import OrderedDict # 获取筛选参数 search = request.args.get('search', '').strip() @@ -537,26 +538,33 @@ def statistics(): # 获取学生统计数据 students_stats = base_query.all() - # 年级映射函数 - def get_grade_label(grade, degree_type): + # 年级映射函数和排序权重 + def get_grade_info(grade, degree_type): + """返回年级标签和排序权重""" if degree_type in ['学博', '专博']: - return f'博士{grade}年级' + # 博士:权重为0-99,年级越高权重越小(优先显示) + label = f'博士{grade}年级' + sort_weight = 10 - grade # 博士4年级权重6,博士3年级权重7,以此类推 else: + # 硕士:权重为100-199,年级越高权重越小 if grade == 1: - return '研一' + label = '研一' elif grade == 2: - return '研二' + label = '研二' elif grade == 3: - return '研三' + label = '研三' else: - return f'研{grade}' + label = f'研{grade}' + sort_weight = 110 - grade # 研三权重107,研二权重108,研一权重109 - # 处理学生数据并按年级分组 - grade_groups = {} + return label, sort_weight + + # 处理学生数据并收集到临时字典 + temp_grade_groups = {} all_students_data = [] for stat in students_stats: - grade_label = get_grade_label(stat.grade, stat.degree_type) + grade_label, sort_weight = get_grade_info(stat.grade, stat.degree_type) student_data = { 'student_number': stat.student_number, @@ -579,13 +587,24 @@ def statistics(): all_students_data.append(student_data) - if grade_label not in grade_groups: - grade_groups[grade_label] = [] - grade_groups[grade_label].append(student_data) + if grade_label not in temp_grade_groups: + temp_grade_groups[grade_label] = { + 'students': [], + 'sort_weight': sort_weight + } + temp_grade_groups[grade_label]['students'].append(student_data) # 按出勤时长排序每个年级的学生 - for grade in grade_groups: - grade_groups[grade].sort(key=lambda x: x['total_work_hours'], reverse=True) + for grade in temp_grade_groups: + temp_grade_groups[grade]['students'].sort(key=lambda x: x['total_work_hours'], reverse=True) + + # 🔥 按排序权重重新排序年级组,生成有序字典 + sorted_grade_items = sorted(temp_grade_groups.items(), key=lambda x: x[1]['sort_weight']) + + # 创建最终的有序年级组字典 + grade_groups = OrderedDict() + for grade_label, grade_data in sorted_grade_items: + grade_groups[grade_label] = grade_data['students'] # 总体统计 overall_stats = { @@ -690,6 +709,7 @@ def statistics(): print("=== 调试信息 ===") print(f"月度统计数据: {monthly_stats}") print(f"学院统计数据: {college_stats}") + print(f"年级组排序: {list(grade_groups.keys())}") print("===============") return render_template('admin/statistics.html', diff --git a/app/templates/admin/add_student.html b/app/templates/admin/add_student.html index dbe68de..2a491e3 100644 --- a/app/templates/admin/add_student.html +++ b/app/templates/admin/add_student.html @@ -1,6 +1,6 @@ {% extends 'layout/base.html' %} -{% block title %}添加学生 - CHM考勤管理系统{% endblock %} +{% block title %}添加学生 - SmartDSP考勤管理系统{% endblock %} {% block content %}