Files
ClassManager/backend/services/parent_service.py

149 lines
5.2 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.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
)
# 使用 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
}