# dao/advisor_dao.py # 顾问信息数据访问层 from typing import List, Optional, Tuple from sqlalchemy.orm import Session from dao.exceptions import ConflictError, NotFoundError from dao.pagination import paginate from model.advisor_model import AdvisorInfo def assert_advisor_alive(db: Session, adv_id: str, detail: Optional[str] = None) -> AdvisorInfo: """ 确认顾问存在且未删除,否则抛 NotFoundError。 供学生模块复用作外键校验。 """ advisor = db.query(AdvisorInfo).filter(AdvisorInfo.id == adv_id, AdvisorInfo.is_deleted == 0).first() if not advisor: raise NotFoundError(detail or f"顾问 {adv_id} 不存在") return advisor def list_advisors( db: Session, page: int, size: int, name: Optional[str] = None, ) -> Tuple[int, List[AdvisorInfo]]: """分页查询顾问,支持按姓名模糊查询。""" query = db.query(AdvisorInfo).filter(AdvisorInfo.is_deleted == 0) if name: query = query.filter(AdvisorInfo.name.like(f"%{name}%")) return paginate(query, page, size, order_by=AdvisorInfo.id) def create_advisor(db: Session, data: dict) -> AdvisorInfo: """新增顾问:校验编号唯一(主键,含已删除记录)。""" if db.query(AdvisorInfo).filter(AdvisorInfo.id == data["id"]).first(): raise ConflictError("顾问编号已存在") advisor = AdvisorInfo(**data) db.add(advisor) db.commit() db.refresh(advisor) return advisor def update_advisor(db: Session, adv_id: str, data: dict) -> AdvisorInfo: """更新顾问信息。""" advisor = assert_advisor_alive(db, adv_id, "顾问不存在或已删除") for field, value in data.items(): setattr(advisor, field, value) db.commit() db.refresh(advisor) return advisor def soft_delete_advisor(db: Session, adv_id: str) -> None: """软删除顾问。""" advisor = assert_advisor_alive(db, adv_id, "顾问不存在或已删除") advisor.is_deleted = 1 db.commit()