Files
ClassManager/backend/services/parent_service.py
2026-05-28 15:38:32 +08:00

131 lines
4.5 KiB
Python

# ===========================================
# 班级操行分管理系统 - 后端服务
#
# 开发者: 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
}