v0.1测试
This commit is contained in:
146
backend/services/student_service.py
Normal file
146
backend/services/student_service.py
Normal file
@@ -0,0 +1,146 @@
|
||||
# ===========================================
|
||||
# 班级操行分管理系统 - 后端服务
|
||||
#
|
||||
# 开发者: Canglan
|
||||
# 联系方式: admin@sea-studio.top
|
||||
# 版权归属: Sea Network Technology Studio
|
||||
# 许可证: MIT License
|
||||
#
|
||||
# 版权所有 © Sea Network Technology Studio
|
||||
# ===========================================
|
||||
|
||||
from typing import Dict, Any, List, Optional
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
from models.student import StudentModel
|
||||
from models.conduct import ConductModel
|
||||
from models.homework import HomeworkModel
|
||||
from models.attendance import AttendanceModel
|
||||
from middleware.permission import PermissionChecker
|
||||
from utils.logger import get_logger
|
||||
|
||||
logger = get_logger(__name__)
|
||||
|
||||
|
||||
class StudentService:
|
||||
"""学生服务"""
|
||||
|
||||
@staticmethod
|
||||
async def get_conduct_history(
|
||||
student_id: int,
|
||||
limit: int = 50,
|
||||
offset: int = 0
|
||||
) -> Dict[str, Any]:
|
||||
"""获取学生操行分历史(学生端显示,扣分项操作人显示为班主任)"""
|
||||
student = await StudentModel.get_by_id(student_id)
|
||||
if not student:
|
||||
return {"error": "学生不存在"}
|
||||
|
||||
records = await ConductModel.get_student_records(
|
||||
student_id=student_id,
|
||||
limit=limit,
|
||||
offset=offset
|
||||
)
|
||||
|
||||
# 处理记录:扣分项的操作人统一显示为"班主任"
|
||||
for record in records:
|
||||
if record["points_change"] < 0: # 扣分项
|
||||
record["recorder_name"] = "班主任"
|
||||
# 加分项保持原操作人不变
|
||||
|
||||
return {
|
||||
"student_id": student_id,
|
||||
"student_name": student["name"],
|
||||
"total_points": student["total_points"],
|
||||
"records": records
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
async def get_homework_status(student_id: int) -> Dict[str, Any]:
|
||||
"""获取学生作业情况"""
|
||||
student = await StudentModel.get_by_id(student_id)
|
||||
if not student:
|
||||
return {"error": "学生不存在"}
|
||||
|
||||
homework = await HomeworkModel.get_student_homework(student_id)
|
||||
|
||||
# 统计
|
||||
total = len(homework)
|
||||
submitted = sum(1 for h in homework if h["status"] == "submitted")
|
||||
not_submitted = sum(1 for h in homework if h["status"] == "not_submitted")
|
||||
late = sum(1 for h in homework if h["status"] == "late")
|
||||
|
||||
return {
|
||||
"student_id": student_id,
|
||||
"student_name": student["name"],
|
||||
"statistics": {
|
||||
"total": total,
|
||||
"submitted": submitted,
|
||||
"not_submitted": not_submitted,
|
||||
"late": late
|
||||
},
|
||||
"homework": homework
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
async def get_attendance_records(
|
||||
student_id: int,
|
||||
month: Optional[str] = None
|
||||
) -> Dict[str, Any]:
|
||||
"""获取学生考勤记录"""
|
||||
student = await StudentModel.get_by_id(student_id)
|
||||
if not student:
|
||||
return {"error": "学生不存在"}
|
||||
|
||||
records = await AttendanceModel.get_student_records(
|
||||
student_id=student_id,
|
||||
month=month
|
||||
)
|
||||
|
||||
# 统计
|
||||
present = sum(1 for r in records if r["status"] == "present")
|
||||
absent = sum(1 for r in records if r["status"] == "absent")
|
||||
late = sum(1 for r in records if r["status"] == "late")
|
||||
leave = sum(1 for r in records if r["status"] == "leave")
|
||||
|
||||
return {
|
||||
"student_id": student_id,
|
||||
"student_name": student["name"],
|
||||
"statistics": {
|
||||
"present": present,
|
||||
"absent": absent,
|
||||
"late": late,
|
||||
"leave": leave,
|
||||
"total": len(records)
|
||||
},
|
||||
"records": records
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
async def get_ranking(
|
||||
user_id: int,
|
||||
class_id: Optional[int] = None,
|
||||
limit: int = 50
|
||||
) -> Dict[str, Any]:
|
||||
"""获取排行榜"""
|
||||
# 如果未指定班级,获取用户所在班级
|
||||
if not class_id:
|
||||
user = await StudentModel.get_by_id(user_id) if user_id else None
|
||||
if user:
|
||||
class_id = user["class_id"]
|
||||
else:
|
||||
admin_class = await PermissionChecker.get_user_class_id(user_id)
|
||||
if admin_class:
|
||||
class_id = admin_class
|
||||
|
||||
ranking = await StudentModel.get_ranking(class_id=class_id, limit=limit)
|
||||
|
||||
return {
|
||||
"class_id": class_id,
|
||||
"ranking": ranking
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
async def get_student_info(student_id: int) -> Optional[Dict[str, Any]]:
|
||||
"""获取学生个人信息"""
|
||||
return await StudentModel.get_by_id(student_id)
|
||||
Reference in New Issue
Block a user