"""create template tables Revision ID: 20260701_0001 Revises: Create Date: 2026-07-01 12:00:00 """ from typing import Sequence, Union from alembic import op import sqlalchemy as sa revision: str = "20260701_0001" down_revision: Union[str, None] = None branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: op.create_table( "template", sa.Column("id", sa.Integer(), autoincrement=True, nullable=False), sa.Column("name", sa.String(length=200), nullable=False, comment="模板名称"), sa.Column("type", sa.String(length=50), nullable=True, comment="报告类/公文类/总结类/合同类"), sa.Column("version", sa.String(length=20), nullable=True, comment="版本号"), sa.Column("original_file_path", sa.String(length=500), nullable=False, comment="原始 Word 文件路径"), sa.Column("status", sa.Integer(), nullable=True, comment="1=启用 0=停用"), sa.Column("created_by", sa.String(length=50), nullable=True, comment="创建人"), sa.Column("created_at", sa.DateTime(), nullable=True), sa.Column("updated_at", sa.DateTime(), nullable=True), sa.PrimaryKeyConstraint("id"), ) op.create_table( "template_block", sa.Column("id", sa.Integer(), autoincrement=True, nullable=False), sa.Column("template_id", sa.Integer(), nullable=False, comment="所属模板"), sa.Column("block_id", sa.String(length=50), nullable=False, comment="唯一标识 block_001"), sa.Column("parent_block_id", sa.String(length=50), nullable=True, comment="父级 block_id"), sa.Column("block_type", sa.String(length=20), nullable=False, comment="title/heading/paragraph/table"), sa.Column("block_name", sa.String(length=200), nullable=True, comment="区域名称"), sa.Column("text_preview", sa.String(length=500), nullable=True, comment="文本预览"), sa.Column("level", sa.Integer(), nullable=True, comment="0=文档标题 1=一级 2=二级"), sa.Column("sort_order", sa.Integer(), nullable=True, comment="排序号"), sa.Column("table_rows", sa.Integer(), nullable=True, comment="表格行数"), sa.Column("table_cols", sa.Integer(), nullable=True, comment="表格列数"), sa.Column("created_at", sa.DateTime(), nullable=True), sa.ForeignKeyConstraint(["template_id"], ["template.id"], ondelete="CASCADE"), sa.PrimaryKeyConstraint("id"), ) op.create_table( "block_config", sa.Column("id", sa.Integer(), autoincrement=True, nullable=False), sa.Column("template_id", sa.Integer(), nullable=False), sa.Column("block_id", sa.String(length=50), nullable=False), sa.Column("region_name", sa.String(length=200), nullable=True, comment="区域名称"), sa.Column("region_type", sa.String(length=30), nullable=True, comment="ai_generate/manual/fixed/table"), sa.Column("data_sources", sa.Text(), nullable=True, comment="数据来源 JSON 数组"), sa.Column("prompt", sa.Text(), nullable=True, comment="提示词"), sa.Column("output_format", sa.String(length=30), nullable=True, comment="输出格式"), sa.Column("need_review", sa.Integer(), nullable=True, comment="1=需要审核"), sa.Column("remark", sa.Text(), nullable=True, comment="备注"), sa.Column("enabled", sa.Integer(), nullable=True, comment="1=启用"), sa.Column("created_at", sa.DateTime(), nullable=True), sa.Column("updated_at", sa.DateTime(), nullable=True), sa.ForeignKeyConstraint(["template_id"], ["template.id"], ondelete="CASCADE"), sa.PrimaryKeyConstraint("id"), sa.UniqueConstraint("template_id", "block_id", name="uq_template_block"), ) def downgrade() -> None: op.drop_table("block_config") op.drop_table("template_block") op.drop_table("template")