expense_item.py 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. from typing import List
  2. from fastapi import APIRouter, Depends, HTTPException, status
  3. from sqlalchemy.orm import Session
  4. from app.core.bx_auth import BxUserContext, get_bx_current_user
  5. from app.core.database import get_db
  6. from app.core.tenant_context import get_tenant_no
  7. from app.schemas.bx.common import ApiResponse
  8. from app.schemas.bx.expense_item import ExpenseItemCreate, ExpenseItemOut, ExpenseItemUpdate
  9. from app.services.bx.expense_item import ExpenseItemService
  10. router = APIRouter(prefix="/expense-items", tags=["费用项目管理"])
  11. @router.get("/tree", response_model=ApiResponse[List[ExpenseItemOut]])
  12. def get_expense_item_tree(
  13. db: Session = Depends(get_db),
  14. user: BxUserContext = Depends(get_bx_current_user),
  15. ):
  16. tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
  17. tree = ExpenseItemService.get_item_tree(db, tenant_no, user=user)
  18. return ApiResponse(data=[ExpenseItemOut.model_validate(i) for i in tree])
  19. @router.get("/{item_id}", response_model=ApiResponse[ExpenseItemOut])
  20. def get_expense_item(
  21. item_id: str,
  22. db: Session = Depends(get_db),
  23. user: BxUserContext = Depends(get_bx_current_user),
  24. ):
  25. tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
  26. item = ExpenseItemService.get_by_id(db, item_id, tenant_no, user=user)
  27. if not item:
  28. raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="费用项目不存在")
  29. return ApiResponse(data=ExpenseItemOut.model_validate(item))
  30. @router.post("/", response_model=ApiResponse[ExpenseItemOut])
  31. def create_expense_item(
  32. body: ExpenseItemCreate,
  33. db: Session = Depends(get_db),
  34. user: BxUserContext = Depends(get_bx_current_user),
  35. ):
  36. try:
  37. item = ExpenseItemService.create(db, body.model_dump(exclude_unset=True), user=user)
  38. db.commit()
  39. db.refresh(item)
  40. except ValueError as exc:
  41. db.rollback()
  42. raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(exc)) from exc
  43. return ApiResponse(data=ExpenseItemOut.model_validate(item))
  44. @router.put("/{item_id}", response_model=ApiResponse[ExpenseItemOut])
  45. def update_expense_item(
  46. item_id: str,
  47. body: ExpenseItemUpdate,
  48. db: Session = Depends(get_db),
  49. user: BxUserContext = Depends(get_bx_current_user),
  50. ):
  51. try:
  52. item = ExpenseItemService.update(
  53. db, item_id, body.model_dump(exclude_unset=True), user=user
  54. )
  55. if not item:
  56. raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="费用项目不存在")
  57. db.commit()
  58. db.refresh(item)
  59. except ValueError as exc:
  60. db.rollback()
  61. raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(exc)) from exc
  62. return ApiResponse(data=ExpenseItemOut.model_validate(item))
  63. @router.delete("/{item_id}", response_model=ApiResponse[None])
  64. def delete_expense_item(
  65. item_id: str,
  66. db: Session = Depends(get_db),
  67. user: BxUserContext = Depends(get_bx_current_user),
  68. ):
  69. tenant_no = get_tenant_no(db, user.to_tenant_user_dict())
  70. item = ExpenseItemService.get_by_id(db, item_id, tenant_no, user=user)
  71. if not item:
  72. raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="费用项目不存在")
  73. ExpenseItemService.soft_delete(db, item_id, user=user)
  74. db.commit()
  75. return ApiResponse(data=None)