You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

373 lines
22 KiB

"""
数据库 ORM 模型模块
本模块定义了所有数据库表对应的 SQLAlchemy ORM 模型。
每个类映射到一张数据库表,类属性映射到表字段。
"""
import uuid
from datetime import datetime
from sqlalchemy import Column, String, DateTime, ForeignKey, Integer, Boolean, JSON, Text, Float
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import relationship
from database import Base
class Department(Base):
"""部门表 (departments),存储企业部门层级结构,支持多级树形组织架构。"""
__tablename__ = "departments"
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") # 部门下的用户列表
class User(Base):
"""用户表 (users),存储系统用户信息,包括账号、身份、组织归属。"""
__tablename__ = "users"
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),存储系统角色和岗位定义,通过 role_type 区分。
role_type 有两种取值:
- "platform": 管理后台平台角色(超管、系统管理员等)
- "position": 企业AI用户岗位(高管、经理、普通员工等)
"""
__tablename__ = "roles"
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)) # 描述
role_type = Column(String(20), default="position") # 类型:platform(平台角色) / position(企业AI岗位)
is_system = Column(Boolean, default=False) # 是否为系统内置(不可删除)
data_scope = Column(String(50), default="self_only") # 数据权限范围:all/subordinate_only/self_only
created_at = Column(DateTime, default=datetime.utcnow) # 记录创建时间
permissions = relationship("RolePermission", back_populates="role") # 权限关联列表
class Permission(Base):
"""权限表 (permissions),存储系统中每个可操作的权限点。"""
__tablename__ = "permissions"
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) # 角色 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) # 用户 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) # 会话唯一标识 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) # 消息唯一标识 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) # 任务唯一标识 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) # 流程唯一标识 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) # 版本唯一标识 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) # 密钥唯一标识 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) # 模板唯一标识 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) # 记录更新时间
class AgentConfig(Base):
"""智能体配置表 (agent_configs),存储 AI 智能体的配置参数。"""
__tablename__ = "agent_configs"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) # 配置唯一标识 UUID
name = Column(String(200), nullable=False) # 智能体名称
description = Column(Text) # 智能体描述
system_prompt = Column(Text) # 系统提示词
model = Column(String(100), default="") # 默认模型名称
model_instance_id = Column(UUID(as_uuid=True), nullable=True) # 关联的模型实例 ID
embedding_model_id = Column(UUID(as_uuid=True), nullable=True) # 关联的嵌入模型 ID
temperature = Column(Float, default=0.7) # 温度参数
tools = Column(JSON, default=list) # 可用工具列表
status = Column(String(20), default="active") # 状态:active/inactive
creator_id = 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) # 记录更新时间
class ModelProvider(Base):
"""模型供应商表 (model_providers),存储 LLM/Embedding/Rerank 模型供应商的接入配置。"""
__tablename__ = "model_providers"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) # 供应商唯一标识 UUID
name = Column(String(100), nullable=False) # 供应商名称(如 OpenAI、智谱AI)
provider_type = Column(String(50), nullable=False) # 供应商类型:openai_compatible/openai/zhipu/ollama/deepseek
base_url = Column(String(500)) # API 基础地址
api_key = Column(String(500)) # API 密钥(加密存储)
extra_config = Column(JSON, default=dict) # 额外配置(如 region、project 等)
is_active = Column(Boolean, default=True) # 是否启用
created_at = Column(DateTime, default=datetime.utcnow) # 记录创建时间
class ModelInstance(Base):
"""模型实例表 (model_instances),存储供应商下的具体模型实例。支持 LLM/Embedding/Rerank 三种类型。"""
__tablename__ = "model_instances"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) # 实例唯一标识 UUID
provider_id = Column(UUID(as_uuid=True), ForeignKey("model_providers.id", ondelete="CASCADE"), nullable=False) # 所属供应商 ID
model_name = Column(String(200), nullable=False) # 模型标识名(如 gpt-4o、text-embedding-3-small、bge-reranker-v2-m3)
model_type = Column(String(20), nullable=False) # 模型类型:llm/embedding/rerank
display_name = Column(String(200)) # 显示名称(如 GPT-4o、Embedding-3-Small、BGE Reranker)
capabilities = Column(JSON, default=dict) # 能力配置(LLM: vision/function_calling; Embedding/Rerank: dimension/max_tokens)
default_params = Column(JSON, default=dict) # 默认参数(如 temperature、max_tokens、dimension)
is_default = Column(Boolean, default=False) # 是否为该类型下的默认模型
is_active = Column(Boolean, default=True) # 是否启用
created_at = Column(DateTime, default=datetime.utcnow) # 记录创建时间
class CustomTool(Base):
"""自定义工具表 (custom_tools),存储用户自定义的 HTTP 工具定义。"""
__tablename__ = "custom_tools"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) # 工具唯一标识 UUID
name = Column(String(100), unique=True, nullable=False) # 工具名称(唯一)
description = Column(Text) # 工具描述
schema_json = Column(JSON, nullable=False, default=dict) # 参数 Schema 定义 JSON
endpoint_url = Column(String(500), default="") # API 端点 URL
method = Column(String(10), default="GET") # HTTP 方法
path = Column(String(500), default="") # API 路径
headers_json = Column(JSON, default=dict) # 自定义请求头
auth_type = Column(String(20), default="none") # 认证类型:none/api_key/bearer
auth_config = Column(JSON, default=dict) # 认证配置信息
is_active = Column(Boolean, default=True) # 是否启用(软删除标记)
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) # 记录更新时间
class MCPService(Base):
"""MCP 服务注册表 (mcp_services),存储 Model Context Protocol 服务的注册信息。"""
__tablename__ = "mcp_services"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) # 服务唯一标识 UUID
name = Column(String(100), nullable=False) # 服务名称
endpoint_url = Column(String(500), nullable=False) # MCP 服务端点 URL
status = Column(String(20), default="active") # 服务状态:active/inactive/error
config = Column(JSON, default=dict) # 服务配置信息
last_heartbeat = Column(DateTime) # 最后心跳时间
created_at = Column(DateTime, default=datetime.utcnow) # 记录创建时间
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # 记录更新时间
class AuditLog(Base):
"""审计日志表 (audit_logs),记录系统关键操作的审计追踪日志。"""
__tablename__ = "audit_logs"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) # 日志唯一标识 UUID
user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=True) # 操作用户 ID
action = Column(String(50), nullable=False) # 操作类型(create/update/delete/login/export)
resource_type = Column(String(50), nullable=False) # 资源类型(user/agent/flow/document/task)
resource_id = Column(String(100)) # 资源 ID
detail = Column(JSON, default=dict) # 操作详情 JSON
ip_address = Column(String(50)) # 操作来源 IP
user_agent = Column(String(500)) # 客户端 User-Agent
created_at = Column(DateTime, default=datetime.utcnow) # 日志记录时间
class NotificationTemplate(Base):
"""通知模板表 (notification_templates),存储企业微信等渠道的消息通知模板。"""
__tablename__ = "notification_templates"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) # 模板唯一标识 UUID
name = Column(String(100), unique=True, nullable=False) # 模板名称(唯一)
channel = Column(String(20), nullable=False) # 通知渠道:wecom/email/webhook
event_type = Column(String(50), nullable=False) # 触发事件类型
subject_template = Column(String(500)) # 消息标题模板
body_template = Column(Text) # 消息正文模板
is_active = Column(Boolean, default=True) # 是否启用
created_at = Column(DateTime, default=datetime.utcnow) # 记录创建时间
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # 记录更新时间
class SystemMetric(Base):
"""系统指标表 (system_metrics),存储系统运行时性能指标数据。"""
__tablename__ = "system_metrics"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) # 指标唯一标识 UUID
metric_name = Column(String(50), nullable=False) # 指标名称(cpu/memory/request_latency/active_users)
metric_value = Column(Float) # 指标数值
tags = Column(JSON, default=dict) # 标签维度(如 instance、region)
recorded_at = Column(DateTime, default=datetime.utcnow, index=True) # 记录时间(索引)
class FlowExecution(Base):
"""流程执行记录表 (flow_executions),存储工作流每次执行的详细记录。"""
__tablename__ = "flow_executions"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) # 执行记录唯一标识 UUID
flow_id = Column(UUID(as_uuid=True), ForeignKey("flow_definitions.id"), nullable=False) # 关联的流程定义 ID
session_id = Column(String(100)) # 关联的会话 ID
status = Column(String(20), default="running") # 执行状态:running/completed/failed/cancelled
input_data = Column(JSON, default=dict) # 输入数据
output_data = Column(JSON, default=dict) # 输出数据
error_message = Column(Text) # 错误信息(失败时记录)
started_by = Column(UUID(as_uuid=True), ForeignKey("users.id")) # 触发执行的用户 ID
started_at = Column(DateTime, default=datetime.utcnow) # 开始时间
finished_at = Column(DateTime) # 结束时间
duration_ms = Column(Integer) # 执行耗时(毫秒)
class MemoryMessage(Base):
"""记忆消息表 (memory_messages),存储流程引擎中节点的中间记忆数据。"""
__tablename__ = "memory_messages"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) # 消息唯一标识 UUID
flow_execution_id = Column(UUID(as_uuid=True), ForeignKey("flow_executions.id", ondelete="CASCADE"), nullable=False) # 关联的流程执行 ID
node_id = Column(String(100), nullable=False) # 节点标识
role = Column(String(20), nullable=False) # 消息角色:user/assistant/system/tool
content = Column(Text, nullable=False) # 消息内容
metadata_ = Column("metadata", JSON, default=dict) # 元数据
created_at = Column(DateTime, default=datetime.utcnow) # 记录创建时间