150 lines
5.2 KiB
Python
150 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
|
|
)
|
|
|
|
# 获取总数
|
|
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
|
|
} |