就业模块合并

This commit is contained in:
pzc
2026-09-13 22:46:47 +08:00
parent 5156da5a7c
commit 109f9c7862
8 changed files with 203 additions and 25 deletions
+99
View File
@@ -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
+5 -3
View File
@@ -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),
),