238 lines
9.6 KiB
Python
238 lines
9.6 KiB
Python
# student_dao:所有数据库的逻辑
|
|
|
|
from students.model.students_model import Students
|
|
from students.schema.students_request import *
|
|
from fastapi import HTTPException
|
|
|
|
# 查询
|
|
def get_student_dao( s , db):
|
|
q = db.query(Students).filter(Students.is_deleted == False)
|
|
if s.get('id'):
|
|
q = q.filter( Students.id == s.get("id") )
|
|
if s.get('num'):
|
|
q = q.filter( Students.num == s.get("num") )
|
|
if s.get('name'):
|
|
q = q.filter( Students.name == s.get("name") )
|
|
if s.get('age'):
|
|
q = q.filter( Students.age == s.get("age") )
|
|
if s.get('sex'):
|
|
q = q.filter( Students.sex == s.get("sex") )
|
|
if s.get('home_Place'):
|
|
q = q.filter( Students.home_Place == s.get("home_Place") )
|
|
if s.get('college'):
|
|
q = q.filter( Students.college == s.get("college") )
|
|
if s.get('specialty'):
|
|
q = q.filter( Students.specialty == s.get("specialty") )
|
|
if s.get('enrollment_time'):
|
|
q = q.filter( Students.enrollment_time == s.get("enrollment_time") )
|
|
if s.get('graduate_time'):
|
|
q = q.filter( Students.graduate_time == s.get("graduate_time") )
|
|
if s.get('education'):
|
|
q = q.filter( Students.education == s.get("education") )
|
|
if s.get('class_id'):
|
|
q = q.filter(Students.class_id == s.get("class_id") )
|
|
if s.get('advisor_id'):
|
|
q = q.filter(Students.advisor_id == s.get("advisor_id") )
|
|
if s.get('phone'):
|
|
q = q.filter(Students.phone == s.get("phone"))
|
|
s1 = q.all()
|
|
if s1:
|
|
return [{ 'id':i.id
|
|
, 'num':i.num
|
|
, 'name':i.name
|
|
, 'age':i.age
|
|
, 'sex':i.sex
|
|
, 'home_Place':i.home_Place
|
|
, 'college':i.college
|
|
, 'specialty':i.specialty
|
|
, 'enrollment_time':i.enrollment_time
|
|
, 'graduate_time':i.graduate_time
|
|
, 'education':i.education
|
|
# 外键字段
|
|
, 'class_id':i.class_id
|
|
, 'advisor_id':i.advisor_id
|
|
# 额外字段
|
|
, 'phone':i.phone
|
|
} for i in s1
|
|
]
|
|
|
|
# 新增
|
|
def add_student_dao( s , db):
|
|
try:
|
|
phone = s.get("phone")
|
|
s1_deleted = db.query( Students ).filter( Students.phone == phone ).first()
|
|
if s1_deleted and s1_deleted.is_deleted == False:
|
|
raise ValueError("该手机号已存在有效学生记录,请勿重复添加")
|
|
if not phone:
|
|
raise ValueError("手机号不能为空")
|
|
if not s.get("class_id") or not s.get("advisor_id"):
|
|
raise ValueError("班级ID和顾问ID不能为空")
|
|
# 查询 classes 表确认 class_id 存在
|
|
from Teachers.model.tea_model import Tea
|
|
s1_class_id = db.query(Tea).filter(Tea.id == s.get("class_id")).first()
|
|
# 查询 teachers 表确认 advisor_id 存在
|
|
s1_advisor_id = db.query(Tea).filter(Tea.id == s.get("advisor_id")).first()
|
|
if not s1_class_id:
|
|
raise ValueError(f"班级ID {s.get('class_id')} 不存在,请先创建班级")
|
|
if not s1_advisor_id:
|
|
raise ValueError(f"顾问ID {s.get('advisor_id')} 不存在,请先创建顾问")
|
|
if s1_deleted and s1_deleted.is_deleted == True:
|
|
s1_deleted.name = s.get("name")
|
|
s1_deleted.age = s.get("age")
|
|
s1_deleted.sex = s.get("sex")
|
|
s1_deleted.home_Place = s.get("home_Place")
|
|
s1_deleted.college = s.get("college")
|
|
s1_deleted.specialty = s.get("specialty")
|
|
s1_deleted.enrollment_time = s.get("enrollment_time")
|
|
s1_deleted.graduate_time = s.get("graduate_time")
|
|
s1_deleted.education = s.get("education")
|
|
# 外键字段
|
|
s1_deleted.class_id = s.get("class_id")
|
|
s1_deleted.advisor_id = s.get("advisor_id")
|
|
# 额外字段
|
|
s1_deleted.phone = s.get("phone")
|
|
|
|
s1_deleted.create_date = datetime.now()
|
|
s1_deleted.update_date = datetime.now()
|
|
s1_deleted.is_deleted = False
|
|
s1_deleted.deleted_date = None
|
|
db.commit()
|
|
db.refresh(s1_deleted) # 从数据库再拉一次数据
|
|
return s1_deleted
|
|
s1 = Students(**s)
|
|
# 显式设置时间,避免 SQLAlchemy 字典构建时跳过 default
|
|
now = datetime.now()
|
|
s1.create_date = now
|
|
s1.update_date = now
|
|
db.add(s1)
|
|
db.commit()
|
|
except ValueError as e:
|
|
# 业务校验异常:回滚并返回错误信息
|
|
db.rollback()
|
|
return {"code": 400, "msg": str(e)}
|
|
except Exception as e:
|
|
# 这里可以加日志
|
|
db.rollback()
|
|
return {"code": 500, "msg": f"系统异常: {str(e)}"}
|
|
else:
|
|
db.refresh(s1)
|
|
return s1
|
|
|
|
# 更新
|
|
def update_student_dao( s , db):
|
|
try:
|
|
phone = s.get("phone")
|
|
if phone is not None and phone != '':
|
|
s1_con = db.query( Students ).filter( Students.phone == phone
|
|
,Students.id != s.get("id")
|
|
,Students.is_deleted == False ).first()
|
|
if s1_con:
|
|
raise HTTPException(status_code=409, detail=f'手机号已被其他学生使用:{phone}')
|
|
s1_id = db.query( Students ).filter( Students.id == s.get("id")
|
|
,Students.is_deleted == False ).first()
|
|
if not s1_id:
|
|
raise HTTPException(status_code=404, detail=f'学生不存在:id={s.get("id")}')
|
|
if s.get("num") is not None:
|
|
s1_id.num = s.get("num")
|
|
if s.get("name") is not None:
|
|
s1_id.name = s.get("name")
|
|
if s.get("age") is not None:
|
|
s1_id.age = s.get("age")
|
|
if s.get("sex") is not None:
|
|
s1_id.sex = s.get("sex")
|
|
if s.get("home_Place") is not None:
|
|
s1_id.home_Place = s.get("home_Place")
|
|
if s.get("college") is not None:
|
|
s1_id.college = s.get("college")
|
|
if s.get("specialty") is not None:
|
|
s1_id.specialty = s.get("specialty")
|
|
if s.get("enrollment_time") is not None:
|
|
s1_id.enrollment_time = s.get("enrollment_time")
|
|
if s.get("graduate_time") is not None:
|
|
s1_id.graduate_time = s.get("graduate_time")
|
|
if s.get("education") is not None:
|
|
s1_id.education = s.get("education")
|
|
# 外键字段
|
|
if s.get("class_id") is not None:
|
|
s1_id.class_id = s.get("class_id")
|
|
if s.get("advisor_id") is not None:
|
|
s1_id.advisor_id = s.get("advisor_id")
|
|
# 额外字段
|
|
if s.get("phone") is not None:
|
|
s1_id.phone = s.get("phone")
|
|
s1_id.update_date = datetime.now()
|
|
db.commit()
|
|
except HTTPException:
|
|
raise
|
|
except Exception:
|
|
db.rollback()
|
|
raise
|
|
else:
|
|
db.refresh(s1_id) # 从数据库再拉一次数据
|
|
return s1_id
|
|
|
|
|
|
# 逻辑删除/软删除
|
|
def delete_student_dao( s , db):
|
|
try:
|
|
if not any([ s.get("id")
|
|
,s.get("num")
|
|
,s.get("name")
|
|
,s.get("age")
|
|
,s.get("sex")
|
|
,s.get("home_Place")
|
|
,s.get("college")
|
|
,s.get("specialty")
|
|
,s.get("enrollment_time")
|
|
,s.get("graduate_time")
|
|
,s.get("education")
|
|
,s.get("class_id")
|
|
,s.get("advisor_id")
|
|
,s.get("phone")
|
|
]):
|
|
raise HTTPException(status_code=400, detail="输入需要删除的学生信息,删除条件任选,但不可全为空。")
|
|
q = db.query(Students).filter(Students.is_deleted == False)
|
|
if s.get('id'):
|
|
q = q.filter(Students.id == s.get("id") )
|
|
if s.get('num'):
|
|
q = q.filter(Students.num == s.get("num"))
|
|
if s.get('name'):
|
|
q = q.filter(Students.name == s.get("name") )
|
|
if s.get('age'):
|
|
q = q.filter(Students.age == s.get("age") )
|
|
if s.get('sex'):
|
|
q = q.filter(Students.sex == s.get("sex"))
|
|
if s.get('home_Place'):
|
|
q = q.filter(Students.home_Place == s.get("home_Place") )
|
|
if s.get('college'):
|
|
q = q.filter(Students.college == s.get("college") )
|
|
if s.get('specialty'):
|
|
q = q.filter(Students.specialty == s.get("specialty"))
|
|
if s.get('enrollment_time'):
|
|
q = q.filter(Students.enrollment_time == s.get("enrollment_time") )
|
|
if s.get('graduate_time'):
|
|
q = q.filter(Students.graduate_time == s.get("graduate_time"))
|
|
if s.get('education'):
|
|
q = q.filter(Students.education == s.get("education") )
|
|
if s.get('class_id'):
|
|
q = q.filter(Students.class_id == s.get("class_id") )
|
|
if s.get('advisor_id'):
|
|
q = q.filter(Students.advisor_id == s.get("advisor_id") )
|
|
if s.get("phone"):
|
|
q = q.filter(Students.phone == s.get("phone") )
|
|
s1_delete = q.all()
|
|
if not s1_delete:
|
|
raise HTTPException(status_code=404, detail="没有找到该学生。")
|
|
for i in s1_delete:
|
|
i.is_deleted = True
|
|
i.deleted_date = datetime.now()
|
|
# s2_deleted =[{"id":i.id,"name":i.name,"phone":i.phone}for i in s1_delete]
|
|
except HTTPException:
|
|
raise
|
|
except Exception:
|
|
db.rollback()
|
|
raise HTTPException(status_code=500, detail="Internal server error")
|
|
else:
|
|
db.commit()
|
|
return s1_delete
|