""" 数据库 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) # 记录更新时间