Files
2026-09-21 17:30:02 +08:00

167 lines
4.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# path: dao/employment_dao.py
# time:2026年9月12日10:52
# title:就业信息数据库操作
# author:周兴
# info:负责就业信息的增、查、改、逻辑删除,DAO是Data Access Object 数据访问对象
from sqlalchemy.orm import Session
from model import Student
from model.employment_model import Employment
from schema.employment_schema import EmploymentCreate, EmploymentUpdate
def validate_employment_times(start, offer):
"""允许未确定日期;两项均填写时,Offer 时间必须不早于开放时间。"""
if start is not None and offer is not None:
if offer < start:
raise ValueError("Offer 下发时间不能早于就业开放时间,请调整后再保存。")
# 新增就业信息
def create_employment(
db: Session,
employment_data: EmploymentCreate
):
validate_employment_times(employment_data.employment_start_time, employment_data.offer_time)
# 创建 Employment ORM 对象
new_employment = Employment(
student_id=employment_data.student_id,
employment_start_time=employment_data.employment_start_time,
offer_time=employment_data.offer_time,
company_name=employment_data.company_name,
salary=employment_data.salary
)
# 添加到数据库会话
db.add(new_employment)
# 提交事务
db.commit()
# 刷新对象,获取数据库生成的id信息
db.refresh(new_employment)
return new_employment
# 查询就业信息(多条件查询)
def search_employments(
db: Session,
student_id: int | None = None,
company_name: str | None = None,
min_salary: float | None = None,
max_salary: float | None = None
):
# 先查询所有没有被逻辑删除的数据
query = db.query(Employment).filter(
Employment.flag == 1
)
# 按学生ID查询
if student_id is not None:
query = query.filter(
Employment.student_id == student_id
)
# 按公司名称查询
if company_name is not None:
query = query.filter(
Employment.company_name == company_name
)
# 最低工资
if min_salary is not None:
query = query.filter(
Employment.salary >= min_salary
)
# 最高工资
if max_salary is not None:
query = query.filter(
Employment.salary <= max_salary
)
return query.all()
# 修改就业信息(根据 student_id 进行修改)
def update_employment(
db: Session,
student_id: int,
employment_data: EmploymentUpdate,
):
# 根据student_id查就业信息
employment = db.query(Employment).filter(
Employment.student_id == student_id,
Employment.flag == 1
).first()
if employment is None:
return None
# 先校验合并后的时间,再修改对象;省略或 null 保持原值。
start = employment_data.employment_start_time if employment_data.employment_start_time is not None else employment.employment_start_time
offer = employment_data.offer_time if employment_data.offer_time is not None else employment.offer_time
validate_employment_times(start, offer)
if employment_data.employment_start_time is not None:
employment.employment_start_time = employment_data.employment_start_time
if employment_data.offer_time is not None:
employment.offer_time = employment_data.offer_time
if employment_data.company_name is not None:
employment.company_name = employment_data.company_name
if employment_data.salary is not None:
employment.salary = employment_data.salary
db.commit()
db.refresh(employment)
return employment
# 逻辑删除就业信息 (根据 student_id 逻辑删除)
def delete_employment(
db: Session,
student_id: int
):
employment = db.query(Employment).filter(
Employment.student_id == student_id,
Employment.flag == 1
).first()
if employment is None:
return None
# 逻辑删除
employment.flag = 0
db.commit()
db.refresh(employment)
return employment
# 判断学生是否存在
# 如果student表里面student_id已经存在,就返回Student ORM对象
# 如果student表里面student_id不存在,返回None
def check_student_exists(
db: Session,
student_id: int
):
student = db.query(Student).filter(
Student.sid == student_id,
Student.flag == 1
).first()
return student
# 判断学生是否已经存在就业信息
# 避免给已经有就业信息的学生再次插入就业信息时抛出500异常
def check_employment_exists(
db: Session,
student_id: int
):
employment = db.query(Employment).filter(
Employment.student_id == student_id,
Employment.flag == 1
).first()
return employment