|
|
|
@ -1,3 +1,9 @@ |
|
|
|
""" |
|
|
|
数据库 ORM 模型模块 |
|
|
|
|
|
|
|
本模块定义了所有数据库表对应的 SQLAlchemy ORM 模型。 |
|
|
|
每个类映射到一张数据库表,类属性映射到表字段。 |
|
|
|
""" |
|
|
|
import uuid |
|
|
|
from datetime import datetime |
|
|
|
from sqlalchemy import Column, String, DateTime, ForeignKey, Integer, Boolean, JSON, Text, Float |
|
|
|
@ -7,389 +13,201 @@ from database import Base |
|
|
|
|
|
|
|
|
|
|
|
class Department(Base): |
|
|
|
"""部门表 (departments),存储企业部门层级结构,支持多级树形组织架构。""" |
|
|
|
__tablename__ = "departments" |
|
|
|
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) |
|
|
|
name = Column(String(100), nullable=False) |
|
|
|
parent_id = Column(UUID(as_uuid=True), ForeignKey("departments.id"), nullable=True) |
|
|
|
path = Column(String(500), default="/") |
|
|
|
level = Column(Integer, default=0) |
|
|
|
sort_order = Column(Integer, default=0) |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) |
|
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) |
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) # 部门唯一标识 UUID |
|
|
|
name = Column(String(100), nullable=False) # 部门名称 |
|
|
|
parent_id = Column(UUID(as_uuid=True), ForeignKey("departments.id"), nullable=True) # 上级部门 ID,用于构建树形结构 |
|
|
|
path = Column(String(500), default="/") # 部门路径,从根节点到当前节点的路径字符串 |
|
|
|
level = Column(Integer, default=0) # 部门层级深度(根部门为 0) |
|
|
|
sort_order = Column(Integer, default=0) # 排序序号,同级部门按此字段排列顺序 |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) # 记录创建时间 |
|
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # 记录更新时间 |
|
|
|
|
|
|
|
children = relationship("Department", backref="parent", remote_side=[id]) |
|
|
|
users = relationship("User", back_populates="department") |
|
|
|
children = relationship("Department", backref="parent", remote_side=[id]) # 子部门列表(一对多自引用) |
|
|
|
users = relationship("User", back_populates="department") # 部门下的用户列表 |
|
|
|
|
|
|
|
|
|
|
|
class User(Base): |
|
|
|
"""用户表 (users),存储系统用户信息,包括账号、身份、组织归属。""" |
|
|
|
__tablename__ = "users" |
|
|
|
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) |
|
|
|
username = Column(String(50), unique=True, nullable=False) |
|
|
|
password_hash = Column(String(255), nullable=False) |
|
|
|
display_name = Column(String(100), nullable=False) |
|
|
|
email = Column(String(100)) |
|
|
|
phone = Column(String(20)) |
|
|
|
wecom_user_id = Column(String(100), unique=True) |
|
|
|
department_id = Column(UUID(as_uuid=True), ForeignKey("departments.id")) |
|
|
|
position = Column(String(100)) |
|
|
|
manager_id = Column(UUID(as_uuid=True), ForeignKey("users.id")) |
|
|
|
status = Column(String(20), default="active") |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) |
|
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) |
|
|
|
|
|
|
|
department = relationship("Department", back_populates="users") |
|
|
|
roles = relationship("UserRole", back_populates="user") |
|
|
|
manager = relationship("User", remote_side=[id], backref="subordinates") |
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) # 用户唯一标识 UUID |
|
|
|
username = Column(String(50), unique=True, nullable=False) # 登录用户名(唯一) |
|
|
|
password_hash = Column(String(255), nullable=False) # 密码哈希值(bcrypt 加密) |
|
|
|
display_name = Column(String(100), nullable=False) # 用户显示名称 |
|
|
|
email = Column(String(100)) # 电子邮箱 |
|
|
|
phone = Column(String(20)) # 手机号码 |
|
|
|
wecom_user_id = Column(String(100), unique=True) # 企业微信用户 ID(唯一) |
|
|
|
department_id = Column(UUID(as_uuid=True), ForeignKey("departments.id")) # 所属部门 ID |
|
|
|
position = Column(String(100)) # 职位/岗位名称 |
|
|
|
manager_id = Column(UUID(as_uuid=True), ForeignKey("users.id")) # 直接上级用户 ID |
|
|
|
status = Column(String(20), default="active") # 用户状态:active/inactive/disabled |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) # 记录创建时间 |
|
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # 记录更新时间 |
|
|
|
|
|
|
|
department = relationship("Department", back_populates="users") # 所属部门(多对一) |
|
|
|
roles = relationship("UserRole", back_populates="user") # 用户角色列表(通过中间表关联) |
|
|
|
manager = relationship("User", remote_side=[id], backref="subordinates") # 直接上级(自引用) |
|
|
|
|
|
|
|
|
|
|
|
class Role(Base): |
|
|
|
"""角色表 (roles),存储系统角色定义,用于 RBAC 权限管理。""" |
|
|
|
__tablename__ = "roles" |
|
|
|
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) |
|
|
|
name = Column(String(50), unique=True, nullable=False) |
|
|
|
code = Column(String(50), unique=True, nullable=False, default="") |
|
|
|
description = Column(String(200)) |
|
|
|
is_system = Column(Boolean, default=False) |
|
|
|
data_scope = Column(String(50), default="self_only") |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) |
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) # 角色唯一标识 UUID |
|
|
|
name = Column(String(50), unique=True, nullable=False) # 角色名称(唯一) |
|
|
|
code = Column(String(50), unique=True, nullable=False, default="") # 角色编码(唯一,如 admin/user) |
|
|
|
description = Column(String(200)) # 角色描述 |
|
|
|
is_system = Column(Boolean, default=False) # 是否为系统内置角色(不可删除) |
|
|
|
data_scope = Column(String(50), default="self_only") # 数据权限范围:self_only/department/all |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) # 记录创建时间 |
|
|
|
|
|
|
|
permissions = relationship("RolePermission", back_populates="role") |
|
|
|
permissions = relationship("RolePermission", back_populates="role") # 角色权限关联列表 |
|
|
|
|
|
|
|
|
|
|
|
class Permission(Base): |
|
|
|
"""权限表 (permissions),存储系统中每个可操作的权限点。""" |
|
|
|
__tablename__ = "permissions" |
|
|
|
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) |
|
|
|
code = Column(String(100), unique=True, nullable=False) |
|
|
|
name = Column(String(100), nullable=False) |
|
|
|
resource = Column(String(100), nullable=False) |
|
|
|
action = Column(String(50), nullable=False) |
|
|
|
description = Column(String(200)) |
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) # 权限唯一标识 UUID |
|
|
|
code = Column(String(100), unique=True, nullable=False) # 权限编码(唯一) |
|
|
|
name = Column(String(100), nullable=False) # 权限名称 |
|
|
|
resource = Column(String(100), nullable=False) # 所属资源名称(如 user/role) |
|
|
|
action = Column(String(50), nullable=False) # 操作类型(create/read/update/delete) |
|
|
|
description = Column(String(200)) # 权限描述 |
|
|
|
|
|
|
|
|
|
|
|
class RolePermission(Base): |
|
|
|
"""角色-权限关联表 (role_permissions),多对多关联中间表。""" |
|
|
|
__tablename__ = "role_permissions" |
|
|
|
|
|
|
|
role_id = Column(UUID(as_uuid=True), ForeignKey("roles.id", ondelete="CASCADE"), primary_key=True) |
|
|
|
permission_id = Column(UUID(as_uuid=True), ForeignKey("permissions.id", ondelete="CASCADE"), primary_key=True) |
|
|
|
role_id = Column(UUID(as_uuid=True), ForeignKey("roles.id", ondelete="CASCADE"), primary_key=True) # 角色 ID(级联删除) |
|
|
|
permission_id = Column(UUID(as_uuid=True), ForeignKey("permissions.id", ondelete="CASCADE"), primary_key=True) # 权限 ID(级联删除) |
|
|
|
|
|
|
|
role = relationship("Role", back_populates="permissions") |
|
|
|
permission = relationship("Permission") |
|
|
|
|
|
|
|
|
|
|
|
class UserRole(Base): |
|
|
|
"""用户-角色关联表 (user_roles),多对多关联中间表。""" |
|
|
|
__tablename__ = "user_roles" |
|
|
|
|
|
|
|
user_id = Column(UUID(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), primary_key=True) |
|
|
|
role_id = Column(UUID(as_uuid=True), ForeignKey("roles.id", ondelete="CASCADE"), primary_key=True) |
|
|
|
user_id = Column(UUID(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), primary_key=True) # 用户 ID(级联删除) |
|
|
|
role_id = Column(UUID(as_uuid=True), ForeignKey("roles.id", ondelete="CASCADE"), primary_key=True) # 角色 ID(级联删除) |
|
|
|
|
|
|
|
user = relationship("User", back_populates="roles") |
|
|
|
role = relationship("Role") |
|
|
|
|
|
|
|
|
|
|
|
class ChatSession(Base): |
|
|
|
"""聊天会话表 (chat_sessions),存储用户与 AI 智能体的对话会话记录。""" |
|
|
|
__tablename__ = "chat_sessions" |
|
|
|
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) |
|
|
|
user_id = Column(UUID(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE")) |
|
|
|
agent_type = Column(String(50), nullable=False) |
|
|
|
session_id = Column(String(100), unique=True, nullable=False) |
|
|
|
status = Column(String(20), default="active") |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) |
|
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) |
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) # 会话唯一标识 UUID |
|
|
|
user_id = Column(UUID(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE")) # 所属用户 ID |
|
|
|
agent_type = Column(String(50), nullable=False) # 智能体类型(chat/flow/rag) |
|
|
|
session_id = Column(String(100), unique=True, nullable=False) # 外部会话 ID(对客户端暴露) |
|
|
|
status = Column(String(20), default="active") # 会话状态:active/closed |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) # 记录创建时间 |
|
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # 记录更新时间 |
|
|
|
|
|
|
|
|
|
|
|
class ChatMessage(Base): |
|
|
|
"""聊天消息表 (chat_messages),存储聊天会话中的每条消息内容。""" |
|
|
|
__tablename__ = "chat_messages" |
|
|
|
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) |
|
|
|
session_id = Column(UUID(as_uuid=True), ForeignKey("chat_sessions.id", ondelete="CASCADE")) |
|
|
|
user_id = Column(UUID(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE")) |
|
|
|
role = Column(String(20), nullable=False) |
|
|
|
content = Column(Text, nullable=False) |
|
|
|
metadata_ = Column("metadata", JSON, default=dict) |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) |
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) # 消息唯一标识 UUID |
|
|
|
session_id = Column(UUID(as_uuid=True), ForeignKey("chat_sessions.id", ondelete="CASCADE")) # 所属会话 ID |
|
|
|
user_id = Column(UUID(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE")) # 发送者用户 ID |
|
|
|
role = Column(String(20), nullable=False) # 消息角色:user/assistant/system |
|
|
|
content = Column(Text, nullable=False) # 消息内容文本 |
|
|
|
metadata_ = Column("metadata", JSON, default=dict) # 元数据(额外信息 JSON) |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) # 记录创建时间 |
|
|
|
|
|
|
|
|
|
|
|
class Task(Base): |
|
|
|
"""任务表 (tasks),存储分配给用户的待办任务信息。""" |
|
|
|
__tablename__ = "tasks" |
|
|
|
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) |
|
|
|
title = Column(String(200), nullable=False) |
|
|
|
content = Column(Text) |
|
|
|
assigner_id = Column(UUID(as_uuid=True), ForeignKey("users.id")) |
|
|
|
assignee_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False) |
|
|
|
status = Column(String(20), default="pending") |
|
|
|
priority = Column(String(20), default="normal") |
|
|
|
deadline = Column(DateTime) |
|
|
|
wecom_message_id = Column(String(100)) |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) |
|
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) |
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) # 任务唯一标识 UUID |
|
|
|
title = Column(String(200), nullable=False) # 任务标题 |
|
|
|
content = Column(Text) # 任务内容描述 |
|
|
|
assigner_id = Column(UUID(as_uuid=True), ForeignKey("users.id")) # 任务分配者(发起人)ID |
|
|
|
assignee_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False) # 任务执行人 ID |
|
|
|
status = Column(String(20), default="pending") # 任务状态:pending/in_progress/completed/cancelled |
|
|
|
priority = Column(String(20), default="normal") # 优先级:low/normal/high/urgent |
|
|
|
deadline = Column(DateTime) # 截止日期时间 |
|
|
|
wecom_message_id = Column(String(100)) # 企业微信消息 ID |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) # 记录创建时间 |
|
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # 记录更新时间 |
|
|
|
|
|
|
|
|
|
|
|
class FlowDefinition(Base): |
|
|
|
"""流程定义表 (flow_definitions),存储可执行 AI 工作流的节点和连线配置。""" |
|
|
|
__tablename__ = "flow_definitions" |
|
|
|
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) |
|
|
|
name = Column(String(200), nullable=False) |
|
|
|
description = Column(Text) |
|
|
|
version = Column(Integer, default=1) |
|
|
|
status = Column(String(20), default="draft") |
|
|
|
definition_json = Column(JSON, nullable=False, default=dict) |
|
|
|
published_version_id = Column(UUID(as_uuid=True), ForeignKey("flow_versions.id"), nullable=True) |
|
|
|
draft_definition_json = Column(JSON, nullable=True, default=None) |
|
|
|
creator_id = Column(UUID(as_uuid=True), ForeignKey("users.id")) |
|
|
|
flow_mode = Column(String(20), default="chatflow") |
|
|
|
published_to_wecom = Column(Boolean, default=False) |
|
|
|
published_to_web = Column(Boolean, default=False) |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) |
|
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) |
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) # 流程唯一标识 UUID |
|
|
|
name = Column(String(200), nullable=False) # 流程名称 |
|
|
|
description = Column(Text) # 流程描述 |
|
|
|
version = Column(Integer, default=1) # 当前版本号 |
|
|
|
status = Column(String(20), default="draft") # 流程状态:draft/published/archived |
|
|
|
definition_json = Column(JSON, nullable=False, default=dict) # 已发布的节点和连线配置 JSON |
|
|
|
published_version_id = Column(UUID(as_uuid=True), ForeignKey("flow_versions.id"), nullable=True) # 已发布版本 ID |
|
|
|
draft_definition_json = Column(JSON, nullable=True, default=None) # 草稿编辑中的配置 JSON |
|
|
|
creator_id = Column(UUID(as_uuid=True), ForeignKey("users.id")) # 创建者用户 ID |
|
|
|
flow_mode = Column(String(20), default="chatflow") # 流程模式:chatflow/workflow |
|
|
|
published_to_wecom = Column(Boolean, default=False) # 是否已发布到企业微信 |
|
|
|
published_to_web = Column(Boolean, default=False) # 是否已发布到 Web 端 |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) # 记录创建时间 |
|
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # 记录更新时间 |
|
|
|
|
|
|
|
published_version = relationship("FlowVersion", foreign_keys=[published_version_id], post_update=True) |
|
|
|
|
|
|
|
|
|
|
|
class FlowVersion(Base): |
|
|
|
"""流程版本表 (flow_versions),存储流程定义的历史版本快照。""" |
|
|
|
__tablename__ = "flow_versions" |
|
|
|
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) |
|
|
|
flow_id = Column(UUID(as_uuid=True), ForeignKey("flow_definitions.id", ondelete="CASCADE"), nullable=False) |
|
|
|
version = Column(Integer, nullable=False) |
|
|
|
definition_json = Column(JSON, nullable=False, default=dict) |
|
|
|
changelog = Column(Text, default="") |
|
|
|
published_by = Column(UUID(as_uuid=True), ForeignKey("users.id")) |
|
|
|
published_to_wecom = Column(Boolean, default=False) |
|
|
|
published_to_web = Column(Boolean, default=False) |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) |
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) # 版本唯一标识 UUID |
|
|
|
flow_id = Column(UUID(as_uuid=True), ForeignKey("flow_definitions.id", ondelete="CASCADE"), nullable=False) # 所属流程定义 ID |
|
|
|
version = Column(Integer, nullable=False) # 版本号(同一流程内递增) |
|
|
|
definition_json = Column(JSON, nullable=False, default=dict) # 该版本的流程定义 JSON 快照 |
|
|
|
changelog = Column(Text, default="") # 版本变更日志 |
|
|
|
published_by = Column(UUID(as_uuid=True), ForeignKey("users.id")) # 发布者用户 ID |
|
|
|
published_to_wecom = Column(Boolean, default=False) # 是否发布到企业微信 |
|
|
|
published_to_web = Column(Boolean, default=False) # 是否发布到 Web 端 |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) # 记录创建时间 |
|
|
|
|
|
|
|
|
|
|
|
class FlowApiKey(Base): |
|
|
|
"""流程 API 密钥表 (flow_api_keys),存储用于外部调用流程的 API 密钥。""" |
|
|
|
__tablename__ = "flow_api_keys" |
|
|
|
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) |
|
|
|
flow_id = Column(UUID(as_uuid=True), ForeignKey("flow_definitions.id", ondelete="CASCADE"), nullable=False) |
|
|
|
name = Column(String(100), nullable=False) |
|
|
|
key_hash = Column(String(64), nullable=False) |
|
|
|
key_prefix = Column(String(10), nullable=False) |
|
|
|
created_by = Column(UUID(as_uuid=True), ForeignKey("users.id")) |
|
|
|
last_used_at = Column(DateTime, nullable=True) |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) |
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) # 密钥唯一标识 UUID |
|
|
|
flow_id = Column(UUID(as_uuid=True), ForeignKey("flow_definitions.id", ondelete="CASCADE"), nullable=False) # 所属流程 ID |
|
|
|
name = Column(String(100), nullable=False) # 密钥名称 |
|
|
|
key_hash = Column(String(64), nullable=False) # 密钥哈希值(SHA-256 加密存储) |
|
|
|
key_prefix = Column(String(10), nullable=False) # 密钥前缀(用于显示识别) |
|
|
|
created_by = Column(UUID(as_uuid=True), ForeignKey("users.id")) # 创建者用户 ID |
|
|
|
last_used_at = Column(DateTime, nullable=True) # 最后使用时间 |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) # 记录创建时间 |
|
|
|
|
|
|
|
|
|
|
|
class FlowTemplate(Base): |
|
|
|
"""流程模板表 (flow_templates),存储预定义的流程模板,可供用户快速创建流程。""" |
|
|
|
__tablename__ = "flow_templates" |
|
|
|
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) |
|
|
|
name = Column(String(200), nullable=False) |
|
|
|
description = Column(Text, default="") |
|
|
|
category = Column(String(50), default="") |
|
|
|
definition_json = Column(JSON, nullable=False, default=dict) |
|
|
|
icon = Column(String(50), default="") |
|
|
|
sort_order = Column(Integer, default=0) |
|
|
|
is_builtin = Column(Boolean, default=False) |
|
|
|
usage_count = Column(Integer, default=0) |
|
|
|
created_by = Column(UUID(as_uuid=True), ForeignKey("users.id")) |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) |
|
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) |
|
|
|
|
|
|
|
|
|
|
|
class CustomTool(Base): |
|
|
|
__tablename__ = "custom_tools" |
|
|
|
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) |
|
|
|
name = Column(String(100), nullable=False) |
|
|
|
description = Column(Text) |
|
|
|
schema_json = Column(JSON, nullable=False, default=dict) |
|
|
|
endpoint_url = Column(String(500), nullable=False) |
|
|
|
method = Column(String(10), default="GET") |
|
|
|
path = Column(String(500), default="") |
|
|
|
headers_json = Column(JSON, default=dict) |
|
|
|
auth_type = Column(String(20), default="none") |
|
|
|
auth_config = Column(JSON, default=dict) |
|
|
|
created_by = Column(UUID(as_uuid=True), ForeignKey("users.id")) |
|
|
|
is_active = Column(Boolean, default=True) |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) |
|
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) |
|
|
|
|
|
|
|
|
|
|
|
class FlowExecution(Base): |
|
|
|
__tablename__ = "flow_executions" |
|
|
|
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) |
|
|
|
flow_id = Column(UUID(as_uuid=True), ForeignKey("flow_definitions.id", ondelete="CASCADE")) |
|
|
|
version = Column(Integer, nullable=True) |
|
|
|
trigger_type = Column(String(50)) |
|
|
|
trigger_user_id = Column(UUID(as_uuid=True), ForeignKey("users.id")) |
|
|
|
input_data = Column(JSON) |
|
|
|
output_data = Column(JSON) |
|
|
|
status = Column(String(20), default="running") |
|
|
|
token_usage = Column(JSON, default=dict) |
|
|
|
latency_ms = Column(Integer, nullable=True) |
|
|
|
error_message = Column(Text, nullable=True) |
|
|
|
started_at = Column(DateTime, default=datetime.utcnow) |
|
|
|
finished_at = Column(DateTime) |
|
|
|
|
|
|
|
|
|
|
|
class MCPService(Base): |
|
|
|
__tablename__ = "mcp_services" |
|
|
|
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) |
|
|
|
name = Column(String(100), unique=True, nullable=False) |
|
|
|
transport = Column(String(20), default="http") |
|
|
|
url = Column(String(500)) |
|
|
|
command = Column(String(500)) |
|
|
|
args = Column(JSON, default=list) |
|
|
|
env = Column(JSON, default=dict) |
|
|
|
status = Column(String(20), default="disconnected") |
|
|
|
tools = Column(JSON, default=list) |
|
|
|
creator_id = Column(UUID(as_uuid=True), ForeignKey("users.id")) |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) |
|
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) |
|
|
|
|
|
|
|
|
|
|
|
class NotificationTemplate(Base): |
|
|
|
__tablename__ = "notification_templates" |
|
|
|
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) |
|
|
|
name = Column(String(100), nullable=False) |
|
|
|
code = Column(String(100), unique=True, nullable=False) |
|
|
|
channel = Column(String(20), default="wecom") |
|
|
|
title_template = Column(String(500)) |
|
|
|
body_template = Column(Text, nullable=False) |
|
|
|
variables = Column(JSON, default=list) |
|
|
|
is_system = Column(Boolean, default=False) |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) |
|
|
|
|
|
|
|
|
|
|
|
class SystemMetric(Base): |
|
|
|
__tablename__ = "system_metrics" |
|
|
|
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) |
|
|
|
metric_type = Column(String(50), nullable=False) |
|
|
|
value = Column(JSON, nullable=False) |
|
|
|
collected_at = Column(DateTime, default=datetime.utcnow) |
|
|
|
|
|
|
|
|
|
|
|
class AgentConfig(Base): |
|
|
|
__tablename__ = "agent_configs" |
|
|
|
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) |
|
|
|
name = Column(String(100), nullable=False) |
|
|
|
description = Column(String(500)) |
|
|
|
system_prompt = Column(Text, default="") |
|
|
|
model = Column(String(50), default="gpt-4o-mini") |
|
|
|
model_instance_id = Column(UUID(as_uuid=True), ForeignKey("model_instances.id"), nullable=True) |
|
|
|
embedding_model_id = Column(UUID(as_uuid=True), ForeignKey("model_instances.id"), nullable=True) |
|
|
|
temperature = Column(Float, default=0.7) |
|
|
|
tools = Column(JSON, default=list) |
|
|
|
status = Column(String(20), default="active") |
|
|
|
creator_id = Column(UUID(as_uuid=True), ForeignKey("users.id")) |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) |
|
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) |
|
|
|
|
|
|
|
|
|
|
|
class AuditLog(Base): |
|
|
|
__tablename__ = "audit_logs" |
|
|
|
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) |
|
|
|
operator_id = Column(UUID(as_uuid=True), ForeignKey("users.id")) |
|
|
|
action = Column(String(100), nullable=False) |
|
|
|
resource = Column(String(100)) |
|
|
|
resource_id = Column(String(100)) |
|
|
|
detail = Column(JSON, default=dict) |
|
|
|
ip_address = Column(String(50)) |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) |
|
|
|
|
|
|
|
|
|
|
|
class MemoryMessage(Base): |
|
|
|
__tablename__ = "memory_messages" |
|
|
|
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) |
|
|
|
user_id = Column(UUID(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False) |
|
|
|
flow_id = Column(UUID(as_uuid=True), ForeignKey("flow_definitions.id", ondelete="CASCADE"), nullable=False) |
|
|
|
session_id = Column(UUID(as_uuid=True), nullable=False) |
|
|
|
role = Column(String(20), nullable=False) |
|
|
|
content = Column(Text, nullable=False) |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) |
|
|
|
|
|
|
|
|
|
|
|
class MemoryAtom(Base): |
|
|
|
__tablename__ = "memory_atoms" |
|
|
|
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) |
|
|
|
user_id = Column(UUID(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False) |
|
|
|
flow_id = Column(UUID(as_uuid=True), ForeignKey("flow_definitions.id", ondelete="SET NULL"), nullable=True) |
|
|
|
atom_type = Column(String(20), nullable=False) |
|
|
|
content = Column(Text, nullable=False) |
|
|
|
priority = Column(Integer, default=50) |
|
|
|
source_session_id = Column(UUID(as_uuid=True), nullable=True) |
|
|
|
metadata_ = Column("metadata", JSON, default=dict) |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) |
|
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) |
|
|
|
|
|
|
|
|
|
|
|
class MemoryScene(Base): |
|
|
|
__tablename__ = "memory_scenes" |
|
|
|
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) |
|
|
|
user_id = Column(UUID(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False) |
|
|
|
flow_id = Column(UUID(as_uuid=True), ForeignKey("flow_definitions.id", ondelete="SET NULL"), nullable=True) |
|
|
|
scene_name = Column(String(200), nullable=False) |
|
|
|
summary = Column(Text, nullable=False) |
|
|
|
heat = Column(Integer, default=0) |
|
|
|
content = Column(JSON, default=dict) |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) |
|
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) |
|
|
|
|
|
|
|
|
|
|
|
class MemoryPersona(Base): |
|
|
|
__tablename__ = "memory_personas" |
|
|
|
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) |
|
|
|
user_id = Column(UUID(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, unique=True) |
|
|
|
content = Column(JSON, default=dict, nullable=False) |
|
|
|
raw_text = Column(Text, default="") |
|
|
|
version = Column(Integer, default=1) |
|
|
|
updated_at = Column(DateTime, default=datetime.utcnow) |
|
|
|
|
|
|
|
|
|
|
|
class MemorySession(Base): |
|
|
|
__tablename__ = "memory_sessions" |
|
|
|
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) |
|
|
|
user_id = Column(UUID(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False) |
|
|
|
flow_id = Column(UUID(as_uuid=True), ForeignKey("flow_definitions.id", ondelete="CASCADE"), nullable=False) |
|
|
|
session_id = Column(UUID(as_uuid=True), nullable=False) |
|
|
|
flow_name = Column(String(200), default="") |
|
|
|
message_count = Column(Integer, default=0) |
|
|
|
last_active_at = Column(DateTime, default=datetime.utcnow) |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) |
|
|
|
|
|
|
|
|
|
|
|
class ModelProvider(Base): |
|
|
|
__tablename__ = "model_providers" |
|
|
|
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) |
|
|
|
name = Column(String(100), nullable=False) |
|
|
|
provider_type = Column(String(50), nullable=False) |
|
|
|
base_url = Column(String(500)) |
|
|
|
api_key = Column(Text) |
|
|
|
extra_config = Column(JSON, default=dict) |
|
|
|
is_active = Column(Boolean, default=True) |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) |
|
|
|
|
|
|
|
|
|
|
|
class ModelInstance(Base): |
|
|
|
__tablename__ = "model_instances" |
|
|
|
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) |
|
|
|
provider_id = Column(UUID(as_uuid=True), ForeignKey("model_providers.id", ondelete="CASCADE")) |
|
|
|
model_name = Column(String(100), nullable=False) |
|
|
|
model_type = Column(String(30), nullable=False) |
|
|
|
display_name = Column(String(200)) |
|
|
|
capabilities = Column(JSON, default=dict) |
|
|
|
default_params = Column(JSON, default=dict) |
|
|
|
is_default = Column(Boolean, default=False) |
|
|
|
is_active = Column(Boolean, default=True) |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) |
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) # 模板唯一标识 UUID |
|
|
|
name = Column(String(200), nullable=False) # 模板名称 |
|
|
|
description = Column(Text, default="") # 模板描述 |
|
|
|
category = Column(String(50), default="") # 模板分类 |
|
|
|
definition_json = Column(JSON, nullable=False, default=dict) # 模板的流程定义 JSON |
|
|
|
icon = Column(String(50), default="") # 模板图标名称 |
|
|
|
sort_order = Column(Integer, default=0) # 排序序号 |
|
|
|
is_builtin = Column(Boolean, default=False) # 是否为系统内置模板 |
|
|
|
usage_count = Column(Integer, default=0) # 使用次数统计 |
|
|
|
created_by = Column(UUID(as_uuid=True), ForeignKey("users.id")) # 创建者用户 ID |
|
|
|
created_at = Column(DateTime, default=datetime.utcnow) # 记录创建时间 |
|
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # 记录更新时间 |
|
|
|
|