学生信息管理系统
This commit is contained in:
@@ -0,0 +1,175 @@
|
||||
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
|
||||
Reference in New Issue
Block a user