#!/usr/bin/env python # -*- coding: utf-8 -*- """ 组件模型模块 包含组件、组件类型和组件分类相关的数据模型 """ import enum from sqlalchemy import Column, Integer, String, Text, Boolean, Enum, ForeignKey, JSON from sqlalchemy.orm import relationship from data.models.base import BaseModel class ComponentCategoryEnum(enum.Enum): """ 组件分类枚举 """ SUBTASK = 'subtask' # 子任务 SCRIPT = 'script' # 脚本 HTTP = 'http' # HTTP请求 TASK = 'task' # 任务 FLOW = 'flow' # 流程 BASIC = 'basic' # 基础 STORAGE = 'storage' # 库位 ROBOT = 'robot' # 机器人调度 DEVICE = 'device' # 设备 class ComponentCategory(BaseModel): """ 组件分类模型 表示组件的分类 """ __tablename__ = 'component_categories' name = Column(String(50), nullable=False, comment='分类名称') code = Column(Enum(ComponentCategoryEnum), nullable=False, unique=True, comment='分类编码') description = Column(String(500), nullable=True, comment='分类描述') icon = Column(String(100), nullable=True, comment='分类图标') order = Column(Integer, default=0, comment='排序顺序') # 关联关系 types = relationship('ComponentType', back_populates='category', cascade='all, delete-orphan') def __repr__(self): return f"" @classmethod def get_by_code(cls, code): """ 根据编码获取分类 """ return cls.query.filter(cls.code == code, cls.is_deleted == False).first() class ComponentType(BaseModel): """ 组件类型模型 表示组件的类型 """ __tablename__ = 'component_types' category_id = Column(Integer, ForeignKey('component_categories.id'), nullable=False, comment='分类ID') name = Column(String(100), nullable=False, comment='类型名称') code = Column(String(50), nullable=False, unique=True, comment='类型编码') description = Column(String(500), nullable=True, comment='类型描述') icon = Column(String(100), nullable=True, comment='类型图标') order = Column(Integer, default=0, comment='排序顺序') is_system = Column(Boolean, default=False, comment='是否为系统组件') # 关联关系 category = relationship('ComponentCategory', back_populates='types') components = relationship('Component', back_populates='type', cascade='all, delete-orphan') parameter_definitions = relationship('ComponentParameterDefinition', back_populates='component_type', cascade='all, delete-orphan') def __repr__(self): return f"" @classmethod def get_by_code(cls, code): """ 根据编码获取类型 """ return cls.query.filter(cls.code == code, cls.is_deleted == False).first() @classmethod def get_by_category(cls, category_id): """ 根据分类获取类型列表 """ return cls.query.filter(cls.category_id == category_id, cls.is_deleted == False).order_by(cls.order).all() class Component(BaseModel): """ 组件模型 表示一个具体的组件 """ __tablename__ = 'components' type_id = Column(Integer, ForeignKey('component_types.id'), nullable=False, comment='类型ID') name = Column(String(100), nullable=False, comment='组件名称') code = Column(String(50), nullable=False, unique=True, comment='组件编码') description = Column(String(500), nullable=True, comment='组件描述') icon = Column(String(100), nullable=True, comment='组件图标') version = Column(String(20), nullable=False, default='1.0.0', comment='组件版本') is_system = Column(Boolean, default=False, comment='是否为系统组件') is_enabled = Column(Boolean, default=True, comment='是否启用') config_schema = Column(JSON, nullable=True, comment='配置模式(JSON Schema)') default_config = Column(JSON, nullable=True, comment='默认配置') implementation = Column(Text, nullable=True, comment='组件实现代码') # 关联关系 type = relationship('ComponentType', back_populates='components') def __repr__(self): return f"" @classmethod def get_by_code(cls, code): """ 根据编码获取组件 """ return cls.query.filter(cls.code == code, cls.is_deleted == False).first() @classmethod def get_by_type(cls, type_id): """ 根据类型获取组件列表 """ return cls.query.filter(cls.type_id == type_id, cls.is_enabled == True, cls.is_deleted == False).all() @classmethod def get_system_components(cls): """ 获取所有系统组件 """ return cls.query.filter(cls.is_system == True, cls.is_enabled == True, cls.is_deleted == False).all()