Files
FastapiAdmin/backend/app/plugin/module_task/workflow/controller.py
T
zhangtao 1f7e9e8d67 feat(workflow): 重构工作流模块并迁移到module_task目录
- 将工作流相关模块从module_application迁移到module_task目录
- 新增节点类型模型、服务和API接口
- 添加动态节点组件和节点操作工具函数
- 更新前端工作流编辑器支持动态节点配置
- 移除旧的module_application工作流相关文件
- 升级element-plus到2.11.0版本
- 优化性能工具函数(防抖和节流)
- 清理不再使用的依赖项(langchain-anthropic和langchain-mcp-adapters)
2026-02-17 03:24:53 +08:00

699 lines
21 KiB
Python

from typing import Annotated
from fastapi import APIRouter, Body, Depends, Path
from fastapi.responses import JSONResponse
from app.api.v1.module_system.auth.schema import AuthSchema
from app.common.response import ResponseSchema, SuccessResponse
from app.core.base_params import PaginationQueryParam
from app.core.dependencies import AuthPermission
from app.core.logger import log
from app.core.router_class import OperationLogRoute
from .schema import (
WorkflowCreateSchema,
WorkflowExecuteResultSchema,
WorkflowExecuteSchema,
WorkflowOutSchema,
WorkflowPublishSchema,
WorkflowQueryParam,
WorkflowRunCreateSchema,
WorkflowRunLogOutSchema,
WorkflowRunLogQueryParam,
WorkflowRunOutSchema,
WorkflowRunQueryParam,
WorkflowRunUpdateSchema,
WorkflowUpdateSchema,
WorkflowValidateResultSchema,
WorkflowValidateSchema,
)
from .service import WorkflowRunLogService, WorkflowRunService, WorkflowService
WorkflowRouter = APIRouter(route_class=OperationLogRoute, prefix="/workflow", tags=["工作流模块"])
@WorkflowRouter.get(
"/detail/{id}",
summary="获取工作流详情",
description="获取工作流详情",
response_model=ResponseSchema[WorkflowOutSchema],
)
async def get_obj_detail_controller(
id: Annotated[int, Path(description="工作流ID")],
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_task:workflow:detail"]))],
) -> JSONResponse:
"""
获取工作流详情
参数:
- id (int): 工作流ID
- auth (AuthSchema): 认证信息模型
返回:
- JSONResponse: 包含工作流详情的JSON响应
"""
result_dict = await WorkflowService.detail_service(id=id, auth=auth)
log.info(f"获取工作流详情成功 {id}")
return SuccessResponse(data=result_dict, msg="获取工作流详情成功")
@WorkflowRouter.get(
"/list",
summary="查询工作流列表",
description="查询工作流列表",
response_model=ResponseSchema[list[WorkflowOutSchema]],
)
async def get_obj_list_controller(
page: Annotated[PaginationQueryParam, Depends()],
search: Annotated[WorkflowQueryParam, Depends()],
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_task:workflow:query"]))],
) -> JSONResponse:
"""
查询工作流列表
参数:
- page (PaginationQueryParam): 分页查询参数
- search (WorkflowQueryParam): 查询参数
- auth (AuthSchema): 认证信息模型
返回:
- JSONResponse: 包含工作流列表分页信息的JSON响应
"""
result_dict = await WorkflowService.page_service(
auth=auth,
page_no=page.page_no,
page_size=page.page_size,
search=search,
order_by=page.order_by,
)
log.info("查询工作流列表成功")
return SuccessResponse(data=result_dict, msg="查询工作流列表成功")
@WorkflowRouter.post(
"/create",
summary="创建工作流",
description="创建工作流",
response_model=ResponseSchema[WorkflowOutSchema],
)
async def create_obj_controller(
data: WorkflowCreateSchema,
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_task:workflow:create"]))],
) -> JSONResponse:
"""
创建工作流
参数:
- data (WorkflowCreateSchema): 工作流创建模型
- auth (AuthSchema): 认证信息模型
返回:
- JSONResponse: 包含创建工作流详情的JSON响应
"""
result_dict = await WorkflowService.create_service(auth=auth, data=data)
log.info(f"创建工作流成功: {result_dict.get('name')}")
return SuccessResponse(data=result_dict, msg="创建工作流成功")
@WorkflowRouter.put(
"/update/{id}",
summary="修改工作流",
description="修改工作流",
response_model=ResponseSchema[WorkflowOutSchema],
)
async def update_obj_controller(
data: WorkflowUpdateSchema,
id: Annotated[int, Path(description="工作流ID")],
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_task:workflow:update"]))],
) -> JSONResponse:
"""
修改工作流
参数:
- data (WorkflowUpdateSchema): 工作流更新模型
- id (int): 工作流ID
- auth (AuthSchema): 认证信息模型
返回:
- JSONResponse: 包含修改工作流详情的JSON响应
"""
result_dict = await WorkflowService.update_service(auth=auth, id=id, data=data)
log.info(f"修改工作流成功: {result_dict.get('name')}")
return SuccessResponse(data=result_dict, msg="修改工作流成功")
@WorkflowRouter.delete(
"/delete",
summary="删除工作流",
description="删除工作流",
response_model=ResponseSchema[None],
)
async def delete_obj_controller(
ids: Annotated[list[int], Body(description="ID列表")],
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_task:workflow:delete"]))],
) -> JSONResponse:
"""
删除工作流
参数:
- ids (list[int]): 工作流ID列表
- auth (AuthSchema): 认证信息模型
返回:
- JSONResponse: 包含删除工作流详情的JSON响应
"""
await WorkflowService.delete_service(auth=auth, ids=ids)
log.info(f"删除工作流成功: {ids}")
return SuccessResponse(msg="删除工作流成功")
@WorkflowRouter.post(
"/publish/{id}",
summary="发布工作流",
description="发布工作流",
response_model=ResponseSchema[WorkflowOutSchema],
)
async def publish_obj_controller(
id: Annotated[int, Path(description="工作流ID")],
data: WorkflowPublishSchema,
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_task:workflow:publish"]))],
) -> JSONResponse:
"""
发布工作流
参数:
- id (int): 工作流ID
- data (WorkflowPublishSchema): 发布模型
- auth (AuthSchema): 认证信息模型
返回:
- JSONResponse: 包含发布工作流详情的JSON响应
"""
result_dict = await WorkflowService.publish_service(auth=auth, id=id, data=data)
log.info(f"发布工作流成功: {result_dict.get('name')}")
return SuccessResponse(data=result_dict, msg="发布工作流成功")
@WorkflowRouter.post(
"/validate",
summary="验证工作流",
description="验证工作流",
response_model=ResponseSchema[WorkflowValidateResultSchema],
)
async def validate_obj_controller(
data: WorkflowValidateSchema,
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_task:workflow:validate"]))],
) -> JSONResponse:
"""
验证工作流
参数:
- data (WorkflowValidateSchema): 验证模型
- auth (AuthSchema): 认证信息模型
返回:
- JSONResponse: 包含验证结果的JSON响应
"""
result_dict = await WorkflowService.validate_service(auth=auth, data=data)
log.info("验证工作流成功")
return SuccessResponse(data=result_dict.model_dump(), msg="验证工作流成功")
@WorkflowRouter.get(
"/templates",
summary="获取模板列表",
description="获取模板列表",
response_model=ResponseSchema[list[WorkflowOutSchema]],
)
async def get_templates_controller(
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_task:workflow:query"]))],
) -> JSONResponse:
"""
获取模板列表
参数:
- auth (AuthSchema): 认证信息模型
返回:
- JSONResponse: 包含模板列表的JSON响应
"""
result_dict = await WorkflowService.templates_service(auth=auth)
log.info("获取模板列表成功")
return SuccessResponse(data=result_dict, msg="获取模板列表成功")
@WorkflowRouter.get(
"/export/{id}",
summary="导出工作流",
description="导出工作流",
response_model=ResponseSchema[dict],
)
async def export_obj_controller(
id: Annotated[int, Path(description="工作流ID")],
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_task:workflow:export"]))],
) -> JSONResponse:
"""
导出工作流
参数:
- id (int): 工作流ID
- auth (AuthSchema): 认证信息模型
返回:
- JSONResponse: 包含导出工作流数据的JSON响应
"""
result_dict = await WorkflowService.export_service(auth=auth, id=id)
log.info(f"导出工作流成功: {id}")
return SuccessResponse(data=result_dict, msg="导出工作流成功")
@WorkflowRouter.post(
"/import",
summary="导入工作流",
description="导入工作流",
response_model=ResponseSchema[WorkflowOutSchema],
)
async def import_obj_controller(
data: dict,
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_task:workflow:import"]))],
) -> JSONResponse:
"""
导入工作流
参数:
- data (dict): 工作流数据
- auth (AuthSchema): 认证信息模型
返回:
- JSONResponse: 包含导入工作流详情的JSON响应
"""
result_dict = await WorkflowService.import_service(auth=auth, data=data)
log.info(f"导入工作流成功: {result_dict.get('name')}")
return SuccessResponse(data=result_dict, msg="导入工作流成功")
@WorkflowRouter.post(
"/execute",
summary="执行工作流",
description="执行工作流",
response_model=ResponseSchema[WorkflowExecuteResultSchema],
)
async def execute_obj_controller(
data: WorkflowExecuteSchema,
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_task:workflow:execute"]))],
) -> JSONResponse:
"""
执行工作流
参数:
- data (WorkflowExecuteSchema): 执行模型
- auth (AuthSchema): 认证信息模型
返回:
- JSONResponse: 包含执行结果的JSON响应
"""
result_dict = await WorkflowService.execute_service(auth=auth, data=data)
log.info(f"执行工作流成功: {result_dict.get('workflow_id')}")
return SuccessResponse(data=result_dict, msg="执行工作流成功")
@WorkflowRouter.post(
"/pause/{id}",
summary="暂停工作流",
description="暂停工作流",
response_model=ResponseSchema[None],
)
async def pause_obj_controller(
id: Annotated[int, Path(description="工作流ID")],
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_task:workflow:pause"]))],
) -> JSONResponse:
"""
暂停工作流
参数:
- id (int): 工作流ID
- auth (AuthSchema): 认证信息模型
返回:
- JSONResponse: 包含暂停结果的JSON响应
"""
await WorkflowService.pause_service(auth=auth, id=id)
log.info(f"暂停工作流成功: {id}")
return SuccessResponse(msg="暂停工作流成功")
@WorkflowRouter.post(
"/resume/{id}",
summary="恢复工作流",
description="恢复工作流",
response_model=ResponseSchema[None],
)
async def resume_obj_controller(
id: Annotated[int, Path(description="工作流ID")],
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_task:workflow:resume"]))],
) -> JSONResponse:
"""
恢复工作流
参数:
- id (int): 工作流ID
- auth (AuthSchema): 认证信息模型
返回:
- JSONResponse: 包含恢复结果的JSON响应
"""
await WorkflowService.resume_service(auth=auth, id=id)
log.info(f"恢复工作流成功: {id}")
return SuccessResponse(msg="恢复工作流成功")
@WorkflowRouter.post(
"/terminate/{id}",
summary="终止工作流",
description="终止工作流",
response_model=ResponseSchema[None],
)
async def terminate_obj_controller(
id: Annotated[int, Path(description="工作流ID")],
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_task:workflow:terminate"]))],
) -> JSONResponse:
"""
终止工作流
参数:
- id (int): 工作流ID
- auth (AuthSchema): 认证信息模型
返回:
- JSONResponse: 包含终止结果的JSON响应
"""
await WorkflowService.terminate_service(auth=auth, id=id)
log.info(f"终止工作流成功: {id}")
return SuccessResponse(msg="终止工作流成功")
@WorkflowRouter.get(
"/run/list",
summary="查询工作流运行记录列表",
description="查询工作流运行记录列表",
response_model=ResponseSchema[list[WorkflowRunOutSchema]],
)
async def get_workflow_run_list_controller(
page: Annotated[PaginationQueryParam, Depends()],
search: Annotated[WorkflowRunQueryParam, Depends()],
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_task:workflow:run:query"]))],
) -> JSONResponse:
"""
查询工作流运行记录列表
参数:
- page (PaginationQueryParam): 分页查询参数
- search (WorkflowRunQueryParam): 查询参数
- auth (AuthSchema): 认证信息模型
返回:
- JSONResponse: 包含工作流运行记录列表的JSON响应
"""
result_dict = await WorkflowRunService.page_service(
auth=auth,
page_no=page.page_no,
page_size=page.page_size,
search=search.__dict__ if search else None,
order_by=page.order_by,
)
return SuccessResponse(data=result_dict, msg="查询工作流运行记录列表成功")
@WorkflowRouter.get(
"/run/detail/{id}",
summary="查询工作流运行记录详情",
description="查询工作流运行记录详情",
response_model=ResponseSchema[WorkflowRunOutSchema],
)
async def get_workflow_run_detail_controller(
id: int,
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_task:workflow:run:query"]))],
) -> JSONResponse:
"""
查询工作流运行记录详情
参数:
- id (int): 工作流运行记录ID
- auth (AuthSchema): 认证信息模型
返回:
- JSONResponse: 包含工作流运行记录详情的JSON响应
"""
result_dict = await WorkflowRunService.detail_service(auth=auth, id=id)
return SuccessResponse(data=result_dict, msg="查询工作流运行记录详情成功")
@WorkflowRouter.post(
"/run/create",
summary="创建工作流运行记录",
description="创建工作流运行记录",
response_model=ResponseSchema[WorkflowRunOutSchema],
)
async def create_workflow_run_controller(
data: WorkflowRunCreateSchema,
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_task:workflow:run:create"]))],
) -> JSONResponse:
"""
创建工作流运行记录
参数:
- data (WorkflowRunCreateSchema): 创建模型
- auth (AuthSchema): 认证信息模型
返回:
- JSONResponse: 包含创建的工作流运行记录的JSON响应
"""
result_dict = await WorkflowRunService.create_service(auth=auth, data=data)
return SuccessResponse(data=result_dict, msg="创建工作流运行记录成功")
@WorkflowRouter.put(
"/run/update/{id}",
summary="更新工作流运行记录",
description="更新工作流运行记录",
response_model=ResponseSchema[WorkflowRunOutSchema],
)
async def update_workflow_run_controller(
id: int,
data: WorkflowRunUpdateSchema,
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_task:workflow:run:update"]))],
) -> JSONResponse:
"""
更新工作流运行记录
参数:
- id (int): 工作流运行记录ID
- data (WorkflowRunUpdateSchema): 更新模型
- auth (AuthSchema): 认证信息模型
返回:
- JSONResponse: 包含更新的工作流运行记录的JSON响应
"""
result_dict = await WorkflowRunService.update_service(auth=auth, id=id, data=data)
return SuccessResponse(data=result_dict, msg="更新工作流运行记录成功")
@WorkflowRouter.delete(
"/run/delete",
summary="删除工作流运行记录",
description="删除工作流运行记录",
response_model=ResponseSchema[None],
)
async def delete_workflow_run_controller(
ids: list[int],
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_task:workflow:run:delete"]))],
) -> JSONResponse:
"""
删除工作流运行记录
参数:
- ids (list[int]): 工作流运行记录ID列表
- auth (AuthSchema): 认证信息模型
返回:
- JSONResponse: 包含删除结果的JSON响应
"""
await WorkflowRunService.delete_service(auth=auth, ids=ids)
return SuccessResponse(data=None, msg="删除工作流运行记录成功")
@WorkflowRouter.delete(
"/run/clear",
summary="清空工作流运行记录",
description="清空工作流运行记录",
response_model=ResponseSchema[None],
)
async def clear_workflow_run_controller(
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_task:workflow:run:delete"]))],
) -> JSONResponse:
"""
清空工作流运行记录
参数:
- auth (AuthSchema): 认证信息模型
返回:
- JSONResponse: 包含清空结果的JSON响应
"""
await WorkflowRunService.clear_service(auth=auth)
return SuccessResponse(data=None, msg="清空工作流运行记录成功")
@WorkflowRouter.post(
"/run/cancel/{id}",
summary="取消工作流运行记录",
description="取消工作流运行记录",
response_model=ResponseSchema[WorkflowRunOutSchema],
)
async def cancel_workflow_run_controller(
id: int,
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_task:workflow:run:update"]))],
) -> JSONResponse:
"""
取消工作流运行记录
参数:
- id (int): 工作流运行记录ID
- auth (AuthSchema): 认证信息模型
返回:
- JSONResponse: 包含取消的工作流运行记录的JSON响应
"""
result_dict = await WorkflowRunService.cancel_service(auth=auth, id=id)
return SuccessResponse(data=result_dict, msg="取消工作流运行记录成功")
@WorkflowRouter.post(
"/run/retry/{id}",
summary="重试工作流运行记录",
description="重试工作流运行记录",
response_model=ResponseSchema[WorkflowRunOutSchema],
)
async def retry_workflow_run_controller(
id: int,
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_task:workflow:run:update"]))],
retry_count: int = 1,
) -> JSONResponse:
"""
重试工作流运行记录
参数:
- id (int): 工作流运行记录ID
- auth (AuthSchema): 认证信息模型
- retry_count (int): 重试次数
返回:
- JSONResponse: 包含重试的工作流运行记录的JSON响应
"""
result_dict = await WorkflowRunService.retry_service(auth=auth, id=id, retry_count=retry_count)
return SuccessResponse(data=result_dict, msg="重试工作流运行记录成功")
@WorkflowRouter.post(
"/run/pause/{id}",
summary="暂停工作流运行记录",
description="暂停工作流运行记录",
response_model=ResponseSchema[WorkflowRunOutSchema],
)
async def pause_workflow_run_controller(
id: int,
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_task:workflow:run:update"]))],
) -> JSONResponse:
"""
暂停工作流运行记录
参数:
- id (int): 工作流运行记录ID
- auth (AuthSchema): 认证信息模型
返回:
- JSONResponse: 包含暂停的工作流运行记录的JSON响应
"""
result_dict = await WorkflowRunService.pause_service(auth=auth, id=id)
return SuccessResponse(data=result_dict, msg="暂停工作流运行记录成功")
@WorkflowRouter.post(
"/run/resume/{id}",
summary="恢复工作流运行记录",
description="恢复工作流运行记录",
response_model=ResponseSchema[WorkflowRunOutSchema],
)
async def resume_workflow_run_controller(
id: int,
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_task:workflow:run:update"]))],
) -> JSONResponse:
"""
恢复工作流运行记录
参数:
- id (int): 工作流运行记录ID
- auth (AuthSchema): 认证信息模型
返回:
- JSONResponse: 包含恢复的工作流运行记录的JSON响应
"""
result_dict = await WorkflowRunService.resume_service(auth=auth, id=id)
return SuccessResponse(data=result_dict, msg="恢复工作流运行记录成功")
@WorkflowRouter.post(
"/run/terminate/{id}",
summary="终止工作流运行记录",
description="终止工作流运行记录",
response_model=ResponseSchema[WorkflowRunOutSchema],
)
async def terminate_workflow_run_controller(
id: int,
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_task:workflow:run:update"]))],
) -> JSONResponse:
"""
终止工作流运行记录
参数:
- id (int): 工作流运行记录ID
- auth (AuthSchema): 认证信息模型
返回:
- JSONResponse: 包含终止的工作流运行记录的JSON响应
"""
result_dict = await WorkflowRunService.terminate_service(auth=auth, id=id)
return SuccessResponse(data=result_dict, msg="终止工作流运行记录成功")
@WorkflowRouter.get(
"/run/log/list",
summary="查询工作流运行日志列表",
description="查询工作流运行日志列表",
response_model=ResponseSchema[list[WorkflowRunLogOutSchema]],
)
async def get_workflow_run_log_list_controller(
page: Annotated[PaginationQueryParam, Depends()],
search: Annotated[WorkflowRunLogQueryParam, Depends()],
auth: Annotated[AuthSchema, Depends(AuthPermission(["module_task:workflow:run:query"]))],
) -> JSONResponse:
"""
查询工作流运行日志列表
参数:
- page (PaginationQueryParam): 分页查询参数
- search (WorkflowRunLogQueryParam): 查询参数
- auth (AuthSchema): 认证信息模型
返回:
- JSONResponse: 包含工作流运行日志列表的JSON响应
"""
result_dict = await WorkflowRunLogService.page_service(
auth=auth,
page_no=page.page_no,
page_size=page.page_size,
search=search.__dict__ if search else None,
order_by=page.order_by,
)
return SuccessResponse(data=result_dict, msg="查询工作流运行日志列表成功")