Files
xit/sqlalchemy_fastapi_demo/dao/employment.py
T
2026-09-21 19:14:15 +08:00

176 lines
6.2 KiB
Python

from fastapi import HTTPException
from sqlalchemy.orm import Session
from sqlalchemy import and_, Date
from model.employment import EmploymentBase,EmploymentOffer
from model.students import Student
# ========== 就业基础信息 DAO ==========
class EmploymentBaseDAO:
@staticmethod
#根据学生编号查询
def get_by_stu_id(db: Session, stu_id: int):
record = db.query(EmploymentBase).filter(and_(
EmploymentBase.stu_id == stu_id,
EmploymentBase.is_deleted == 0
)).first()
return record
@staticmethod
#多条件查询
def different_choice_query(
db: Session,
stu_id: int = None,
company_name: str = None,
min_salary: float = None,
max_salary: float = None,
skip: int = 0,
limit: int = 10
):
# 基础查询 + 过滤未删除
query = db.query(EmploymentBase).filter(EmploymentBase.is_deleted == 0)
# 动态拼接条件
#学生id查询
if stu_id is not None:
query = query.filter(EmploymentBase.stu_id == stu_id)
#公司名称查询
if company_name is not None and company_name.strip() != "":
# 模糊匹配,%代表通配符
query = query.filter(EmploymentBase.company_name.like(f"%{company_name}%"))
#工资范围查询
if min_salary is not None:
query = query.filter(EmploymentBase.salary >= min_salary)
if max_salary is not None:
query = query.filter(EmploymentBase.salary <= max_salary)
# 分页
result = query.offset(skip).limit(limit).all()
return result
@staticmethod
#新增学生就业基础信息
def create(db: Session, obj: EmploymentBase):
student = db.query(Student).filter(
Student.stu_id == obj.stu_id,
Student.is_deleted == 0
).first()
if not student:
raise HTTPException(status_code=400, detail="学生不存在或已逻辑删除,不能添加就业信息")
db.add(obj)
db.commit()
db.refresh(obj)
return obj
@staticmethod
#更新就业基础信息
def update(db: Session, stu_id: int, update_data: dict):
record = EmploymentBaseDAO.get_by_stu_id(db, stu_id)
if not record:
return None
if "company_name" in update_data:
record.company_name = update_data["company_name"]
if "salary" in update_data:
record.salary = update_data["salary"]
if "employment_open_time" in update_data:
record.employment_open_time = update_data["employment_open_time"]
if "job_time" in update_data:
record.job_time = update_data["job_time"]
# =========== 统一时间校验 ===========
final_emp_open = record.employment_open_time
final_job = record.job_time
# 两个时间都不为空才校验
if final_emp_open and final_job:
if final_job < final_emp_open:
raise ValueError("job时间不能早于就业开放时间")
db.commit()
db.refresh(record)
return record
@staticmethod
#根据学生编号对就业基础表进行逻辑删除
def delete(db: Session, stu_id: int):
record = EmploymentBaseDAO.get_by_stu_id(db, stu_id)
if not record:
return False
record.is_deleted = 1
db.commit()
return True
# ========== 就业Offer协议 DAO ==========
class EmploymentOfferDAO:
@staticmethod
#添加就业协议记录
def create(db: Session, obj_1: EmploymentOffer,obj_2:EmploymentBase):
# 时间校验
if obj_1.offer_time < obj_2.employment_open_time:
raise ValueError("offer时间不能早于就业开放时间")
db.add(obj_1)
db.commit()
db.refresh(obj_1)
return obj_1
@staticmethod
#修改就业协议表
def update(db: Session, stu_id: int, offer_id: int, offer_time:Date):
"""修改offer"""
record_list = EmploymentOfferDAO.different_choice_query(db, stu_id, offer_id)
if not record_list:
return None
record = record_list[0]
#查询就业基础信息,拿到就业开放时间准备做时间校验
base_record = db.query(EmploymentBase).filter(
EmploymentBase.stu_id == stu_id,
EmploymentBase.is_deleted == 0
).first()
#避免就业基础信息被逻辑删除了而就业基础协议记录还存在
if not base_record:
raise ValueError("未找到该学生就业基础信息")
#时间校验
if offer_time is not None:
if offer_time < base_record.employment_open_time:
raise ValueError("offer时间不能早于就业开放时间")
record.offer_time = offer_time
db.commit()
db.refresh(record)
return record
@staticmethod
#根据协议编号对就业协议表进行逻辑删除
def delete(db: Session, stu_id: int,offer_id: int):
"""offer逻辑删除"""
record_list = EmploymentOfferDAO.different_choice_query(db, stu_id,offer_id)
if not record_list:
return False
record = record_list[0]
record.is_deleted = 1
db.commit()
return True
@staticmethod
#多条件查询就业协议表
def different_choice_query(
db: Session,
stu_id: int =None ,
offer_id: int = None,
skip: int = 0,
limit: int = 10
):
#基础查询+过滤未删除
query = db.query(EmploymentOffer).filter(EmploymentOffer.is_deleted == 0)
#动态拼接条件
#学生id查询(选填)
if stu_id is not None:
query = query.filter(EmploymentOffer.stu_id == stu_id)
# 同时传了offer编号 → 查单个(联合主键两个都查)
if offer_id is not None:
query = query.filter(EmploymentOffer.offer_id == offer_id)
elif stu_id is None and offer_id is not None:
raise ValueError("不能单独查询offer编号,必须同时提供学生编号")
# 分页
result = query.offset(skip).limit(limit).all()
return result