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.
213 lines
13 KiB
213 lines
13 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),存储系统角色定义,用于 RBAC 权限管理。"""
|
|
__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)) # 角色描述
|
|
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") # 角色权限关联列表
|
|
|
|
|
|
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) # 记录更新时间
|
|
|