322 lines
11 KiB
Python
322 lines
11 KiB
Python
#!/usr/bin/env python
|
||
# -*- coding: utf-8 -*-
|
||
|
||
"""
|
||
组件参数模型模块
|
||
包含组件参数定义和参数值相关的数据模型
|
||
"""
|
||
|
||
import enum
|
||
from sqlalchemy import Column, Integer, String, Text, DateTime, Boolean, Enum, ForeignKey, JSON, Float
|
||
from sqlalchemy.orm import relationship
|
||
from data.models.base import BaseModel
|
||
from config.database import DBConfig, CacheConfig
|
||
|
||
class ParameterType(enum.Enum):
|
||
"""
|
||
参数类型枚举
|
||
"""
|
||
STRING = 'string' # 字符串
|
||
NUMBER = 'number' # 数字
|
||
BOOLEAN = 'boolean' # 布尔值
|
||
ARRAY = 'array' # 数组
|
||
OBJECT = 'object' # 对象
|
||
DATE = 'date' # 日期
|
||
TIME = 'time' # 时间
|
||
DATETIME = 'datetime' # 日期时间
|
||
FILE = 'file' # 文件
|
||
SELECT = 'select' # 选择器
|
||
MULTI_SELECT = 'multi_select' # 多选选择器
|
||
CUSTOM = 'custom' # 自定义类型
|
||
|
||
class ParameterValueFormat(enum.Enum):
|
||
"""
|
||
参数值格式枚举
|
||
"""
|
||
SIMPLE = 'simple' # 简单值
|
||
JSON = 'json' # JSON格式
|
||
EXPRESSION = 'expression' # 表达式
|
||
|
||
class ComponentParameterDefinition(BaseModel):
|
||
"""
|
||
组件参数定义模型
|
||
定义组件类型的输入参数
|
||
"""
|
||
__tablename__ = 'component_parameter_definitions'
|
||
|
||
component_type_id = Column(Integer, ForeignKey('component_types.id'), nullable=False, comment='组件类型ID')
|
||
code = Column(String(100), nullable=False, comment='参数代码')
|
||
name = Column(String(100), nullable=False, comment='参数名称')
|
||
description = Column(String(500), nullable=True, comment='参数描述')
|
||
parameter_type = Column(Enum(ParameterType), nullable=False, comment='参数类型')
|
||
is_required = Column(Boolean, default=False, comment='是否必填')
|
||
default_value = Column(JSON, nullable=True, comment='默认值')
|
||
validation_rules = Column(JSON, nullable=True, comment='验证规则')
|
||
options = Column(JSON, nullable=True, comment='选项(用于选择器类型)')
|
||
ui_config = Column(JSON, nullable=True, comment='UI配置')
|
||
order = Column(Integer, default=0, comment='排序')
|
||
|
||
# 关联关系
|
||
component_type = relationship('ComponentType', back_populates='parameter_definitions')
|
||
|
||
def __repr__(self):
|
||
return f"<ComponentParameterDefinition(id={self.id}, component_type_id={self.component_type_id}, code='{self.code}')>"
|
||
|
||
@classmethod
|
||
def get_by_component_type(cls, component_type_id):
|
||
"""
|
||
获取组件类型的所有参数定义
|
||
"""
|
||
return cls.query.filter(
|
||
cls.component_type_id == component_type_id,
|
||
cls.is_deleted == False
|
||
).order_by(cls.order).all()
|
||
|
||
@classmethod
|
||
def get_by_code(cls, component_type_id, code):
|
||
"""
|
||
根据参数代码获取参数定义
|
||
"""
|
||
return cls.query.filter(
|
||
cls.component_type_id == component_type_id,
|
||
cls.code == code,
|
||
cls.is_deleted == False
|
||
).first()
|
||
|
||
@classmethod
|
||
def create_parameter_definition(cls, component_type_id, code, name, parameter_type,
|
||
description=None, is_required=False, default_value=None,
|
||
validation_rules=None, options=None, ui_config=None, order=0):
|
||
"""
|
||
创建参数定义
|
||
"""
|
||
from config.database import db_session
|
||
|
||
# 检查是否已存在
|
||
existing = cls.get_by_code(component_type_id, code)
|
||
if existing:
|
||
return existing
|
||
|
||
# 创建新参数定义
|
||
param_def = cls(
|
||
component_type_id=component_type_id,
|
||
code=code,
|
||
name=name,
|
||
description=description,
|
||
parameter_type=parameter_type,
|
||
is_required=is_required,
|
||
default_value=default_value,
|
||
validation_rules=validation_rules,
|
||
options=options,
|
||
ui_config=ui_config,
|
||
order=order
|
||
)
|
||
|
||
db_session.add(param_def)
|
||
db_session.commit()
|
||
return param_def
|
||
|
||
class ComponentParameterValue(BaseModel):
|
||
"""
|
||
组件参数值模型
|
||
存储组件实例的参数值
|
||
"""
|
||
__tablename__ = 'component_parameter_values'
|
||
|
||
component_instance_id = Column(Integer, ForeignKey('task_flow_blocks.id'), nullable=False, comment='组件实例ID(任务流程块ID)')
|
||
parameter_code = Column(String(100), nullable=False, comment='参数代码')
|
||
value = Column(JSON, nullable=True, comment='参数值')
|
||
value_format = Column(Enum(ParameterValueFormat), nullable=False, default=ParameterValueFormat.SIMPLE, comment='值格式')
|
||
is_expression = Column(Boolean, default=False, comment='是否为表达式')
|
||
expression = Column(String(500), nullable=True, comment='表达式内容')
|
||
|
||
# 关联关系
|
||
component_instance = relationship('TaskFlowBlock', back_populates='parameter_values')
|
||
|
||
def __repr__(self):
|
||
return f"<ComponentParameterValue(id={self.id}, component_instance_id={self.component_instance_id}, parameter_code='{self.parameter_code}')>"
|
||
|
||
@classmethod
|
||
def get_by_component_instance(cls, component_instance_id):
|
||
"""
|
||
获取组件实例的所有参数值
|
||
|
||
Returns:
|
||
dict: 参数值字典,键为参数代码,值为参数值对象
|
||
"""
|
||
values = cls.query.filter(
|
||
cls.component_instance_id == component_instance_id,
|
||
cls.is_deleted == False
|
||
).all()
|
||
|
||
# 转换为字典
|
||
result = {}
|
||
for value in values:
|
||
result[value.parameter_code] = value
|
||
|
||
return result
|
||
|
||
@classmethod
|
||
def get_by_parameter_code(cls, component_instance_id, parameter_code):
|
||
"""
|
||
根据参数代码获取参数值
|
||
"""
|
||
return cls.query.filter(
|
||
cls.component_instance_id == component_instance_id,
|
||
cls.parameter_code == parameter_code,
|
||
cls.is_deleted == False
|
||
).first()
|
||
|
||
@classmethod
|
||
def set_parameter_value(cls, component_instance_id, parameter_code, value,
|
||
value_format=ParameterValueFormat.SIMPLE,
|
||
is_expression=False, expression=None):
|
||
"""
|
||
设置参数值
|
||
"""
|
||
from config.database import db_session
|
||
|
||
# 检查是否已存在
|
||
param_value = cls.get_by_parameter_code(component_instance_id, parameter_code)
|
||
|
||
if param_value:
|
||
# 更新现有参数值
|
||
param_value.value = value
|
||
param_value.value_format = value_format
|
||
param_value.is_expression = is_expression
|
||
param_value.expression = expression
|
||
else:
|
||
# 创建新参数值
|
||
param_value = cls(
|
||
component_instance_id=component_instance_id,
|
||
parameter_code=parameter_code,
|
||
value=value,
|
||
value_format=value_format,
|
||
is_expression=is_expression,
|
||
expression=expression
|
||
)
|
||
db_session.add(param_value)
|
||
|
||
db_session.commit()
|
||
return param_value
|
||
|
||
@classmethod
|
||
def delete_parameter_value(cls, component_instance_id, parameter_code):
|
||
"""
|
||
删除参数值
|
||
"""
|
||
from config.database import db_session
|
||
|
||
param_value = cls.get_by_parameter_code(component_instance_id, parameter_code)
|
||
if param_value:
|
||
param_value.is_deleted = True
|
||
db_session.commit()
|
||
return True
|
||
|
||
return False
|
||
|
||
def get_value(self):
|
||
"""
|
||
获取参数值
|
||
|
||
Returns:
|
||
any: 参数值
|
||
"""
|
||
return self.value
|
||
|
||
class ParameterTemplate(BaseModel):
|
||
"""
|
||
参数模板模型
|
||
用于存储常用的参数配置模板
|
||
"""
|
||
__tablename__ = 'parameter_templates'
|
||
|
||
name = Column(String(100), nullable=False, comment='模板名称')
|
||
component_type_id = Column(Integer, ForeignKey('component_types.id'), nullable=False, comment='组件类型ID')
|
||
description = Column(String(500), nullable=True, comment='模板描述')
|
||
parameter_values = Column(JSON, nullable=False, comment='参数值配置')
|
||
is_system = Column(Boolean, default=False, comment='是否为系统模板')
|
||
created_by = Column(String(100), nullable=True, comment='创建用户ID')
|
||
|
||
# 关联关系
|
||
component_type = relationship('ComponentType')
|
||
|
||
def __repr__(self):
|
||
return f"<ParameterTemplate(id={self.id}, name='{self.name}', component_type_id={self.component_type_id})>"
|
||
|
||
@classmethod
|
||
def get_by_component_type(cls, component_type_id):
|
||
"""
|
||
获取组件类型的所有参数模板
|
||
|
||
Args:
|
||
component_type_id (int): 组件类型ID
|
||
|
||
Returns:
|
||
list: 参数模板列表
|
||
"""
|
||
# 尝试从缓存获取
|
||
cache_key = f"parameter_templates:{component_type_id}"
|
||
cached_data = CacheConfig.get(cache_key)
|
||
|
||
if cached_data:
|
||
return cached_data
|
||
|
||
# 从数据库获取
|
||
templates = cls.query.filter(
|
||
cls.component_type_id == component_type_id,
|
||
cls.is_deleted == False
|
||
).all()
|
||
|
||
# 转换为字典列表
|
||
result = [{
|
||
'id': template.id,
|
||
'name': template.name,
|
||
'description': template.description,
|
||
'parameter_values': template.parameter_values,
|
||
'is_system': template.is_system,
|
||
'created_by': template.created_by,
|
||
'created_at': template.created_at.isoformat() if template.created_at else None
|
||
} for template in templates]
|
||
|
||
# 缓存结果
|
||
CacheConfig.set(cache_key, result, expire=3600) # 缓存1小时
|
||
|
||
return result
|
||
|
||
@classmethod
|
||
def create_template(cls, name, component_type_id, parameter_values, description=None, is_system=False, created_by=None):
|
||
"""
|
||
创建参数模板
|
||
|
||
Args:
|
||
name (str): 模板名称
|
||
component_type_id (int): 组件类型ID
|
||
parameter_values (dict): 参数值配置
|
||
description (str, optional): 模板描述
|
||
is_system (bool, optional): 是否为系统模板
|
||
created_by (str, optional): 创建用户ID
|
||
|
||
Returns:
|
||
ParameterTemplate: 创建的参数模板对象
|
||
"""
|
||
from config.database import db_session
|
||
|
||
# 创建参数模板
|
||
template = cls(
|
||
name=name,
|
||
component_type_id=component_type_id,
|
||
description=description,
|
||
parameter_values=parameter_values,
|
||
is_system=is_system,
|
||
created_by=created_by
|
||
)
|
||
|
||
db_session.add(template)
|
||
db_session.commit()
|
||
|
||
# 清除缓存
|
||
cache_key = f"parameter_templates:{component_type_id}"
|
||
CacheConfig.delete(cache_key)
|
||
|
||
return template |