workflow.py 3.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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, PagedData
  8. from app.schemas.workflow import WorkflowDefCreate, WorkflowDefUpdate, WorkflowDefOut, WorkflowNodeCreate, WorkflowNodeOut
  9. from app.services.workflow import WorkflowService
  10. router = APIRouter(prefix="/api/workflows", tags=["工作流配置"])
  11. @router.get("/", response_model=ApiResponse[PagedData[WorkflowDefOut]])
  12. def list_workflows(
  13. page: int = 1,
  14. pageSize: int = 10,
  15. db: Session = Depends(get_db),
  16. _: User = Depends(require_roles("ADMIN")),
  17. ):
  18. rows, total = WorkflowService.get_paged(db, page=page, page_size=pageSize)
  19. out_rows = [WorkflowDefOut.model_validate(r) for r in rows]
  20. paged_data = PagedData(rows=out_rows, total=total, page=page, page_size=pageSize)
  21. return ApiResponse(data=paged_data)
  22. @router.get("/biz/{biz_type}", response_model=ApiResponse[WorkflowDefOut])
  23. def get_workflow_by_biz_type(biz_type: str, db: Session = Depends(get_db), _: User = Depends(require_roles("ADMIN"))):
  24. workflow = WorkflowService.get_by_biz_type(db, biz_type)
  25. if not workflow:
  26. raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="工作流不存在")
  27. return ApiResponse(data=WorkflowDefOut.model_validate(workflow))
  28. @router.get("/{workflow_id}", response_model=ApiResponse[WorkflowDefOut])
  29. def get_workflow(workflow_id: int, db: Session = Depends(get_db), _: User = Depends(require_roles("ADMIN"))):
  30. workflow = WorkflowService.get_by_id(db, workflow_id)
  31. if not workflow:
  32. raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="工作流不存在")
  33. return ApiResponse(data=WorkflowDefOut.model_validate(workflow))
  34. @router.post("/", response_model=ApiResponse[WorkflowDefOut])
  35. def create_workflow(body: WorkflowDefCreate, db: Session = Depends(get_db), _: User = Depends(require_roles("ADMIN"))):
  36. data = body.model_dump(exclude_unset=True)
  37. nodes_data = data.pop("nodes", [])
  38. workflow = WorkflowService.create(db, data)
  39. if nodes_data:
  40. for n in nodes_data:
  41. n["wf_id"] = workflow.id
  42. WorkflowService.save_nodes(db, workflow.id, nodes_data)
  43. db.refresh(workflow)
  44. return ApiResponse(data=WorkflowDefOut.model_validate(workflow))
  45. @router.put("/{workflow_id}", response_model=ApiResponse[WorkflowDefOut])
  46. def update_workflow(workflow_id: int, body: WorkflowDefUpdate, db: Session = Depends(get_db), _: User = Depends(require_roles("ADMIN"))):
  47. data = body.model_dump(exclude_unset=True)
  48. nodes_data = data.pop("nodes", None)
  49. workflow = WorkflowService.update(db, workflow_id, data)
  50. if not workflow:
  51. raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="工作流不存在")
  52. if nodes_data is not None:
  53. WorkflowService.save_nodes(db, workflow_id, nodes_data)
  54. db.refresh(workflow)
  55. return ApiResponse(data=WorkflowDefOut.model_validate(workflow))
  56. @router.put("/{workflow_id}/nodes", response_model=ApiResponse[WorkflowDefOut])
  57. def save_workflow_nodes(
  58. workflow_id: int,
  59. body: List[WorkflowNodeCreate],
  60. db: Session = Depends(get_db),
  61. _: User = Depends(require_roles("ADMIN")),
  62. ):
  63. nodes_data = [n.model_dump(exclude_unset=True) for n in body]
  64. WorkflowService.save_nodes(db, workflow_id, nodes_data)
  65. workflow = WorkflowService.get_by_id(db, workflow_id)
  66. if not workflow:
  67. raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="工作流不存在")
  68. return ApiResponse(data=WorkflowDefOut.model_validate(workflow))
  69. @router.delete("/{workflow_id}", response_model=ApiResponse[None])
  70. def delete_workflow(workflow_id: int, db: Session = Depends(get_db), _: User = Depends(require_roles("ADMIN"))):
  71. WorkflowService.soft_delete(db, workflow_id)
  72. return ApiResponse(data=None)