expense_item.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. from typing import List
  2. from fastapi import APIRouter, Depends, HTTPException, status
  3. from sqlalchemy.orm import Session
  4. from app.database import get_db
  5. from app.core.deps import require_roles
  6. from app.models.user import User
  7. from app.schemas.common import ApiResponse
  8. from app.schemas.expense_item import ExpenseItemCreate, ExpenseItemUpdate, ExpenseItemOut
  9. from app.services.expense_item import ExpenseItemService
  10. router = APIRouter(prefix="/api/expense-items", tags=["费用项目管理"])
  11. @router.get("/tree", response_model=ApiResponse[List[ExpenseItemOut]])
  12. def get_expense_item_tree(db: Session = Depends(get_db), _: User = Depends(require_roles("ADMIN"))):
  13. tree = ExpenseItemService.get_item_tree(db)
  14. return ApiResponse(data=[ExpenseItemOut.model_validate(i) for i in tree])
  15. @router.get("/{item_id}", response_model=ApiResponse[ExpenseItemOut])
  16. def get_expense_item(item_id: int, db: Session = Depends(get_db), _: User = Depends(require_roles("ADMIN"))):
  17. item = ExpenseItemService.get_by_id(db, item_id)
  18. if not item:
  19. raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="费用项目不存在")
  20. return ApiResponse(data=ExpenseItemOut.model_validate(item))
  21. @router.post("/", response_model=ApiResponse[ExpenseItemOut])
  22. def create_expense_item(body: ExpenseItemCreate, db: Session = Depends(get_db), _: User = Depends(require_roles("ADMIN"))):
  23. data = body.model_dump(exclude_unset=True)
  24. item = ExpenseItemService.create(db, data)
  25. return ApiResponse(data=ExpenseItemOut.model_validate(item))
  26. @router.put("/{item_id}", response_model=ApiResponse[ExpenseItemOut])
  27. def update_expense_item(item_id: int, body: ExpenseItemUpdate, db: Session = Depends(get_db), _: User = Depends(require_roles("ADMIN"))):
  28. data = body.model_dump(exclude_unset=True)
  29. item = ExpenseItemService.update(db, item_id, data)
  30. if not item:
  31. raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="费用项目不存在")
  32. return ApiResponse(data=ExpenseItemOut.model_validate(item))
  33. @router.delete("/{item_id}", response_model=ApiResponse[None])
  34. def delete_expense_item(item_id: int, db: Session = Depends(get_db), _: User = Depends(require_roles("ADMIN"))):
  35. ExpenseItemService.soft_delete(db, item_id)
  36. return ApiResponse(data=None)