# =========================================== # 班级操行分管理系统 - 后端服务 # # 开发者: 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.homework import HomeworkModel 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"] } @staticmethod async def get_child_homework(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": "学生不存在"} homework = await HomeworkModel.get_student_homework(user["student_id"]) return { "student_id": student["student_id"], "student_name": student["name"], "homework": homework } @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 ) # 获取总数 all_records = await ConductModel.get_student_records(user["student_id"], limit=10000) total = len(all_records) 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 }