from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.orm import Session from core.database import get_db from dao.score import post_score_dao, update_score_dao, get_score_dao, get_all_scores_dao,delete_score_dao, exist_student_exam_dao from schemas.score import ScoreCreate, ScoreUpdate, ScorePageResp scores_router = APIRouter(prefix="/scores", tags=["成绩接口"]) @scores_router.post("", summary="新增成绩接口") def create_score(req: ScoreCreate, db: Session = Depends(get_db)): # 业务校验:联合唯一 if exist_student_exam_dao(req.student_id, req.exam_seq, db): raise HTTPException(status_code=400, detail="该学生本次考试成绩已存在,不能重复录入") ok = post_score_dao(req.model_dump(), db) if not ok: raise HTTPException(status_code=400, detail="新增成绩失败,请检查学生id是否存在") return {"msg": "新增成功"} @scores_router.get("", response_model=ScorePageResp, summary="个人成绩查询接口") def list_score( score_id: int|None=None, student_id: int |None=None, exam_seq: int|None=None, page: int = Query(1, ge=1), page_size: int = Query(10, ge=1, le=100), db: Session = Depends(get_db) ): total, data_list = get_score_dao(score_id, student_id, exam_seq, page, page_size, db) return {"total": total, "data": data_list} @scores_router.get("/all", response_model=ScorePageResp, summary="所有学生成绩接口", ) def list_all_scores(page: int = Query(1, ge=1), page_size: int = Query(10, ge=1, le=100), db: Session = Depends(get_db)): total, data_list = get_all_scores_dao(page, page_size, db) return {"total": total, "data": data_list} @scores_router.put("{score_id}", summary="更新成绩接口") def modify_score(score_id: int, req: ScoreUpdate, db: Session = Depends(get_db)): update_dict = req.model_dump(exclude_unset=True) if not update_dict: raise HTTPException(status_code=400, detail="没有传入任何修改字段") ok = update_score_dao(score_id, db, update_dict) if not ok: raise HTTPException(status_code=400, detail="修改失败,记录不存在或已删除") return {"msg": "修改成功"} @scores_router.delete("{score_id}", summary="删除成绩接口") def remove_score(score_id: int, db: Session = Depends(get_db)): ok = delete_score_dao(score_id, db) if not ok: raise HTTPException(status_code=400, detail="删除失败,记录不存在或已删除") return {"msg": "逻辑删除成功"}