# api/employment_api.py # 本文件定义学生就业信息相关的所有 API 路由(Controller 层) from typing import List, Optional from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.orm import Session # 注意:下面的导入全部去掉了 sqlalchemy_fastapi_demo. 前缀! from database import get_db from dao.employment import EmploymentBaseDAO, EmploymentOfferDAO from model.employment import EmploymentBase, EmploymentOffer from scheme.employment import ( EmploymentOfferUpdate, EmploymentBaseUpdate, EmploymentBaseCreate, EmploymentOfferCreate, EmploymentQuery, EmploymentOfferQueryResponse, EmploymentBaseQueryResponse ) router = APIRouter() #-----------多条件查询就业协议信息----------- @router.get("/offer/search/",response_model=List[EmploymentOfferQueryResponse],summary="多条件查询就业协议信息") def search_offer( stu_id: Optional[int] = Query(None, description="学生学号"), offer_id: Optional[int] = Query(None, description="offer编号,需同时提供学生编号"), skip: int = Query(0, ge=0, description="跳过的记录条数"), limit: int = Query(10, ge=1, le=200, description="返回最大记录数"), db: Session = Depends(get_db) ): #捕获异常 try: data_list = EmploymentOfferDAO.different_choice_query( db=db, stu_id=stu_id, offer_id=offer_id, skip=skip, limit=limit ) except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) return data_list #-----------多条件查询就业基础信息----------- @router.get("/base/search/",response_model=List[EmploymentBaseQueryResponse],summary="多条件查询就业基础信息") def search_base( query: EmploymentQuery = Depends(), skip: int = Query(0, ge=0, description="跳过的记录条数"), limit: int = Query(10, ge=1, le=200, description="返回最大记录数"), db: Session = Depends(get_db) ): # 多条件筛选就业基础信息 + 分页 if query.min_salary is not None and query.max_salary is not None and query.min_salary > query.max_salary: raise HTTPException(status_code=400, detail="最低薪资不能大于最高薪资") data_list = EmploymentBaseDAO.different_choice_query( db=db, stu_id=query.stu_id, company_name=query.company_name, min_salary=query.min_salary, max_salary=query.max_salary, skip=skip, limit=limit ) return data_list #-----------添加就业基础信息----------- @router.post("/base/add/",response_model=EmploymentBaseQueryResponse,summary="添加就业基础信息") def add_base(obj: EmploymentBaseCreate, db: Session = Depends(get_db)): items = EmploymentBaseDAO.get_by_stu_id(db, obj.stu_id) if items: raise HTTPException(status_code=400, detail="该学生的就业基础信息已存在,不可重复新增") new_obj = EmploymentBase( stu_id=obj.stu_id, employment_open_time=obj.employment_open_time, job_time=obj.job_time, company_name=obj.company_name, salary=obj.salary, is_deleted=0 ) res = EmploymentBaseDAO.create(db, new_obj) return res #-----------添加就业协议信息----------- @router.post("/offer/add/",response_model=EmploymentOfferQueryResponse,summary="添加就业协议信息") def add_offer(obj: EmploymentOfferCreate, db: Session = Depends(get_db)): new_obj = EmploymentOffer( stu_id=obj.stu_id, offer_id=obj.offer_id, offer_time=obj.offer_time, is_deleted=0 ) res = EmploymentOfferDAO.create(db, new_obj) return res #-----------修改就业基础信息----------- @router.put("/base/{stu_id}/",response_model=EmploymentBaseQueryResponse,summary="修改就业基础信息") def update_base(stu_id: int, obj: EmploymentBaseUpdate, db: Session = Depends(get_db)): update_data = obj.model_dump(exclude_unset=True) try: res = EmploymentBaseDAO.update(db, stu_id, update_data) except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) if not res: raise HTTPException(status_code=404, detail="未找到该学生就业基础信息") return res #-----------修改就业协议信息----------- @router.put("/offer/{offer_id}", response_model=EmploymentOfferQueryResponse,summary="修改就业协议信息") def update_offer(stu_id:int,offer_id: int, obj: EmploymentOfferUpdate, db: Session = Depends(get_db)): # offer 表主键是 (stu_id, offer_id),定位记录需要两者 try: res = EmploymentOfferDAO.update(db, stu_id, offer_id, obj.offer_time) except ValueError as e: # 捕获校验异常,返回标准400错误给前端 raise HTTPException(status_code=400, detail=str(e)) if not res: raise HTTPException(status_code=404, detail="未找到该就业协议记录") return res #-----------逻辑删除就业基础信息----------- @router.delete("/base/{stu_id}/",summary="删除就业基础信息") def delete_base(stu_id: int, db: Session = Depends(get_db)): ok = EmploymentBaseDAO.delete(db, stu_id) if not ok: raise HTTPException(status_code=404, detail="记录不存在或已经删除") return {"code": 200, "msg": "删除成功"} #-----------逻辑删除就业协议信息----------- @router.delete("/offer/{stu_id}/{offer_id}",summary="修改就业协议信息") def delete_offer(stu_id: int, offer_id: int, db: Session = Depends(get_db)): ok = EmploymentOfferDAO.delete(db, stu_id, offer_id) if not ok: raise HTTPException(status_code=404, detail="记录不存在或已经删除") return {"code": 200, "msg": "删除成功"}