feat(workflow): 重构工作流模块并移除配置表单功能

refactor(node): 移除节点模型中的config_schema字段
refactor(workflow): 简化工作流模型和CRUD操作
feat(composables): 重构并增强任务相关组合式函数
style(settings): 优化设置抽屉样式
fix(auth): 修复配置加载逻辑
chore: 清理无用文件和代码
This commit is contained in:
zhangtao
2026-02-23 06:43:38 +08:00
parent d21242f4a7
commit 4e0eff3653
38 changed files with 2810 additions and 5107 deletions
@@ -1,12 +1,10 @@
from dataclasses import dataclass
from datetime import datetime
from fastapi import Query
from pydantic import (
BaseModel,
ConfigDict,
Field,
field_serializer,
field_validator,
model_validator,
)
@@ -25,15 +23,6 @@ class WorkflowCreateSchema(BaseModel):
description: str | None = Field(default=None, description="流程描述")
nodes: list = Field(default_factory=list, description="节点数据(JSON格式)")
edges: list = Field(default_factory=list, description="连线数据(JSON格式)")
version: str = Field(default="1.0.0", description="版本号")
category: str | None = Field(default=None, description="流程分类")
tags: list[str] | None = Field(default=None, description="标签列表")
is_template: bool = Field(default=False, description="是否为模板")
template_id: int | None = Field(default=None, description="模板ID")
meta_data: dict | None = Field(default=None, description="元数据(JSON格式)")
canvas_state: dict | None = Field(default=None, description="画布状态(缩放、平移等)")
thumbnail: str | None = Field(default=None, description="流程缩略图(Base64)")
statistics: dict | None = Field(default=None, description="流程统计信息")
@field_validator("code")
@classmethod
@@ -58,8 +47,6 @@ class WorkflowCreateSchema(BaseModel):
@model_validator(mode="after")
def _after_validation(self):
"""核心业务规则校验"""
if self.is_template and self.template_id:
raise ValueError("模板不能引用其他模板")
if self.description and len(self.description) > 1000:
raise ValueError("流程描述长度不能超过1000个字符")
return self
@@ -74,17 +61,6 @@ class WorkflowUpdateSchema(BaseModel):
description: str | None = Field(default=None, description="流程描述")
nodes: list | None = Field(default=None, description="节点数据(JSON格式)")
edges: list | None = Field(default=None, description="连线数据(JSON格式)")
version: str | None = Field(default=None, description="版本号")
category: str | None = Field(default=None, description="流程分类")
tags: list[str] | None = Field(default=None, description="标签列表")
is_template: bool | None = Field(default=None, description="是否为模板")
template_id: int | None = Field(default=None, description="模板ID")
published_at: str | None = Field(default=None, description="发布时间")
published_by: int | None = Field(default=None, description="发布人ID")
meta_data: dict | None = Field(default=None, description="元数据(JSON格式)")
canvas_state: dict | None = Field(default=None, description="画布状态(缩放、平移等)")
thumbnail: str | None = Field(default=None, description="流程缩略图(Base64)")
statistics: dict | None = Field(default=None, description="流程统计信息")
@field_validator("status")
@classmethod
@@ -99,8 +75,6 @@ class WorkflowUpdateSchema(BaseModel):
@model_validator(mode="after")
def _after_validation(self):
"""核心业务规则校验"""
if self.is_template and self.template_id:
raise ValueError("模板不能引用其他模板")
if self.description and len(self.description) > 1000:
raise ValueError("流程描述长度不能超过1000个字符")
return self
@@ -115,23 +89,7 @@ class WorkflowOutSchema(WorkflowUpdateSchema, BaseSchema, UserBySchema):
class WorkflowPublishSchema(BaseModel):
"""发布工作流模型"""
version: str | None = Field(default=None, description="版本号")
class WorkflowValidateSchema(BaseModel):
"""验证工作流模型"""
nodes: list = Field(..., description="节点数据(JSON格式)")
edges: list = Field(..., description="连线数据(JSON格式)")
class WorkflowValidateResultSchema(BaseModel):
"""工作流验证结果模型"""
is_valid: bool = Field(..., description="是否有效")
errors: list[str] = Field(default_factory=list, description="错误列表")
warnings: list[str] = Field(default_factory=list, description="警告列表")
stats: dict = Field(default_factory=dict, description="统计信息")
pass
@dataclass
@@ -143,8 +101,6 @@ class WorkflowQueryParam:
name: str | None = Query(None, description="流程名称"),
code: str | None = Query(None, description="流程编码"),
status: str | None = Query(None, description="流程状态"),
category: str | None = Query(None, description="流程分类"),
is_template: bool | None = Query(None, description="是否为模板"),
created_time: list[DateTimeStr] | None = Query(
None,
description="创建时间范围",
@@ -164,10 +120,6 @@ class WorkflowQueryParam:
self.code = (QueueEnum.like.value, code)
if status:
self.status = (QueueEnum.eq.value, status)
if category:
self.category = (QueueEnum.eq.value, category)
if is_template is not None:
self.is_template = (QueueEnum.eq.value, is_template)
if created_time and len(created_time) == 2:
self.created_time = (QueueEnum.between.value, (created_time[0], created_time[1]))
if updated_time and len(updated_time) == 2:
@@ -190,124 +142,10 @@ class WorkflowExecuteSchema(BaseModel):
class WorkflowExecuteResultSchema(BaseModel):
"""工作流执行结果模型"""
task_run_id: int = Field(..., description="任务运行记录ID")
workflow_id: int = Field(..., description="工作流ID")
workflow_name: str = Field(..., description="工作流名称")
status: str = Field(..., description="执行状态")
message: str = Field(..., description="执行消息")
class WorkflowRunCreateSchema(BaseModel):
"""创建工作流运行记录模型"""
workflow_id: int = Field(..., description="工作流ID")
workflow_name: str = Field(..., description="工作流名称")
workflow_version: str = Field(default="1.0.0", description="工作流版本")
business_key: str | None = Field(default=None, description="业务键")
initiator: int | None = Field(default=None, description="发起人ID")
initiator_name: str | None = Field(default=None, description="发起人姓名")
variables: dict = Field(default_factory=dict, description="流程变量(JSON格式)")
job_id: int | None = Field(default=None, description="关联的定时任务ID")
class WorkflowRunUpdateSchema(BaseModel):
"""更新工作流运行记录模型"""
status: str | None = Field(default=None, description="运行状态")
error_message: str | None = Field(default=None, description="错误信息")
start_time: datetime | None = Field(default=None, description="开始时间")
end_time: datetime | None = Field(default=None, description="结束时间")
duration: int | None = Field(default=None, description="执行时长(秒)")
retry_count: int | None = Field(default=None, description="重试次数")
max_retry: int | None = Field(default=None, description="最大重试次数")
meta_data: dict | None = Field(default=None, description="元数据(JSON格式)")
class WorkflowRunOutSchema(WorkflowRunCreateSchema, WorkflowRunUpdateSchema, BaseSchema, UserBySchema):
"""工作流运行记录响应模型"""
model_config = ConfigDict(from_attributes=True)
@field_serializer('start_time', 'end_time')
def serialize_datetime(self, value: datetime | None) -> str | None:
if value is None:
return None
return value.strftime("%Y-%m-%d %H:%M:%S")
class WorkflowRunLogCreateSchema(BaseModel):
"""创建工作流运行日志模型"""
task_run_id: int = Field(..., description="工作流运行记录ID")
level: str = Field(default="info", description="日志级别")
node_id: str | None = Field(default=None, description="节点ID")
node_name: str | None = Field(default=None, description="节点名称")
message: str = Field(..., description="日志消息")
data: dict | None = Field(default=None, description="日志数据(JSON格式)")
class WorkflowRunLogOutSchema(BaseModel):
"""工作流运行日志响应模型"""
id: int
task_run_id: int
level: str
node_id: str | None
node_name: str | None
message: str
data: dict | None
created_time: str
created_by: dict | None
model_config = ConfigDict(from_attributes=True)
@dataclass
class WorkflowRunQueryParam:
"""工作流运行记录查询参数"""
def __init__(
self,
workflow_id: int | None = Query(None, description="工作流ID"),
workflow_name: str | None = Query(None, description="工作流名称"),
status: str | None = Query(None, description="运行状态"),
business_key: str | None = Query(None, description="业务键"),
initiator: int | None = Query(None, description="发起人"),
job_id: int | None = Query(None, description="定时任务ID"),
created_time: list[str] | None = Query(None, description="创建时间范围"),
updated_time: list[str] | None = Query(None, description="更新时间范围"),
) -> None:
if workflow_id:
self.workflow_id = (QueueEnum.eq.value, workflow_id)
if workflow_name:
self.workflow_name = (QueueEnum.like.value, workflow_name)
if status:
self.status = (QueueEnum.eq.value, status)
if business_key:
self.business_key = (QueueEnum.like.value, business_key)
if initiator:
self.initiator = (QueueEnum.eq.value, initiator)
if job_id:
self.job_id = (QueueEnum.eq.value, job_id)
if created_time and len(created_time) == 2:
self.created_time = (QueueEnum.between.value, (created_time[0], created_time[1]))
if updated_time and len(updated_time) == 2:
self.updated_time = (QueueEnum.between.value, (updated_time[0], updated_time[1]))
@dataclass
class WorkflowRunLogQueryParam:
"""工作流运行日志查询参数"""
def __init__(
self,
task_run_id: int | None = Query(None, description="工作流运行记录ID"),
level: str | None = Query(None, description="日志级别"),
node_id: str | None = Query(None, description="节点ID"),
node_name: str | None = Query(None, description="节点名称"),
created_time: list[str] | None = Query(None, description="创建时间范围"),
) -> None:
if task_run_id:
self.task_run_id = (QueueEnum.eq.value, task_run_id)
if level:
self.level = (QueueEnum.eq.value, level)
if node_id:
self.node_id = (QueueEnum.like.value, node_id)
if node_name:
self.node_name = (QueueEnum.like.value, node_name)
if created_time and len(created_time) == 2:
self.created_time = (QueueEnum.between.value, (created_time[0], created_time[1]))
start_time: str | None = Field(default=None, description="开始时间")
end_time: str | None = Field(default=None, description="结束时间")
variables: dict = Field(default_factory=dict, description="流程变量")
node_results: dict = Field(default_factory=dict, description="节点执行结果")