就业模块合并
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from model.wl_emp_model import Emp
|
||||
from model.wl_student_model import Student
|
||||
from scheme.wl_emp_scheme import EmpCreate, EmpUpdate
|
||||
|
||||
|
||||
class EmpDAO:
|
||||
|
||||
@staticmethod
|
||||
def get_student(db: Session, stu_no: str):
|
||||
"""按学号查未删除的学生"""
|
||||
return db.query(Student).filter(
|
||||
Student.stu_no == stu_no,
|
||||
Student.is_deleted == 0,
|
||||
).first()
|
||||
|
||||
@staticmethod
|
||||
def list_emps(db: Session, skip: int = 0, limit: int = 100, company_name: str = None):
|
||||
"""查询就业列表,顺带把学生姓名带上"""
|
||||
q = db.query(Emp).filter(Emp.is_deleted == 0)
|
||||
if company_name:
|
||||
q = q.filter(Emp.company_name.like(f"%{company_name}%"))
|
||||
|
||||
emp_list = q.offset(skip).limit(limit).all()
|
||||
for e in emp_list:
|
||||
stu = db.query(Student).filter(
|
||||
Student.stu_no == e.stu_no,
|
||||
Student.is_deleted == 0,
|
||||
).first()
|
||||
e.stu_name = stu.stu_name if stu else None
|
||||
return emp_list
|
||||
|
||||
@staticmethod
|
||||
def get_emp(db: Session, stu_no: str):
|
||||
"""按学号查就业信息"""
|
||||
emp = db.query(Emp).filter(
|
||||
Emp.stu_no == stu_no,
|
||||
Emp.is_deleted == 0,
|
||||
).first()
|
||||
if emp:
|
||||
stu = EmpDAO.get_student(db, stu_no)
|
||||
emp.stu_name = stu.stu_name if stu else None
|
||||
return emp
|
||||
|
||||
@staticmethod
|
||||
def create_emp(db: Session, emp_data: EmpCreate):
|
||||
"""新增就业信息;如果这个学生之前被删过,就把那条记录复活"""
|
||||
# stu_no 是主键,已删除的记录也占着这个主键,所以查的时候要连已删除的一起查
|
||||
exist = db.query(Emp).filter(Emp.stu_no == emp_data.stu_no).first()
|
||||
if exist and exist.is_deleted == 0:
|
||||
raise ValueError("该学生的就业信息已存在")
|
||||
|
||||
# exclude_none:没传的字段不写进去,交给数据库默认值
|
||||
data = emp_data.model_dump(exclude_none=True)
|
||||
stu = EmpDAO.get_student(db, emp_data.stu_no)
|
||||
|
||||
if exist:
|
||||
# 复活旧记录
|
||||
for k, v in data.items():
|
||||
setattr(exist, k, v)
|
||||
exist.is_deleted = 0
|
||||
db.commit()
|
||||
db.refresh(exist)
|
||||
exist.stu_name = stu.stu_name if stu else None
|
||||
return exist
|
||||
|
||||
db_emp = Emp(**data)
|
||||
db.add(db_emp)
|
||||
db.commit()
|
||||
db.refresh(db_emp)
|
||||
db_emp.stu_name = stu.stu_name if stu else None
|
||||
return db_emp
|
||||
|
||||
@staticmethod
|
||||
def update_emp(db: Session, stu_no: str, emp_data: EmpUpdate):
|
||||
"""修改就业信息"""
|
||||
db_emp = EmpDAO.get_emp(db, stu_no)
|
||||
if not db_emp:
|
||||
return None
|
||||
|
||||
update_dict = emp_data.model_dump(exclude_unset=True)
|
||||
for k, v in update_dict.items():
|
||||
setattr(db_emp, k, v)
|
||||
|
||||
db.commit()
|
||||
db.refresh(db_emp)
|
||||
return db_emp
|
||||
|
||||
@staticmethod
|
||||
def delete_emp(db: Session, stu_no: str):
|
||||
"""逻辑删除,修改 is_deleted=1"""
|
||||
db_emp = EmpDAO.get_emp(db, stu_no)
|
||||
if not db_emp:
|
||||
return None
|
||||
|
||||
db_emp.is_deleted = 1
|
||||
db.commit()
|
||||
return db_emp
|
||||
@@ -136,7 +136,7 @@ class StatisticDao:
|
||||
Emp.company_name
|
||||
).select_from(Student) \
|
||||
.join(Student.emp)) \
|
||||
.filter(Student.is_deleted==0) \
|
||||
.filter(Student.is_deleted==0, Emp.is_deleted==0) \
|
||||
.order_by(Emp.salary.desc())\
|
||||
.limit(rank)
|
||||
|
||||
@@ -151,11 +151,12 @@ class StatisticDao:
|
||||
0,
|
||||
).label('emp_total_time')
|
||||
|
||||
# 逻辑删除条件写在 ON 里,写进 where 会变成 INNER JOIN,未就业学生会被滤掉
|
||||
q=db.query(
|
||||
Student.stu_name,
|
||||
emp_total_time,
|
||||
).select_from(Student) \
|
||||
.outerjoin(Student.emp) \
|
||||
.outerjoin(Emp, and_(Student.stu_no == Emp.stu_no, Emp.is_deleted == 0)) \
|
||||
.filter(Student.is_deleted==0)
|
||||
|
||||
return q.all()
|
||||
@@ -188,7 +189,8 @@ class StatisticDao:
|
||||
.outerjoin(
|
||||
Emp,
|
||||
and_(
|
||||
Emp.stu_id == Student.stu_id,
|
||||
Emp.stu_no == Student.stu_no,
|
||||
Emp.is_deleted == 0,
|
||||
Emp.emp_open_time.isnot(None),
|
||||
Emp.offer_time.isnot(None),
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user