""" API路由 - 员工管理 """ from typing import Annotated, Optional from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.ext.asyncio import AsyncSession from app.core.database import get_db from app.core.security import get_current_active_user, get_current_manager_user from app.schemas.schemas import ( StaffCreate, StaffUpdate, StaffResponse, ResponseBase ) from app.services.staff_service import StaffService from app.models.models import User router = APIRouter(prefix="/staff", tags=["员工管理"]) @router.get("", summary="获取员工列表") async def get_staff_list( department_id: Optional[int] = Query(None, description="科室ID"), status: Optional[str] = Query(None, description="状态"), keyword: Optional[str] = Query(None, description="搜索关键词"), page: int = Query(1, ge=1, description="页码"), page_size: int = Query(20, ge=1, le=100, description="每页数量"), db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_active_user) ): """获取员工列表""" staff_list, total = await StaffService.get_list( db, department_id, status, keyword, page, page_size ) # 添加科室名称 result = [] for staff in staff_list: staff_dict = StaffResponse.model_validate(staff).model_dump() staff_dict["department_name"] = staff.department.name if staff.department else None result.append(staff_dict) return { "code": 200, "message": "success", "data": result, "total": total, "page": page, "page_size": page_size } @router.get("/{staff_id}", summary="获取员工详情") async def get_staff( staff_id: int, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_active_user) ): """获取员工详情""" staff = await StaffService.get_by_id(db, staff_id) if not staff: raise HTTPException(status_code=404, detail="员工不存在") staff_dict = StaffResponse.model_validate(staff).model_dump() staff_dict["department_name"] = staff.department.name if staff.department else None return {"code": 200, "message": "success", "data": staff_dict} @router.post("", summary="创建员工") async def create_staff( staff_data: StaffCreate, db: AsyncSession = Depends(get_db), current_user: Annotated[User, Depends(get_current_manager_user)] = None ): """创建员工(需要管理员或经理权限)""" # 检查工号是否已存在 existing = await StaffService.get_by_employee_id(db, staff_data.employee_id) if existing: raise HTTPException(status_code=400, detail="工号已存在") staff = await StaffService.create(db, staff_data) return {"code": 200, "message": "创建成功", "data": StaffResponse.model_validate(staff)} @router.put("/{staff_id}", summary="更新员工") async def update_staff( staff_id: int, staff_data: StaffUpdate, db: AsyncSession = Depends(get_db), current_user: Annotated[User, Depends(get_current_manager_user)] = None ): """更新员工(需要管理员或经理权限)""" staff = await StaffService.update(db, staff_id, staff_data) if not staff: raise HTTPException(status_code=404, detail="员工不存在") return {"code": 200, "message": "更新成功", "data": StaffResponse.model_validate(staff)} @router.delete("/{staff_id}", summary="删除员工") async def delete_staff( staff_id: int, db: AsyncSession = Depends(get_db), current_user: Annotated[User, Depends(get_current_manager_user)] = None ): """删除员工(需要管理员或经理权限)""" success = await StaffService.delete(db, staff_id) if not success: raise HTTPException(status_code=404, detail="员工不存在") return {"code": 200, "message": "删除成功"} @router.get("/department/{department_id}", summary="获取科室员工") async def get_department_staff( department_id: int, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_active_user) ): """获取科室下所有员工""" staff_list = await StaffService.get_by_department(db, department_id) return { "code": 200, "message": "success", "data": [StaffResponse.model_validate(s) for s in staff_list] }