template_tables.sql 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. -- =====================================================
  2. -- 报告模板系统表结构 v2.0
  3. -- 「示例文档驱动」的模板生成系统
  4. -- PostgreSQL 15+
  5. --
  6. -- 表列表:
  7. -- 1. templates - 报告模板
  8. -- 2. source_files - 来源文件定义
  9. -- 3. variables - 模板变量
  10. -- 4. generations - 生成任务
  11. --
  12. -- 创建时间: 2026-01-23
  13. -- =====================================================
  14. -- ============================================
  15. -- 1. 报告模板表(templates)
  16. -- ============================================
  17. -- 注意: 如果 supplement_tables.sql 中已定义旧版 templates 表,
  18. -- 需要先删除或重命名
  19. DROP TABLE IF EXISTS templates CASCADE;
  20. CREATE TABLE templates (
  21. id VARCHAR(36) PRIMARY KEY,
  22. user_id VARCHAR(36) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
  23. name VARCHAR(255) NOT NULL,
  24. description TEXT,
  25. base_document_id VARCHAR(36) NOT NULL REFERENCES documents(id) ON DELETE RESTRICT,
  26. status VARCHAR(32) DEFAULT 'draft',
  27. config JSONB DEFAULT '{}',
  28. is_public BOOLEAN DEFAULT FALSE,
  29. use_count INT DEFAULT 0,
  30. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  31. update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  32. create_by VARCHAR(36),
  33. create_by_name VARCHAR(100),
  34. update_by VARCHAR(36),
  35. update_by_name VARCHAR(100)
  36. );
  37. CREATE INDEX idx_templates_user_id ON templates(user_id);
  38. CREATE INDEX idx_templates_status ON templates(status);
  39. CREATE INDEX idx_templates_is_public ON templates(is_public);
  40. CREATE INDEX idx_templates_base_document ON templates(base_document_id);
  41. COMMENT ON TABLE templates IS '报告模板';
  42. COMMENT ON COLUMN templates.base_document_id IS '示例报告文档ID,关联 documents 表';
  43. COMMENT ON COLUMN templates.status IS 'draft-草稿, published-已发布, archived-已归档';
  44. COMMENT ON COLUMN templates.config IS '模板配置,如默认AI模型等';
  45. COMMENT ON COLUMN templates.is_public IS '是否公开给其他用户使用';
  46. COMMENT ON COLUMN templates.use_count IS '被使用生成报告的次数';
  47. -- ============================================
  48. -- 2. 来源文件定义表(source_files)
  49. -- ============================================
  50. CREATE TABLE IF NOT EXISTS source_files (
  51. id VARCHAR(36) PRIMARY KEY,
  52. template_id VARCHAR(36) NOT NULL REFERENCES templates(id) ON DELETE CASCADE,
  53. alias VARCHAR(100) NOT NULL,
  54. description TEXT,
  55. file_types JSONB DEFAULT '["pdf", "docx"]',
  56. required BOOLEAN DEFAULT TRUE,
  57. example_document_id VARCHAR(36) REFERENCES documents(id) ON DELETE SET NULL,
  58. display_order INT DEFAULT 0,
  59. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  60. CONSTRAINT uk_source_files_alias UNIQUE (template_id, alias)
  61. );
  62. CREATE INDEX idx_source_files_template ON source_files(template_id);
  63. COMMENT ON TABLE source_files IS '来源文件定义';
  64. COMMENT ON COLUMN source_files.alias IS '用户自定义的别名,用于引用,如"可研批复"';
  65. COMMENT ON COLUMN source_files.file_types IS '允许上传的文件类型列表';
  66. COMMENT ON COLUMN source_files.required IS '是否为必须提供的文件';
  67. COMMENT ON COLUMN source_files.example_document_id IS '创建模板时使用的示例文件,用于预览';
  68. -- ============================================
  69. -- 3. 模板变量表(variables)
  70. -- ============================================
  71. CREATE TABLE IF NOT EXISTS variables (
  72. id VARCHAR(36) PRIMARY KEY,
  73. template_id VARCHAR(36) NOT NULL REFERENCES templates(id) ON DELETE CASCADE,
  74. -- 变量标识
  75. name VARCHAR(100) NOT NULL,
  76. display_name VARCHAR(200) NOT NULL,
  77. variable_group VARCHAR(100),
  78. -- 在示例报告中的位置
  79. location JSONB NOT NULL,
  80. -- 示例值
  81. example_value TEXT,
  82. value_type VARCHAR(32) DEFAULT 'text',
  83. -- 数据来源
  84. source_file_alias VARCHAR(100),
  85. source_type VARCHAR(32) NOT NULL,
  86. source_config JSONB,
  87. -- 提取方式
  88. extract_type VARCHAR(32),
  89. extract_config JSONB,
  90. display_order INT DEFAULT 0,
  91. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  92. update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  93. CONSTRAINT uk_variables_name UNIQUE (template_id, name)
  94. );
  95. CREATE INDEX idx_variables_template ON variables(template_id);
  96. CREATE INDEX idx_variables_source_alias ON variables(source_file_alias);
  97. CREATE INDEX idx_variables_source_type ON variables(source_type);
  98. COMMENT ON TABLE variables IS '模板变量';
  99. COMMENT ON COLUMN variables.name IS '变量名,模板内唯一,用于程序引用';
  100. COMMENT ON COLUMN variables.display_name IS '显示名称,用于用户界面';
  101. COMMENT ON COLUMN variables.location IS '变量在文档中的位置,包含 element_id、偏移量等';
  102. COMMENT ON COLUMN variables.value_type IS 'text-文本, date-日期, number-数字, table-表格';
  103. COMMENT ON COLUMN variables.source_type IS 'document-从来源文件提取, manual-手动输入, reference-引用其他变量, fixed-固定值';
  104. COMMENT ON COLUMN variables.extract_type IS 'direct-直接提取, ai_extract-AI字段提取, ai_summarize-AI总结';
  105. -- ============================================
  106. -- 4. 生成任务表(generations)
  107. -- ============================================
  108. CREATE TABLE IF NOT EXISTS generations (
  109. id VARCHAR(36) PRIMARY KEY,
  110. template_id VARCHAR(36) NOT NULL REFERENCES templates(id) ON DELETE RESTRICT,
  111. user_id VARCHAR(36) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
  112. name VARCHAR(255),
  113. -- 来源文件映射:别名 → 文档ID
  114. source_file_map JSONB NOT NULL,
  115. -- 变量提取结果
  116. variable_values JSONB,
  117. -- 生成的文档
  118. output_document_id VARCHAR(36) REFERENCES documents(id) ON DELETE SET NULL,
  119. output_file_path VARCHAR(500),
  120. status VARCHAR(32) DEFAULT 'pending',
  121. error_message TEXT,
  122. progress INT DEFAULT 0,
  123. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  124. completed_at TIMESTAMP
  125. );
  126. CREATE INDEX idx_generations_template ON generations(template_id);
  127. CREATE INDEX idx_generations_user ON generations(user_id);
  128. CREATE INDEX idx_generations_status ON generations(status);
  129. CREATE INDEX idx_generations_create_time ON generations(create_time DESC);
  130. COMMENT ON TABLE generations IS '报告生成任务';
  131. COMMENT ON COLUMN generations.source_file_map IS '来源文件映射,如 {"可研批复": "doc_123"}';
  132. COMMENT ON COLUMN generations.variable_values IS '变量提取结果,包含值、置信度、状态等';
  133. COMMENT ON COLUMN generations.status IS 'pending-待执行, extracting-提取中, review-待确认, completed-已完成, error-错误';
  134. COMMENT ON COLUMN generations.progress IS '进度百分比 0-100';
  135. -- ============================================
  136. -- 5. 更新时间触发器
  137. -- ============================================
  138. -- 确保 update_update_time_column 函数存在(在 init.sql 中定义)
  139. -- 如果不存在,创建一个
  140. CREATE OR REPLACE FUNCTION update_update_time_column()
  141. RETURNS TRIGGER AS $$
  142. BEGIN
  143. NEW.update_time = CURRENT_TIMESTAMP;
  144. RETURN NEW;
  145. END;
  146. $$ LANGUAGE plpgsql;
  147. DROP TRIGGER IF EXISTS trigger_templates_update_time ON templates;
  148. CREATE TRIGGER trigger_templates_update_time
  149. BEFORE UPDATE ON templates
  150. FOR EACH ROW
  151. EXECUTE FUNCTION update_update_time_column();
  152. DROP TRIGGER IF EXISTS trigger_variables_update_time ON variables;
  153. CREATE TRIGGER trigger_variables_update_time
  154. BEFORE UPDATE ON variables
  155. FOR EACH ROW
  156. EXECUTE FUNCTION update_update_time_column();
  157. -- ============================================
  158. -- 6. 旧版 extract 表(v1.x 兼容)
  159. -- ============================================
  160. -- 以下表将在未来版本中删除,仅保留兼容性
  161. -- extract_projects, extract_source_documents, extract_rules,
  162. -- extract_results, extract_rule_templates
  163. -- 如需要删除旧表,取消以下注释:
  164. -- DROP TABLE IF EXISTS extract_rule_templates CASCADE;
  165. -- DROP TABLE IF EXISTS extract_results CASCADE;
  166. -- DROP TABLE IF EXISTS extract_rules CASCADE;
  167. -- DROP TABLE IF EXISTS extract_source_documents CASCADE;
  168. -- DROP TABLE IF EXISTS extract_projects CASCADE;