tianfeng_task_modules/data/models/task_flow_block.py
2025-03-17 14:58:05 +08:00

191 lines
6.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
任务流程块模型模块
包含任务流程块相关的数据模型
"""
import enum
from sqlalchemy import Column, Integer, String, Float, Text, Boolean, Enum, ForeignKey, JSON, UniqueConstraint
from sqlalchemy.orm import relationship
from data.models.base import BaseModel
class BlockType(enum.Enum):
"""
块类型枚举
"""
COMPONENT = 'component' # 组件块
START = 'start' # 开始块
END = 'end' # 结束块
CONDITION = 'condition' # 条件块
LOOP = 'loop' # 循环块
PARALLEL = 'parallel' # 并行块
SUBPROCESS = 'subprocess' # 子流程块
CUSTOM = 'custom' # 自定义块
class TaskFlowBlock(BaseModel):
"""
任务流程块模型
表示任务流程中的一个组件块
"""
__tablename__ = 'task_flow_blocks'
task_id = Column(Integer, ForeignKey('tasks.id'), nullable=False, comment='任务ID')
version_id = Column(Integer, ForeignKey('task_versions.id'), nullable=False, comment='任务版本ID')
block_type = Column(Enum(BlockType), nullable=False, comment='块类型')
component_type_id = Column(Integer, ForeignKey('component_types.id'), nullable=True, comment='组件类型ID')
name = Column(String(100), nullable=False, comment='块名称')
code = Column(String(100), nullable=True, comment='块代码')
description = Column(String(500), nullable=True, comment='块描述')
order = Column(Integer, nullable=False, default=0, comment='执行顺序')
config = Column(JSON, nullable=True, comment='块配置')
condition = Column(String(500), nullable=True, comment='条件表达式')
next_block_code = Column(String(100), nullable=True, comment='下一个块代码(用于跳转)')
is_disabled = Column(Boolean, default=False, comment='是否禁用')
# 关联关系
task = relationship('Task', back_populates='flow_blocks')
version = relationship('TaskVersion', back_populates='flow_blocks')
component_type = relationship('ComponentType')
parameter_values = relationship('ComponentParameterValue', back_populates='component_instance', cascade='all, delete-orphan')
def __repr__(self):
return f"<TaskFlowBlock(id={self.id}, name='{self.name}', task_id={self.task_id}, version_id={self.version_id})>"
@classmethod
def get_by_task_version(cls, task_id, version_id):
"""
获取任务版本的所有块
"""
return cls.query.filter(
cls.task_id == task_id,
cls.version_id == version_id,
cls.is_deleted == False
).order_by(cls.order).all()
@classmethod
def get_by_code(cls, task_id, version_id, code):
"""
根据代码获取块
"""
return cls.query.filter(
cls.task_id == task_id,
cls.version_id == version_id,
cls.code == code,
cls.is_deleted == False
).first()
@classmethod
def create_block(cls, task_id, version_id, block_type, name, component_type_id=None,
code=None, description=None, order=0, config=None,
condition=None, next_block_code=None, is_disabled=False):
"""
创建块
"""
from config.database import db_session
block = cls(
task_id=task_id,
version_id=version_id,
block_type=block_type,
component_type_id=component_type_id,
name=name,
code=code,
description=description,
order=order,
config=config,
condition=condition,
next_block_code=next_block_code,
is_disabled=is_disabled
)
db_session.add(block)
db_session.commit()
return block
def update_order(self, order):
"""
更新块顺序
"""
from config.database import db_session
self.order = order
db_session.commit()
return self
def update_config(self, config):
"""
更新块配置
"""
from config.database import db_session
self.config = config
db_session.commit()
return self
def update_condition(self, condition, next_block_code=None):
"""
更新条件表达式和下一个块代码
"""
from config.database import db_session
self.condition = condition
if next_block_code is not None:
self.next_block_code = next_block_code
db_session.commit()
return self
def get_parameters(self):
"""
获取块的所有参数值
Returns:
dict: 参数值字典,键为参数代码,值为参数值
"""
from data.models.component_parameter import ComponentParameterValue
return ComponentParameterValue.get_by_component_instance(self.id)
def set_parameter(self, parameter_code, value, value_format='simple', is_expression=False, expression=None):
"""
设置块参数值
Args:
parameter_code (str): 参数代码
value (any): 参数值
value_format (str, optional): 值格式可选值simple, json, expression
is_expression (bool, optional): 是否为表达式
expression (str, optional): 表达式内容
Returns:
ComponentParameterValue: 参数值对象
"""
from data.models.component_parameter import ComponentParameterValue, ParameterValueFormat
# 转换值格式
if value_format == 'simple':
format_enum = ParameterValueFormat.SIMPLE
elif value_format == 'json':
format_enum = ParameterValueFormat.JSON
elif value_format == 'expression':
format_enum = ParameterValueFormat.EXPRESSION
else:
format_enum = ParameterValueFormat.SIMPLE
return ComponentParameterValue.set_parameter_value(
self.id, parameter_code, value, format_enum, is_expression, expression
)
def delete_parameter(self, parameter_code):
"""
删除块参数值
Args:
parameter_code (str): 参数代码
Returns:
bool: 是否删除成功
"""
from data.models.component_parameter import ComponentParameterValue
return ComponentParameterValue.delete_parameter_value(self.id, parameter_code)