124 lines
4.3 KiB
Python
124 lines
4.3 KiB
Python
"""
|
|
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]
|
|
}
|