Files
student-management-system/dao/advisor_dao.py
T
2026-09-18 16:53:21 +08:00

65 lines
2.0 KiB
Python

# 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()