from fastapi import HTTPException from sqlalchemy.orm import Session from model.wl_advisor_model import Advisor from model.wl_student_model import Student from scheme.wl_advisor_scheme import AdvisorCreate, AdvisorUpdate # ---- 增 ---- def create_advisor(db: Session, data: AdvisorCreate) -> Advisor: db_advisor = Advisor(**data.model_dump()) db.add(db_advisor) db.commit() db.refresh(db_advisor) return db_advisor # ---- 查(多条件 + 分页)---- def list_advisors(db: Session, adv_name=None, adv_phone=None, adv_region=None, adv_gender=None, skip: int = 0, limit: int = 100): q = db.query(Advisor).filter(Advisor.is_deleted == 0) if adv_name: q = q.filter(Advisor.adv_name.like(f"%{adv_name}%")) if adv_phone: q = q.filter(Advisor.adv_phone.like(f"%{adv_phone}%")) if adv_region: q = q.filter(Advisor.adv_region.like(f"%{adv_region}%")) if adv_gender: q = q.filter(Advisor.adv_gender == adv_gender) # 后录进来的顾问排前面,方便前端看到最新数据 return q.order_by(Advisor.adv_id.desc()).offset(skip).limit(limit).all() # ---- 根据编号查单个顾问 ---- def get_advisor_by_id(db: Session, adv_id: int) -> Advisor | None: return db.query(Advisor).filter( Advisor.adv_id == adv_id, Advisor.is_deleted == 0, ).first() # ---- 改 ---- def update_advisor(db: Session, adv_id: int, data: AdvisorUpdate) -> Advisor | None: db_advisor = get_advisor_by_id(db, adv_id) if not db_advisor: return None # exclude_unset:前端传了什么就改什么,没传的字段保持原值 for k, v in data.model_dump(exclude_unset=True).items(): setattr(db_advisor, k, v) db.commit() db.refresh(db_advisor) return db_advisor # ---- 逻辑删除 ---- def delete_advisor(db: Session, adv_id: int) -> bool: db_advisor = get_advisor_by_id(db, adv_id) if not db_advisor: return False # 名下还挂着学生就不给删,处理方式和班级模块 delete_class 保持一致 student = db.query(Student).filter( Student.advisor_id == adv_id, Student.is_deleted == 0, ).first() if student: raise HTTPException(status_code=400, detail="该顾问名下还有学生,不能删除!") db_advisor.is_deleted = 1 db.commit() return True