-- ===================================================== -- 报告模板系统表结构 v2.0 -- 「示例文档驱动」的模板生成系统 -- PostgreSQL 15+ -- -- 表列表: -- 1. templates - 报告模板 -- 2. source_files - 来源文件定义 -- 3. variables - 模板变量 -- 4. generations - 生成任务 -- -- 创建时间: 2026-01-23 -- ===================================================== -- ============================================ -- 1. 报告模板表(templates) -- ============================================ -- 注意: 如果 supplement_tables.sql 中已定义旧版 templates 表, -- 需要先删除或重命名 DROP TABLE IF EXISTS templates CASCADE; CREATE TABLE templates ( id VARCHAR(36) PRIMARY KEY, user_id VARCHAR(36) NOT NULL REFERENCES users(id) ON DELETE CASCADE, name VARCHAR(255) NOT NULL, description TEXT, base_document_id VARCHAR(36) NOT NULL REFERENCES documents(id) ON DELETE RESTRICT, status VARCHAR(32) DEFAULT 'draft', config JSONB DEFAULT '{}', is_public BOOLEAN DEFAULT FALSE, use_count INT DEFAULT 0, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, create_by VARCHAR(36), create_by_name VARCHAR(100), update_by VARCHAR(36), update_by_name VARCHAR(100) ); CREATE INDEX idx_templates_user_id ON templates(user_id); CREATE INDEX idx_templates_status ON templates(status); CREATE INDEX idx_templates_is_public ON templates(is_public); CREATE INDEX idx_templates_base_document ON templates(base_document_id); COMMENT ON TABLE templates IS '报告模板'; COMMENT ON COLUMN templates.base_document_id IS '示例报告文档ID,关联 documents 表'; COMMENT ON COLUMN templates.status IS 'draft-草稿, published-已发布, archived-已归档'; COMMENT ON COLUMN templates.config IS '模板配置,如默认AI模型等'; COMMENT ON COLUMN templates.is_public IS '是否公开给其他用户使用'; COMMENT ON COLUMN templates.use_count IS '被使用生成报告的次数'; -- ============================================ -- 2. 来源文件定义表(source_files) -- ============================================ CREATE TABLE IF NOT EXISTS source_files ( id VARCHAR(36) PRIMARY KEY, template_id VARCHAR(36) NOT NULL REFERENCES templates(id) ON DELETE CASCADE, alias VARCHAR(100) NOT NULL, description TEXT, file_types JSONB DEFAULT '["pdf", "docx"]', required BOOLEAN DEFAULT TRUE, example_document_id VARCHAR(36) REFERENCES documents(id) ON DELETE SET NULL, display_order INT DEFAULT 0, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, CONSTRAINT uk_source_files_alias UNIQUE (template_id, alias) ); CREATE INDEX idx_source_files_template ON source_files(template_id); COMMENT ON TABLE source_files IS '来源文件定义'; COMMENT ON COLUMN source_files.alias IS '用户自定义的别名,用于引用,如"可研批复"'; COMMENT ON COLUMN source_files.file_types IS '允许上传的文件类型列表'; COMMENT ON COLUMN source_files.required IS '是否为必须提供的文件'; COMMENT ON COLUMN source_files.example_document_id IS '创建模板时使用的示例文件,用于预览'; -- ============================================ -- 3. 模板变量表(variables) -- ============================================ CREATE TABLE IF NOT EXISTS variables ( id VARCHAR(36) PRIMARY KEY, template_id VARCHAR(36) NOT NULL REFERENCES templates(id) ON DELETE CASCADE, -- 变量标识 name VARCHAR(100) NOT NULL, display_name VARCHAR(200) NOT NULL, variable_group VARCHAR(100), -- 在示例报告中的位置 location JSONB NOT NULL, -- 示例值 example_value TEXT, value_type VARCHAR(32) DEFAULT 'text', -- 数据来源 source_file_alias VARCHAR(100), source_type VARCHAR(32) NOT NULL, source_config JSONB, -- 提取方式 extract_type VARCHAR(32), extract_config JSONB, display_order INT DEFAULT 0, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, CONSTRAINT uk_variables_name UNIQUE (template_id, name) ); CREATE INDEX idx_variables_template ON variables(template_id); CREATE INDEX idx_variables_source_alias ON variables(source_file_alias); CREATE INDEX idx_variables_source_type ON variables(source_type); COMMENT ON TABLE variables IS '模板变量'; COMMENT ON COLUMN variables.name IS '变量名,模板内唯一,用于程序引用'; COMMENT ON COLUMN variables.display_name IS '显示名称,用于用户界面'; COMMENT ON COLUMN variables.location IS '变量在文档中的位置,包含 element_id、偏移量等'; COMMENT ON COLUMN variables.value_type IS 'text-文本, date-日期, number-数字, table-表格'; COMMENT ON COLUMN variables.source_type IS 'document-从来源文件提取, manual-手动输入, reference-引用其他变量, fixed-固定值'; COMMENT ON COLUMN variables.extract_type IS 'direct-直接提取, ai_extract-AI字段提取, ai_summarize-AI总结'; -- ============================================ -- 4. 生成任务表(generations) -- ============================================ CREATE TABLE IF NOT EXISTS generations ( id VARCHAR(36) PRIMARY KEY, template_id VARCHAR(36) NOT NULL REFERENCES templates(id) ON DELETE RESTRICT, user_id VARCHAR(36) NOT NULL REFERENCES users(id) ON DELETE CASCADE, name VARCHAR(255), -- 来源文件映射:别名 → 文档ID source_file_map JSONB NOT NULL, -- 变量提取结果 variable_values JSONB, -- 生成的文档 output_document_id VARCHAR(36) REFERENCES documents(id) ON DELETE SET NULL, output_file_path VARCHAR(500), status VARCHAR(32) DEFAULT 'pending', error_message TEXT, progress INT DEFAULT 0, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, completed_at TIMESTAMP ); CREATE INDEX idx_generations_template ON generations(template_id); CREATE INDEX idx_generations_user ON generations(user_id); CREATE INDEX idx_generations_status ON generations(status); CREATE INDEX idx_generations_create_time ON generations(create_time DESC); COMMENT ON TABLE generations IS '报告生成任务'; COMMENT ON COLUMN generations.source_file_map IS '来源文件映射,如 {"可研批复": "doc_123"}'; COMMENT ON COLUMN generations.variable_values IS '变量提取结果,包含值、置信度、状态等'; COMMENT ON COLUMN generations.status IS 'pending-待执行, extracting-提取中, review-待确认, completed-已完成, error-错误'; COMMENT ON COLUMN generations.progress IS '进度百分比 0-100'; -- ============================================ -- 5. 更新时间触发器 -- ============================================ -- 确保 update_update_time_column 函数存在(在 init.sql 中定义) -- 如果不存在,创建一个 CREATE OR REPLACE FUNCTION update_update_time_column() RETURNS TRIGGER AS $$ BEGIN NEW.update_time = CURRENT_TIMESTAMP; RETURN NEW; END; $$ LANGUAGE plpgsql; DROP TRIGGER IF EXISTS trigger_templates_update_time ON templates; CREATE TRIGGER trigger_templates_update_time BEFORE UPDATE ON templates FOR EACH ROW EXECUTE FUNCTION update_update_time_column(); DROP TRIGGER IF EXISTS trigger_variables_update_time ON variables; CREATE TRIGGER trigger_variables_update_time BEFORE UPDATE ON variables FOR EACH ROW EXECUTE FUNCTION update_update_time_column(); -- ============================================ -- 6. 旧版 extract 表(v1.x 兼容) -- ============================================ -- 以下表将在未来版本中删除,仅保留兼容性 -- extract_projects, extract_source_documents, extract_rules, -- extract_results, extract_rule_templates -- 如需要删除旧表,取消以下注释: -- DROP TABLE IF EXISTS extract_rule_templates CASCADE; -- DROP TABLE IF EXISTS extract_results CASCADE; -- DROP TABLE IF EXISTS extract_rules CASCADE; -- DROP TABLE IF EXISTS extract_source_documents CASCADE; -- DROP TABLE IF EXISTS extract_projects CASCADE;