# api/cls_mgmt_api.py # 班级管理模块:接口层只负责 HTTP 出入参,查库/校验/事务交给 dao.cls_mgmt_dao from typing import Optional from fastapi import APIRouter, Depends, Query from sqlalchemy.orm import Session from dao import cls_mgmt_dao from database import get_db from schemas.cls_mgmt_schema import ClsMgmtCreate, ClsMgmtUpdate, ClsMgmtOut router = APIRouter() def _to_detail(cls) -> dict: """把班级实体组装成详情响应:基础字段 + 班主任/主讲老师姓名 + 在班人数。""" data = ClsMgmtOut.model_validate(cls).model_dump() data["head_teacher_name"] = cls.head_teacher.name if cls.head_teacher else None data["lecturer_name"] = cls.lecturer.name if cls.lecturer else None data["student_count"] = sum(1 for s in cls.stu if not s.is_deleted) return data @router.get("", summary="分页查询班级列表") def list_classes( page: int = Query(1, ge=1, description="页码"), size: int = Query(10, ge=1, le=100, description="每页数量"), head_tea_id: Optional[str] = Query(None, description="按班主任id过滤"), lecturer_id: Optional[str] = Query(None, description="按主讲老师id过滤"), db: Session = Depends(get_db), ): total, items = cls_mgmt_dao.list_classes( db, page=page, size=size, head_tea_id=head_tea_id, lecturer_id=lecturer_id ) return { "total": total, "page": page, "size": size, "items": [ClsMgmtOut.model_validate(x) for x in items], } @router.get("/{cls_id}", summary="查询单个班级详情") def get_class(cls_id: str, db: Session = Depends(get_db)): """查询班级详情,附带班主任/主讲老师姓名与在班学生数。""" return _to_detail(cls_mgmt_dao.assert_cls_alive(db, cls_id, "班级不存在或已删除")) @router.post("", response_model=ClsMgmtOut, status_code=201, summary="新增班级") def create_class(payload: ClsMgmtCreate, db: Session = Depends(get_db)): """新增班级(编号唯一、两位教师必须存在,由 DAO 校验)。""" return cls_mgmt_dao.create_class(db, payload.model_dump()) @router.put("/{cls_id}", response_model=ClsMgmtOut, summary="更新班级信息") def update_class(cls_id: str, payload: ClsMgmtUpdate, db: Session = Depends(get_db)): """按传入字段局部更新班级信息。""" return cls_mgmt_dao.update_class(db, cls_id, payload.model_dump(exclude_unset=True)) @router.delete("/{cls_id}", summary="删除班级(软删除)") def delete_class(cls_id: str, db: Session = Depends(get_db)): """软删除班级。""" cls_mgmt_dao.soft_delete_class(db, cls_id) return {"message": "删除成功", "id": cls_id}