Files
ai-agent-admin/backend-fastapi/zq_smart_table/model.py
T

139 lines
6.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from sqlalchemy import Column, String, Text, Boolean, Integer, JSON, Index
from sqlalchemy.dialects.postgresql import JSONB
from app.base_model import BaseModel
SmartJSON = JSON().with_variant(JSONB(), "postgresql")
class SmartTable(BaseModel):
"""多维表格 / 文档"""
__tablename__ = "smart_table"
name = Column(String(200), nullable=False, comment="表名")
icon = Column(String(50), default="Grid", comment="图标")
description = Column(Text, nullable=True, comment="描述")
active_view_id = Column(String(21), nullable=True, comment="当前激活视图ID")
type = Column(String(20), default="table", nullable=False, comment="类型: table / document")
content = Column(SmartJSON, nullable=True, comment="文档内容(Tiptap JSON), 仅 type=document 时使用")
parent_id = Column(String(21), nullable=True, index=True, comment="父页面ID(自引用,用于子页面层级嵌套)")
wiki_space_id = Column(String(21), nullable=True, index=True, comment="所属文档库ID")
class SmartField(BaseModel):
"""多维表格字段"""
__tablename__ = "smart_field"
table_id = Column(String(21), nullable=False, index=True, comment="所属表ID")
name = Column(String(200), nullable=False, comment="字段名")
type = Column(String(30), nullable=False, comment="字段类型")
width = Column(Integer, default=150, comment="列宽")
visible = Column(Boolean, default=True, comment="是否可见")
required = Column(Boolean, default=False, comment="是否必填")
description = Column(Text, nullable=True, comment="描述")
config = Column(SmartJSON, default=dict, comment="扩展配置(options/format/precision等)")
__table_args__ = (
Index("ix_smart_field_table_sort", "table_id", "sort"),
)
class SmartRecord(BaseModel):
"""多维表格记录"""
__tablename__ = "smart_record"
table_id = Column(String(21), nullable=False, index=True, comment="所属表ID")
values = Column(SmartJSON, default=dict, comment="字段值映射 {fieldId: cellValue}")
__table_args__ = (
Index("ix_smart_record_table_sort", "table_id", "sort"),
)
class SmartTableLink(BaseModel):
"""记录关联关系(多对多)"""
__tablename__ = "smart_table_link"
field_id = Column(String(21), nullable=False, index=True, comment="Link字段ID")
source_record_id = Column(String(21), nullable=False, index=True, comment="源记录ID")
target_record_id = Column(String(21), nullable=False, index=True, comment="目标记录ID")
__table_args__ = (
Index("ix_link_field_source", "field_id", "source_record_id"),
Index("ix_link_field_target", "field_id", "target_record_id"),
Index("uq_link_pair", "field_id", "source_record_id", "target_record_id", unique=True),
)
class SmartView(BaseModel):
"""多维表格视图"""
__tablename__ = "smart_view"
table_id = Column(String(21), nullable=False, index=True, comment="所属表ID")
name = Column(String(200), nullable=False, comment="视图名")
type = Column(String(30), default="grid", comment="视图类型")
config = Column(SmartJSON, default=dict, comment="视图配置(filters/sorts/groups/visibleFieldIds等)")
__table_args__ = (
Index("ix_smart_view_table_sort", "table_id", "sort"),
)
class SmartTableComment(BaseModel):
"""记录评论"""
__tablename__ = "smart_table_comment"
record_id = Column(String(21), nullable=False, index=True, comment="所属记录ID")
user_id = Column(String(21), nullable=False, index=True, comment="评论者用户ID")
content = Column(Text, nullable=False, comment="评论内容(纯文本,含@提及标记)")
mentions = Column(SmartJSON, default=list, comment="被@提及的用户ID列表")
parent_id = Column(String(21), nullable=True, index=True, comment="父评论ID(用于回复)")
__table_args__ = (
Index("ix_comment_record_created", "record_id", "sys_create_datetime"),
)
class SmartDocumentVersion(BaseModel):
"""文档版本历史"""
__tablename__ = "smart_document_version"
document_id = Column(String(21), nullable=False, index=True, comment="文档ID(逻辑外键关联smart_table")
version = Column(Integer, nullable=False, comment="版本号")
content = Column(SmartJSON, nullable=False, comment="文档内容快照(Tiptap JSON)")
title = Column(String(200), nullable=True, comment="版本标题/文档名称快照")
change_summary = Column(String(500), nullable=True, comment="变更摘要")
content_size = Column(Integer, default=0, comment="内容大小(字节)")
__table_args__ = (
Index("ix_doc_version_doc_ver", "document_id", "version"),
Index("ix_doc_version_doc_created", "document_id", "sys_create_datetime"),
)
class SmartDocumentTemplate(BaseModel):
"""文档模板"""
__tablename__ = "smart_document_template"
name = Column(String(200), nullable=False, comment="模板名称")
description = Column(Text, nullable=True, comment="模板描述")
icon = Column(String(50), default="FileText", comment="模板图标")
category = Column(String(50), default="custom", comment="分类: system / custom")
content = Column(SmartJSON, nullable=False, comment="模板内容(Tiptap JSON)")
preview_image = Column(String(500), nullable=True, comment="预览图URL")
is_system = Column(Boolean, default=False, comment="是否系统预设模板")
use_count = Column(Integer, default=0, comment="使用次数")
class SmartWikiSpace(BaseModel):
"""文档库/知识空间"""
__tablename__ = "smart_wiki_space"
name = Column(String(200), nullable=False, comment="文档库名称")
icon = Column(String(50), default="BookOpen", comment="图标")
avatar = Column(String(500), nullable=True, comment="头像文件ID")
description = Column(Text, nullable=True, comment="描述")
cover = Column(String(500), nullable=True, comment="封面图URL")
category = Column(String(50), default="default", comment="分类标签")
visibility = Column(String(20), default="private", comment="可见性: private/team/public")