# api/advisor_api.py # 顾问信息管理模块:接口层只负责 HTTP 出入参,查库/校验/事务交给 dao.advisor_dao from typing import Optional from fastapi import APIRouter, Depends, Query from sqlalchemy.orm import Session from dao import advisor_dao from database import get_db from schemas.advisor_schema import AdvisorCreate, AdvisorUpdate, AdvisorOut router = APIRouter() @router.get("", summary="分页查询顾问列表") def list_advisors( page: int = Query(1, ge=1, description="页码"), size: int = Query(10, ge=1, le=100, description="每页数量"), name: Optional[str] = Query(None, description="按姓名模糊查询"), db: Session = Depends(get_db), ): total, items = advisor_dao.list_advisors(db, page=page, size=size, name=name) return { "total": total, "page": page, "size": size, "items": [AdvisorOut.model_validate(x) for x in items], } @router.get("/{adv_id}", summary="查询单个顾问详情") def get_advisor(adv_id: str, db: Session = Depends(get_db)): """查询顾问详情,附带其负责的学生编号与人数。""" advisor = advisor_dao.assert_advisor_alive(db, adv_id, "顾问不存在或已删除") data = AdvisorOut.model_validate(advisor).model_dump() student_ids = [s.id for s in advisor.students if not s.is_deleted] data["student_ids"] = student_ids data["student_count"] = len(student_ids) return data @router.post("", response_model=AdvisorOut, status_code=201, summary="新增顾问") def create_advisor(payload: AdvisorCreate, db: Session = Depends(get_db)): """新增顾问(编号唯一,由 DAO 校验)。""" return advisor_dao.create_advisor(db, payload.model_dump()) @router.put("/{adv_id}", response_model=AdvisorOut, summary="更新顾问信息") def update_advisor(adv_id: str, payload: AdvisorUpdate, db: Session = Depends(get_db)): """按传入字段局部更新顾问信息。""" return advisor_dao.update_advisor(db, adv_id, payload.model_dump(exclude_unset=True)) @router.delete("/{adv_id}", summary="删除顾问(软删除)") def delete_advisor(adv_id: str, db: Session = Depends(get_db)): """软删除顾问。""" advisor_dao.soft_delete_advisor(db, adv_id) return {"message": "删除成功", "id": adv_id}