176 lines
6.2 KiB
Python
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
|