from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from typing import List, Optional from decimal import Decimal from database import get_db from models import Score, Student from schemas import ScoreCreate, ScoreUpdate, ScoreBase router = APIRouter(prefix="/api/scores", tags=["scores"]) @router.get("/", response_model=List[ScoreBase]) def list_scores( sid: Optional[int] = None, num: Optional[str] = None, db: Session = Depends(get_db), skip: int = 0, limit: int = 100, ): query = db.query(Score).filter(Score.is_deleted == False) if sid is not None: query = query.filter(Score.sid == sid) if num: query = query.filter(Score.num.contains(num)) scores = query.offset(skip).limit(limit).all() return scores @router.get("/{score_id}", response_model=ScoreBase) def get_score(score_id: int, db: Session = Depends(get_db)): score = db.query(Score).filter(Score.id == score_id, Score.is_deleted == False).first() if not score: raise HTTPException(status_code=404, detail="成绩不存在") return score @router.post("/", response_model=ScoreBase) def create_score(data: ScoreCreate, db: Session = Depends(get_db)): if not db.query(Student).filter(Student.id == data.sid, Student.is_deleted == False).first(): raise HTTPException(status_code=400, detail="学生不存在") existing = db.query(Score).filter( Score.sid == data.sid, Score.num == data.num, Score.is_deleted == False, ).first() if existing: raise HTTPException(status_code=400, detail="该学生该考核序次的成绩已存在") score = Score(**data.model_dump()) db.add(score) db.commit() db.refresh(score) return score @router.put("/{score_id}", response_model=ScoreBase) def update_score(score_id: int, data: ScoreUpdate, db: Session = Depends(get_db)): score = db.query(Score).filter(Score.id == score_id, Score.is_deleted == False).first() if not score: raise HTTPException(status_code=404, detail="成绩不存在") score.score = data.score db.commit() db.refresh(score) return score @router.delete("/{score_id}") def delete_score(score_id: int, db: Session = Depends(get_db)): score = db.query(Score).filter(Score.id == score_id, Score.is_deleted == False).first() if not score: raise HTTPException(status_code=404, detail="成绩不存在") score.is_deleted = True db.commit() return {"message": "删除成功"}