# =========================================== # 班级操行分管理系统 - 后端服务 # # 开发者: Canglan # 联系方式: admin@sea-studio.top # 版权归属: Sea Network Technology Studio # 许可证: MIT License # # 版权所有 © Sea Network Technology Studio # =========================================== import math from typing import Dict, Any, Optional, List from models.user import UserModel from models.student import StudentModel from models.conduct import ConductModel from models.attendance import AttendanceModel from utils.logger import get_logger logger = get_logger(__name__) class ParentService: """家长服务""" @staticmethod async def get_child_conduct(parent_id: int) -> Dict[str, Any]: """获取子女操行分(仅总分,家长端不显示详细记录)""" # 获取家长关联的学生 user = await UserModel.get_by_user_id(parent_id) if not user or not user["student_id"]: return {"error": "未关联学生"} student = await StudentModel.get_by_id(user["student_id"]) if not student: return {"error": "学生不存在"} return { "student_id": student["student_id"], "student_name": student["name"], "student_no": student["student_no"], "total_points": student["total_points"], "dormitory_number": student.get("dormitory_number") } @staticmethod async def get_child_attendance(parent_id: int) -> Dict[str, Any]: """获取子女考勤记录""" user = await UserModel.get_by_user_id(parent_id) if not user or not user["student_id"]: return {"error": "未关联学生"} student = await StudentModel.get_by_id(user["student_id"]) if not student: return {"error": "学生不存在"} records = await AttendanceModel.get_student_records(user["student_id"]) return { "student_id": student["student_id"], "student_name": student["name"], "records": records } @staticmethod async def get_child_ranking(parent_id: int) -> Dict[str, Any]: """获取子女排名信息""" user = await UserModel.get_by_user_id(parent_id) if not user or not user["student_id"]: return {"error": "未关联学生"} student = await StudentModel.get_by_id(user["student_id"]) if not student: return {"error": "学生不存在"} # 获取全班排名 ranking = await StudentModel.get_ranking(limit=1000) total_students = await StudentModel.get_total_count() # 查找当前学生排名 student_rank = None for r in ranking: if r["student_id"] == user["student_id"]: student_rank = r["rank"] # 计算百分比排名 percentile = None if student_rank and total_students and total_students > 0: percentile = math.ceil(student_rank / total_students * 100) return { "student_id": student["student_id"], "student_name": student["name"], "student_no": student["student_no"], "total_points": student["total_points"], "rank": student_rank, "total_students": total_students, "percentile": percentile } @staticmethod async def get_child_history(parent_id: int, page: int = 1, page_size: int = 20) -> Dict[str, Any]: """获取子女操行分历史记录""" user = await UserModel.get_by_user_id(parent_id) if not user or not user["student_id"]: return {"error": "未关联学生"} student = await StudentModel.get_by_id(user["student_id"]) if not student: return {"error": "学生不存在"} offset = (page - 1) * page_size records = await ConductModel.get_student_records( student_id=user["student_id"], limit=page_size, offset=offset ) # 使用 COUNT 查询获取总数(避免获取全部记录) total = await ConductModel.count_student_records(user["student_id"]) return { "student_id": student["student_id"], "student_name": student["name"], "total_points": student["total_points"], "records": records, "total": total, "page": page, "page_size": page_size }