-- 1. 创建文档模板表主键序列（自增ID）
CREATE SEQUENCE doc_template_id_seq
    START WITH 1                   -- 起始值为1
    INCREMENT BY 1                 -- 每次递增1
    NO MINVALUE                    -- 无最小值限制
    NO MAXVALUE                    -- 无最大值限制
    CACHE 1;                       -- 缓存1个序列值，提升性能


-- 2. 创建文档模板表（doc_template）
CREATE TABLE "public"."doc_template" (
    -- 主键字段
    "id" int8 NOT NULL DEFAULT nextval('doc_template_id_seq'::regclass),  -- 主键ID，关联序列自增
    
    -- 业务核心字段（与实体类DocTemplate对应）
    "name" varchar(100) COLLATE "pg_catalog"."default" NOT NULL,          -- 模板名称（非空，建议100字符内）
    "display_order" int4 DEFAULT 0,                                       -- 排序号（默认0，值越小越靠前）
    "context_json" text COLLATE "pg_catalog"."default" NOT NULL,          -- 模板内容（JSON格式，非空，存储模板结构）
    "definition_id" int8 NOT NULL,                                        -- 文书定义ID（非空，关联doc_definition表主键）
    "use_range" int4 NOT NULL DEFAULT 0,                                  -- 使用范围（非空，0-暂不使用/1-全院/2-指定科室/3-个人）
    "organization_id" int8,                                               -- 指定科室ID（use_range=2时有效，关联科室表）
    "user_id" int8,                                                       -- 指定用户ID（use_range=3时有效，关联用户表）
    "remark" varchar(500) COLLATE "pg_catalog"."default",                 -- 备注（500字符内，存储使用说明）
    
    -- 继承HisBaseEntity的审计字段（通用字段，无需实体类显式定义）
    "tenant_id" int8 NOT NULL,                                            -- 租户ID（非空，多租户隔离）
    "delete_flag" char(1) COLLATE "pg_catalog"."default" NOT NULL DEFAULT '0',  -- 删除标志（非空，0-未删除/1-已删除）
    "create_by" varchar(32) COLLATE "pg_catalog"."default" NOT NULL DEFAULT '',  -- 创建人（非空，存储用户名）
    "create_time" timestamptz(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,      -- 创建时间（非空，默认当前时间，带时区）
    "update_by" varchar(32) COLLATE "pg_catalog"."default",               -- 更新人（存储用户名）
    "update_time" timestamptz(6),                                         -- 更新时间（带时区）
    
    -- 主键约束
    CONSTRAINT "doc_template_pkey" PRIMARY KEY ("id")
    
    -- 外键约束（关联文书定义表，确保数据一致性）
--     CONSTRAINT "fk_doc_template_definition" FOREIGN KEY ("definition_id") 
--         REFERENCES "public"."doc_definition" ("id") ON DELETE RESTRICT,  -- 文书定义删除时，限制删除（避免模板关联失效）
--     
--     -- 外键约束（关联科室表，use_range=2时生效）
--     CONSTRAINT "fk_doc_template_organization" FOREIGN KEY ("organization_id") 
--         REFERENCES "public"."sys_organization" ("id") ON DELETE SET NULL,  -- 科室删除时，置空该字段
--     
--     -- 外键约束（关联用户表，use_range=3时生效）
--     CONSTRAINT "fk_doc_template_user" FOREIGN KEY ("user_id") 
--         REFERENCES "public"."sys_user" ("id") ON DELETE SET NULL,  -- 用户删除时，置空该字段
--     
--     -- 唯一约束（模板名称+文书定义ID唯一，避免同文书下重复模板）
--     CONSTRAINT "uk_doc_template_name_defid" UNIQUE ("name", "definition_id")
);


-- 3. 设置表所有者（与项目数据库用户一致，通常为postgres）
ALTER TABLE "public"."doc_template" OWNER TO "postgres";


-- 4. 表及字段注释（便于维护，与实体类注释对应）
COMMENT ON TABLE "public"."doc_template" IS '文档模板表：存储各类文书的模板信息，支持全院、科室、个人等不同使用范围';

COMMENT ON COLUMN "public"."doc_template"."id" IS '主键ID';
COMMENT ON COLUMN "public"."doc_template"."name" IS '模板名称：唯一标识模板，同文书定义下不可重复';
COMMENT ON COLUMN "public"."doc_template"."display_order" IS '排序号：模板列表展示顺序，值越小越靠前，默认0';
COMMENT ON COLUMN "public"."doc_template"."context_json" IS '模板内容：JSON格式存储模板结构、字段配置等信息，前端据此渲染模板';
COMMENT ON COLUMN "public"."doc_template"."definition_id" IS '文书定义ID：关联doc_definition表，标识模板所属的文书类型';
COMMENT ON COLUMN "public"."doc_template"."use_range" IS '使用范围：0-暂不使用，1-全院使用，2-指定科室使用，3-个人使用';
COMMENT ON COLUMN "public"."doc_template"."organization_id" IS '指定科室ID：use_range=2时有效，关联sys_organization表';
COMMENT ON COLUMN "public"."doc_template"."user_id" IS '指定用户ID：use_range=3时有效，关联sys_user表';
COMMENT ON COLUMN "public"."doc_template"."remark" IS '备注：存储模板使用场景、注意事项等额外说明';
COMMENT ON COLUMN "public"."doc_template"."tenant_id" IS '租户ID：多租户系统隔离字段，非空';
COMMENT ON COLUMN "public"."doc_template"."delete_flag" IS '删除标志：0-未删除，1-已删除，默认0';
COMMENT ON COLUMN "public"."doc_template"."create_by" IS '创建人：存储创建者用户名，非空';
COMMENT ON COLUMN "public"."doc_template"."create_time" IS '创建时间：默认当前时间，带时区，非空';
COMMENT ON COLUMN "public"."doc_template"."update_by" IS '更新人：存储更新者用户名';
COMMENT ON COLUMN "public"."doc_template"."update_time" IS '更新时间：带时区';


-- -- 5. 索引设计（优化高频查询场景，提升性能）
-- -- （1）按文书定义ID查询（高频：查询某类文书的所有模板）
-- CREATE INDEX "idx_doc_template_definition" 
--     ON "public"."doc_template" ("definition_id") 
--     WHERE "delete_flag" = '0';  -- 只索引未删除数据，减少索引体积
-- 
-- -- （2）按使用范围+科室ID查询（高频：科室用户查询本科室模板）
-- CREATE INDEX "idx_doc_template_userange_org" 
--     ON "public"."doc_template" ("use_range", "organization_id") 
--     WHERE "delete_flag" = '0';
-- 
-- -- （3）按使用范围+用户ID查询（高频：个人用户查询自己的模板）
-- CREATE INDEX "idx_doc_template_userange_user" 
--     ON "public"."doc_template" ("use_range", "user_id") 
--     WHERE "delete_flag" = '0';
-- 
-- -- （4）按模板名称模糊查询（高频：搜索模板）
-- CREATE INDEX "idx_doc_template_name" 
--     ON "public"."doc_template" ("name") 
--     WHERE "delete_flag" = '0';
-- 
-- -- （5）按租户ID+创建时间查询（高频：多租户下按时间筛选模板）
-- CREATE INDEX "idx_doc_template_tenant_createtime" 
--     ON "public"."doc_template" ("tenant_id", "create_time") 
--     WHERE "delete_flag" = '0';


-- 向迁移历史表插入记录
INSERT INTO __MigrationsHistory (MigrationId, ProductVersion)
VALUES ('202509011214add_table_doc_template', '1.0.0');