feat(workflow): 重构工作流模块并迁移到module_task目录

- 将工作流相关模块从module_application迁移到module_task目录
- 新增节点类型模型、服务和API接口
- 添加动态节点组件和节点操作工具函数
- 更新前端工作流编辑器支持动态节点配置
- 移除旧的module_application工作流相关文件
- 升级element-plus到2.11.0版本
- 优化性能工具函数(防抖和节流)
- 清理不再使用的依赖项(langchain-anthropic和langchain-mcp-adapters)
This commit is contained in:
zhangtao
2026-02-17 03:24:53 +08:00
parent aad10384d4
commit 1f7e9e8d67
54 changed files with 7672 additions and 2358 deletions
@@ -0,0 +1,151 @@
from app.api.v1.module_system.auth.schema import AuthSchema
from app.core.exceptions import CustomException
from app.core.logger import log
from .crud import NodeCRUD
from .schema import (
NodeCreateSchema,
NodeOutSchema,
NodeUpdateSchema,
)
class NodeService:
"""节点管理模块服务层"""
@classmethod
async def detail_service(cls, auth: AuthSchema, id: int) -> dict:
"""
获取节点类型详情
参数:
- auth (AuthSchema): 认证信息模型
- id (int): 节点类型ID
返回:
- dict: 节点类型模型实例字典
"""
obj = await NodeCRUD(auth).get_by_id_crud(id=id)
if not obj:
raise CustomException(msg="该节点不存在")
return NodeOutSchema.model_validate(obj).model_dump()
@classmethod
async def page_service(
cls,
auth: AuthSchema,
page_no: int,
page_size: int,
search: dict | None = None,
order_by: list[dict] | None = None,
) -> dict:
"""
分页查询节点类型
参数:
- auth (AuthSchema): 认证信息模型
- page_no (int): 页码
- page_size (int): 每页数量
- search (dict | None): 查询条件
- order_by (list[dict] | None): 排序条件
返回:
- dict: 分页查询结果
"""
offset = (page_no - 1) * page_size
return await NodeCRUD(auth).page_crud(
offset=offset,
limit=page_size,
order_by=order_by,
search=search,
)
@classmethod
async def create_service(cls, auth: AuthSchema, data: NodeCreateSchema) -> dict:
"""
创建节点类型
参数:
- auth (AuthSchema): 认证信息模型
- data (NodeCreateSchema): 节点类型创建模型
返回:
- dict: 节点类型模型实例字典
"""
existing = await NodeCRUD(auth).get_by_code_crud(code=data.code)
if existing:
raise CustomException(msg=f"节点类型编码 {data.code} 已存在")
obj = await NodeCRUD(auth).create_crud(data=data)
if not obj:
raise CustomException(msg="创建失败,节点类型创建失败")
log.info(f"创建节点类型成功: {data.name}")
return NodeOutSchema.model_validate(obj).model_dump()
@classmethod
async def update_service(cls, auth: AuthSchema, id: int, data: NodeUpdateSchema) -> dict:
"""
更新节点类型
参数:
- auth (AuthSchema): 认证信息模型
- id (int): 节点类型ID
- data (NodeUpdateSchema): 节点类型更新模型
返回:
- dict: 节点类型模型实例字典
"""
obj = await NodeCRUD(auth).get_by_id_crud(id=id)
if not obj:
raise CustomException(msg="更新失败,该节点类型不存在")
if data.code and data.code != obj.code:
existing = await NodeCRUD(auth).get_by_code_crud(code=data.code)
if existing:
raise CustomException(msg=f"节点类型编码 {data.code} 已存在")
obj = await NodeCRUD(auth).update_crud(id=id, data=data)
if not obj:
raise CustomException(msg="更新失败,节点类型更新失败")
log.info(f"更新节点类型成功: {obj.name}")
return NodeOutSchema.model_validate(obj).model_dump()
@classmethod
async def delete_service(cls, auth: AuthSchema, ids: list[int]) -> None:
"""
删除节点类型
参数:
- auth (AuthSchema): 认证信息模型
- ids (list[int]): 节点类型ID列表
返回:
- None
"""
for id in ids:
obj = await NodeCRUD(auth).get_by_id_crud(id=id)
if not obj:
raise CustomException(msg=f"删除失败,节点类型ID {id} 不存在")
await NodeCRUD(auth).delete_crud(ids=ids)
log.info(f"删除节点类型成功: {ids}")
@classmethod
async def list_service(cls, auth: AuthSchema) -> list[dict]:
"""
获取节点类型列表
参数:
- auth (AuthSchema): 认证信息模型
返回:
- list[dict]: 节点类型模型实例字典列表
"""
result = await NodeCRUD(auth).page_crud(
offset=0,
limit=1000,
search={"status": ("eq", "0")},
order_by=[{"updated_time": "desc"}],
)
return result.get("items", [])