Files
DoubaoTeam/dao/teacher.py
T

240 lines
8.6 KiB
Python
Raw Normal View History

2026-09-21 18:46:42 +08:00
from sqlalchemy.orm import Session
from core import database
from models.teacher import Teacher
from models.class_teacher import ClassTeachers
from schemas.teacher import TeacherUpdate, TeacherCreate,ClassTeachersCreate
from utils.code_generator import generate_no
from fastapi import HTTPException
'''
本文件内容为老师表与班级老师关系表的增删改查函数集合
'''
#================老师表Teacher的CRUD================
#查询所有未被删除的老师
def get_teacher_list(db:Session, teacher_id:int):
teacher = get_teacher_by_id(db, teacher_id)
if not teacher:
raise HTTPException(status_code=404, detail="老师不存在或已删除!")
#查询老师列表,过滤逻辑删除
return db.query(Teacher).filter(Teacher.is_deleted == 0).all()
#根据id,查询单个符合条件的老师
def get_teacher_by_id(db:Session,teacher_id:int):
return db.query(Teacher).filter(Teacher.id == teacher_id
,Teacher.is_deleted == 0).first()
#新增
def create_teacher(db:Session,obj:TeacherCreate):
'''
新增
:param db: Session 数据库会话
:param obj:TeacherCreate 前端传入新增数据
:return: db_teacher 新增成功的ORM对象
业务逻辑:
1、查重:同名有效老师不能重复新增
2、如果前端手动添加teacher_no,校验编号不能和已有有效老师编号重复
3、创建ORM对象加入会话
4、调用generate_no,走动生成业务编号
5、commit提交事务入库,refresh刷新对象
'''
exist_teacher = db.query(Teacher).filter(Teacher.teacher_name == obj.teacher_name
,Teacher.is_deleted == 0).first()
if exist_teacher:
raise HTTPException(status_code=409,detail='该用户已存在')
if obj.teacher_no:
exist_teacher = db.query(Teacher).filter(Teacher.teacher_no == obj
.teacher_no,Teacher.is_deleted == 0).first()
if exist_teacher:
raise HTTPException(status_code=409,detail='老师编号已存在')
#开始添加
data = obj.model_dump(exclude_none=True)
db_teacher = Teacher(**data)
db.add(db_teacher)
# 调用公共函数生成业务编号,内部执行db.flush拿到自增id
generate_no('teacher_no','TCH',db_teacher,db)
db.commit()
db.refresh(db_teacher)
#从数据库重新查询这条记录,刷新 db_teacher 对象。
#作用:同步数据库默认字段的值,例如`created_at`、`updated_at`,拿到数据库里最新的数据,
# 最终返回给前端。
return db_teacher
#更新
def update_teacher(db:Session,teacher_id:int,obj:TeacherUpdate):
"""
修改老师信息,局部更新
:param db: Session 数据库会话
:param teacher_id: int 需要修改的老师id
:param obj: TeacherUpdate 前端传入要修改的字段
:return: db_teacher ORM对象 / None
"""
# 调用get_teacher_by_id校验用户是否存在
db_teacher = get_teacher_by_id(db,teacher_id)
if obj.teacher_name:
exist_teacher = db.query(Teacher).filter(
Teacher.teacher_name == obj.teacher_name,
Teacher.id != teacher_id,
Teacher.is_deleted == 0
).first()
if exist_teacher:
raise HTTPException(status_code=409, detail="该姓名已被其他老师占用!")
if obj.teacher_no:
exist_no = db.query(Teacher).filter(
Teacher.teacher_no == obj.teacher_no,
Teacher.id != teacher_id,
Teacher.is_deleted == 0
).first()
if exist_no:
raise HTTPException(status_code=409, detail="老师编号已被其他老师占用!")
#用户存在,解析键值对,循环使用setattr添加
update_data = obj.model_dump(exclude_none=True)
for k, v in update_data.items():
setattr(db_teacher, k, v)
db.commit()
db.refresh(db_teacher)
return db_teacher
#删除
def delete_teacher(db:Session,teacher_id:int):
"""
逻辑删除老师,不是物理删除;修改is_deleted=1
:param db: Session
:param teacher_id:老师主键id
:return: Teacher ORM对象,找不到返回None
业务限制:老师已经分配班级,则不允许删除,防止脏数据
"""
# 查询目标老师
db_teacher = get_teacher_by_id(db, teacher_id)
if not db_teacher:
return None
# 校验:查询班级老师中间表,判断该老师是否还有有效带班关系
rel = db.query(ClassTeachers).filter(
ClassTeachers.teacher_id == teacher_id,
ClassTeachers.is_deleted == 0
).first()
if rel:
raise HTTPException(
status_code=400,
detail="该老师已分配班级,不能删除,请先解除带班关系!"
)
# 逻辑删除标记
db_teacher.is_deleted = 1
db.commit()
return db_teacher
#==================班级老师中间表 CRUD=====================
#查询
def get_class_teacher_by_class_id(db: Session, class_id: int):
"""
根据班级id,查询该班级所有有效的带班老师关系
:param db: Session
:param class_id:班级主键
:return: list[ClassTeacher]
"""
return (
db.query(ClassTeachers)
.filter(ClassTeachers.class_id == class_id
,ClassTeachers.is_deleted == 0)
.all()
)
#新增
def create_class_teacher(db: Session, obj: ClassTeachersCreate):
"""
分配老师到班级,新增班级-老师关系记录
:param db: Session
:param obj: ClassTeacherCreate class_id、teacher_id、role
:return: ClassTeacher ORM对象
校验:
1.老师必须存在且未删除
2.同一班级同一个老师同一个角色不能重复分配
"""
# 校验老师是否存在
teacher = get_teacher_by_id(db, obj.teacher_id)
if not teacher:
raise HTTPException(status_code=404, detail="老师不存在或已删除!")
# 查重:同一班级+同一老师+同一角色不能重复分配
rel = db.query(ClassTeachers).filter(
ClassTeachers.class_id == obj.class_id,
ClassTeachers.teacher_id == obj.teacher_id,
ClassTeachers.role == obj.role,
ClassTeachers.is_deleted == 0
).first()
if rel:
raise HTTPException(status_code=409, detail="该老师已以相同角色分配到该班级!")
data = obj.model_dump()
db_obj = ClassTeachers(**data)
db.add(db_obj)
db.commit()
db.refresh(db_obj)
return db_obj
#更新
def update_class_teacher_full(db: Session, rel_id: int, obj: ClassTeachersCreate):
"""
完整更新班级老师关系:可修改 class_id、teacher_id、role
:param db: Session
:param rel_id: 中间表主键
:param obj: ClassTeacherCreate 传入的新参数
:return: ClassTeacher ORM对象
校验:
1. 关系记录存在且未删除
2. 如果修改teacher_id,校验老师必须有效存在
3. 校验新组合(class_id+teacher_id+role)不能和其他有效记录重复
"""
# 1. 查询原有记录
db_rel = db.query(ClassTeachers).filter(
ClassTeachers.id == rel_id,
ClassTeachers.is_deleted == 0
).first()
if not db_rel:
return None
# 2. 如果老师ID发生变化,校验老师是否有效
if obj.teacher_id != db_rel.teacher_id:
teacher = get_teacher_by_id(db, obj.teacher_id)
if not teacher:
raise HTTPException(status_code=404, detail="老师不存在或已删除!")
# 3. 查重:新的三元组合不能重复(排除自身这条记录)
exist_rel = db.query(ClassTeachers).filter(
ClassTeachers.class_id == obj.class_id,
ClassTeachers.teacher_id == obj.teacher_id,
ClassTeachers.role == obj.role,
ClassTeachers.is_deleted == 0,
ClassTeachers.id != rel_id
).first()
if exist_rel:
raise HTTPException(status_code=409, detail="该老师已以相同角色分配到该班级!")
# 赋值更新
db_rel.class_id = obj.class_id
db_rel.teacher_id = obj.teacher_id
db_rel.role = obj.role
db.commit()
db.refresh(db_rel)
return db_rel
#删除
def delete_class_teacher(db: Session, rel_id: int):
"""
逻辑删除班级老师带班关系
:param db: Session
:param rel_id: class_teachers表主键id
:return: ClassTeacher ORM对象,找不到返回None
"""
db_obj = (
db.query(ClassTeachers)
.filter(ClassTeachers.id == rel_id, ClassTeachers.is_deleted == 0)
.first()
)
if not db_obj:
return None
db_obj.is_deleted = 1
db.commit()
return db_obj