72 lines
2.3 KiB
Python
72 lines
2.3 KiB
Python
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
|