init_0211_increment.sql 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682
  1. -- ============================================================
  2. -- 灵越智报 2.0 数据库增量脚本
  3. -- 基于 2026-02-11 会议讨论设计(全新版本)
  4. -- 包含模板系统、动态要素类型、真实数据示例
  5. --
  6. -- 核心概念:
  7. -- - 静态要素:模板中固定不变的文本
  8. -- - 动态要素:需要通过规则计算填充的内容
  9. -- - 占位符:动态要素在模板中的标识符,格式为 {{namespace.field}} 或 {{+tableName}}
  10. -- ============================================================
  11. -- ============================================================
  12. -- 1. 创建模板相关表
  13. -- ============================================================
  14. -- ------------------------------------------------------------
  15. -- 1.1 report_templates - 报告模板表
  16. -- ------------------------------------------------------------
  17. CREATE TABLE IF NOT EXISTS report_templates (
  18. id BIGSERIAL PRIMARY KEY,
  19. -- 模板信息
  20. name VARCHAR(200) NOT NULL,
  21. category VARCHAR(100),
  22. description TEXT,
  23. -- 模板内容
  24. content_html TEXT,
  25. content_json JSONB,
  26. -- 统计
  27. dynamic_element_count INT DEFAULT 0,
  28. table_element_count INT DEFAULT 0,
  29. -- 状态
  30. status VARCHAR(50) DEFAULT 'active',
  31. -- 元数据
  32. created_by BIGINT REFERENCES users(id),
  33. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  34. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  35. );
  36. COMMENT ON TABLE report_templates IS '报告模板表';
  37. COMMENT ON COLUMN report_templates.name IS '模板名称';
  38. COMMENT ON COLUMN report_templates.category IS '模板分类';
  39. COMMENT ON COLUMN report_templates.content_html IS '模板 HTML 内容';
  40. COMMENT ON COLUMN report_templates.dynamic_element_count IS '动态要素数量';
  41. COMMENT ON COLUMN report_templates.table_element_count IS '表格型动态要素数量';
  42. -- ------------------------------------------------------------
  43. -- 1.2 template_dynamic_elements - 模板动态要素定义表
  44. -- 占位符是动态要素在模板中的标识符
  45. -- ------------------------------------------------------------
  46. CREATE TABLE IF NOT EXISTS template_dynamic_elements (
  47. id BIGSERIAL PRIMARY KEY,
  48. template_id BIGINT NOT NULL REFERENCES report_templates(id) ON DELETE CASCADE,
  49. -- 动态要素标识(占位符)
  50. element_key VARCHAR(100) NOT NULL, -- 动态要素的占位符 key,如 basicInfo.projectCode 或 +review_status
  51. element_name VARCHAR(200) NOT NULL, -- 动态要素显示名称
  52. -- 动态要素类型: text/paragraph/table
  53. element_type VARCHAR(50) NOT NULL,
  54. -- 命名空间
  55. namespace VARCHAR(100),
  56. field_name VARCHAR(100),
  57. -- 表格配置
  58. table_columns JSONB,
  59. -- 其他配置
  60. required BOOLEAN DEFAULT false,
  61. default_value TEXT,
  62. description TEXT,
  63. -- 排序
  64. sort_order INT DEFAULT 0,
  65. -- 元数据
  66. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  67. UNIQUE(template_id, element_key)
  68. );
  69. COMMENT ON TABLE template_dynamic_elements IS '模板动态要素定义表';
  70. COMMENT ON COLUMN template_dynamic_elements.element_key IS '动态要素的占位符 key,如 basicInfo.projectCode';
  71. COMMENT ON COLUMN template_dynamic_elements.element_type IS '动态要素类型:text(文本)/paragraph(段落)/table(表格)';
  72. COMMENT ON COLUMN template_dynamic_elements.namespace IS '命名空间';
  73. COMMENT ON COLUMN template_dynamic_elements.table_columns IS '表格列定义 JSON 数组';
  74. -- ============================================================
  75. -- 2. 修改现有表
  76. -- ============================================================
  77. -- reports 表新增字段
  78. ALTER TABLE reports ADD COLUMN IF NOT EXISTS template_id BIGINT REFERENCES report_templates(id);
  79. ALTER TABLE reports ADD COLUMN IF NOT EXISTS source_report_id BIGINT REFERENCES reports(id);
  80. ALTER TABLE reports ADD COLUMN IF NOT EXISTS copy_time TIMESTAMP;
  81. COMMENT ON COLUMN reports.template_id IS '关联的模板 ID';
  82. COMMENT ON COLUMN reports.source_report_id IS '源报告 ID,用于报告复制';
  83. COMMENT ON COLUMN reports.copy_time IS '复制时间';
  84. -- ============================================================
  85. -- 3. 创建动态要素相关表
  86. -- ============================================================
  87. -- ------------------------------------------------------------
  88. -- 3.1 element_values - 动态要素值表
  89. -- ------------------------------------------------------------
  90. CREATE TABLE IF NOT EXISTS element_values (
  91. id BIGSERIAL PRIMARY KEY,
  92. report_id BIGINT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
  93. -- 动态要素标识
  94. element_key VARCHAR(100) NOT NULL, -- 动态要素的占位符 key
  95. -- 值
  96. value_text TEXT,
  97. value_json JSONB,
  98. -- 状态
  99. is_filled BOOLEAN DEFAULT false,
  100. fill_source VARCHAR(50),
  101. -- 元数据
  102. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  103. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  104. UNIQUE(report_id, element_key)
  105. );
  106. COMMENT ON TABLE element_values IS '动态要素值表';
  107. COMMENT ON COLUMN element_values.element_key IS '动态要素的占位符 key';
  108. COMMENT ON COLUMN element_values.value_text IS '文本值(text/paragraph 类型)';
  109. COMMENT ON COLUMN element_values.value_json IS 'JSON 值(table 类型)';
  110. COMMENT ON COLUMN element_values.fill_source IS '填充来源:manual/rule/import';
  111. -- ------------------------------------------------------------
  112. -- 3.2 element_rules - 动态要素规则表
  113. -- ------------------------------------------------------------
  114. CREATE TABLE IF NOT EXISTS element_rules (
  115. id BIGSERIAL PRIMARY KEY,
  116. report_id BIGINT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
  117. -- 动态要素标识
  118. element_key VARCHAR(100) NOT NULL, -- 动态要素的占位符 key
  119. -- 规则信息
  120. rule_name VARCHAR(200),
  121. description TEXT,
  122. rule_type VARCHAR(50) NOT NULL,
  123. -- 执行结果
  124. last_output_text TEXT,
  125. last_output_json JSONB,
  126. last_run_status VARCHAR(50),
  127. last_run_time TIMESTAMP,
  128. last_run_error TEXT,
  129. -- DSL 存储
  130. dsl_content TEXT,
  131. -- 状态
  132. status VARCHAR(50) DEFAULT 'active',
  133. -- 元数据
  134. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  135. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  136. UNIQUE(report_id, element_key)
  137. );
  138. COMMENT ON TABLE element_rules IS '动态要素规则表';
  139. COMMENT ON COLUMN element_rules.element_key IS '动态要素的占位符 key';
  140. COMMENT ON COLUMN element_rules.rule_type IS '规则类型:extraction/generation/calculation/condition';
  141. COMMENT ON COLUMN element_rules.dsl_content IS 'DSL 语法内容';
  142. -- ------------------------------------------------------------
  143. -- 3.3 rule_inputs - 规则输入表
  144. -- ------------------------------------------------------------
  145. CREATE TABLE IF NOT EXISTS rule_inputs (
  146. id BIGSERIAL PRIMARY KEY,
  147. rule_id BIGINT NOT NULL REFERENCES element_rules(id) ON DELETE CASCADE,
  148. -- 输入标识
  149. input_key VARCHAR(50) NOT NULL,
  150. input_name VARCHAR(200) NOT NULL,
  151. -- 输入类型
  152. input_type VARCHAR(50) NOT NULL, -- attachment_ref/entity_ref/element_ref/text/number
  153. -- 引用配置
  154. ref_attachment_id BIGINT,
  155. ref_entity_id BIGINT,
  156. ref_element_key VARCHAR(100), -- 引用其他动态要素的 key
  157. -- 固定值
  158. fixed_value TEXT,
  159. -- 排序
  160. sort_order INT DEFAULT 0,
  161. -- 元数据
  162. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  163. );
  164. COMMENT ON TABLE rule_inputs IS '规则数据输入表';
  165. COMMENT ON COLUMN rule_inputs.input_type IS '输入类型:attachment_ref/entity_ref/element_ref/text/number';
  166. COMMENT ON COLUMN rule_inputs.ref_element_key IS '引用其他动态要素的 key';
  167. -- ------------------------------------------------------------
  168. -- 3.4 rule_action_config - 规则动作配置表
  169. -- ------------------------------------------------------------
  170. CREATE TABLE IF NOT EXISTS rule_action_config (
  171. id BIGSERIAL PRIMARY KEY,
  172. rule_id BIGINT NOT NULL REFERENCES element_rules(id) ON DELETE CASCADE,
  173. -- 动作类型
  174. action_type VARCHAR(50) NOT NULL,
  175. -- 动作配置
  176. config JSONB NOT NULL DEFAULT '{}',
  177. -- 元数据
  178. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  179. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  180. UNIQUE(rule_id)
  181. );
  182. COMMENT ON TABLE rule_action_config IS '规则动作配置表';
  183. COMMENT ON COLUMN rule_action_config.action_type IS '动作类型:extract_entity/extract_pattern/llm_generate/extract_table';
  184. -- ============================================================
  185. -- 4. 创建附件相关表
  186. -- ============================================================
  187. -- ------------------------------------------------------------
  188. -- 4.1 report_attachments - 报告附件表
  189. -- ------------------------------------------------------------
  190. CREATE TABLE IF NOT EXISTS report_attachments (
  191. id BIGSERIAL PRIMARY KEY,
  192. report_id BIGINT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
  193. -- 文件信息
  194. display_name VARCHAR(200) NOT NULL,
  195. file_name VARCHAR(500) NOT NULL,
  196. file_path VARCHAR(1000) NOT NULL,
  197. file_type VARCHAR(50),
  198. file_size BIGINT,
  199. -- 解析状态
  200. parse_status VARCHAR(50) DEFAULT 'pending',
  201. parsed_text TEXT,
  202. entity_count INT DEFAULT 0,
  203. parse_error TEXT,
  204. parsed_at TIMESTAMP,
  205. -- 排序
  206. sort_order INT DEFAULT 0,
  207. -- 元数据
  208. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  209. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  210. );
  211. COMMENT ON TABLE report_attachments IS '报告附件表';
  212. COMMENT ON COLUMN report_attachments.parse_status IS '解析状态:pending/processing/completed/failed';
  213. -- ------------------------------------------------------------
  214. -- 4.2 attachment_entities - 附件实体表
  215. -- ------------------------------------------------------------
  216. CREATE TABLE IF NOT EXISTS attachment_entities (
  217. id BIGSERIAL PRIMARY KEY,
  218. attachment_id BIGINT NOT NULL REFERENCES report_attachments(id) ON DELETE CASCADE,
  219. -- 实体信息
  220. entity_type VARCHAR(50) NOT NULL,
  221. entity_text VARCHAR(500) NOT NULL,
  222. -- 业务标签
  223. business_label VARCHAR(200),
  224. -- 置信度和出现次数
  225. confidence DECIMAL(5,4) DEFAULT 1.0,
  226. occurrence_count INT DEFAULT 1,
  227. -- 元数据
  228. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  229. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  230. );
  231. COMMENT ON TABLE attachment_entities IS '附件实体表';
  232. COMMENT ON COLUMN attachment_entities.entity_type IS '实体类型:ORG/PERSON/DATE/LOCATION/NUMBER';
  233. COMMENT ON COLUMN attachment_entities.business_label IS '业务标签';
  234. -- ------------------------------------------------------------
  235. -- 4.3 report_copy_records - 报告复制记录表
  236. -- ------------------------------------------------------------
  237. CREATE TABLE IF NOT EXISTS report_copy_records (
  238. id BIGSERIAL PRIMARY KEY,
  239. source_report_id BIGINT NOT NULL REFERENCES reports(id),
  240. target_report_id BIGINT NOT NULL REFERENCES reports(id),
  241. -- 复制信息
  242. copied_by BIGINT REFERENCES users(id),
  243. copy_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  244. -- 复制内容统计
  245. elements_copied INT DEFAULT 0,
  246. rules_copied INT DEFAULT 0,
  247. -- 备注
  248. notes TEXT
  249. );
  250. COMMENT ON TABLE report_copy_records IS '报告复制记录表';
  251. -- ============================================================
  252. -- 5. 创建视图
  253. -- ============================================================
  254. -- ------------------------------------------------------------
  255. -- 5.1 v_report_dynamic_elements - 报告动态要素完整视图
  256. -- ------------------------------------------------------------
  257. CREATE OR REPLACE VIEW v_report_dynamic_elements AS
  258. SELECT
  259. r.id AS report_id,
  260. r.title AS report_title,
  261. te.element_key,
  262. te.element_name,
  263. te.element_type,
  264. te.namespace,
  265. te.field_name,
  266. te.table_columns,
  267. te.required,
  268. ev.value_text,
  269. ev.value_json,
  270. ev.is_filled,
  271. ev.fill_source,
  272. er.id AS rule_id,
  273. er.rule_type,
  274. er.last_run_status,
  275. er.last_run_time,
  276. CASE WHEN er.id IS NOT NULL THEN true ELSE false END AS has_rule
  277. FROM reports r
  278. JOIN report_templates rt ON rt.id = r.template_id
  279. JOIN template_dynamic_elements te ON te.template_id = rt.id
  280. LEFT JOIN element_values ev ON ev.report_id = r.id AND ev.element_key = te.element_key
  281. LEFT JOIN element_rules er ON er.report_id = r.id AND er.element_key = te.element_key;
  282. COMMENT ON VIEW v_report_dynamic_elements IS '报告动态要素完整视图';
  283. -- ------------------------------------------------------------
  284. -- 5.2 v_rule_full_config - 规则完整配置视图
  285. -- ------------------------------------------------------------
  286. CREATE OR REPLACE VIEW v_rule_full_config AS
  287. SELECT
  288. er.id AS rule_id,
  289. er.report_id,
  290. er.element_key,
  291. er.rule_name,
  292. er.rule_type,
  293. er.last_output_text,
  294. er.last_output_json,
  295. er.last_run_status,
  296. er.dsl_content,
  297. er.status,
  298. ac.action_type,
  299. ac.config AS action_config,
  300. (
  301. SELECT json_agg(json_build_object(
  302. 'inputKey', ri.input_key,
  303. 'inputName', ri.input_name,
  304. 'inputType', ri.input_type,
  305. 'refAttachmentId', ri.ref_attachment_id,
  306. 'refEntityId', ri.ref_entity_id,
  307. 'refElementKey', ri.ref_element_key,
  308. 'fixedValue', ri.fixed_value
  309. ) ORDER BY ri.sort_order)
  310. FROM rule_inputs ri
  311. WHERE ri.rule_id = er.id
  312. ) AS inputs
  313. FROM element_rules er
  314. LEFT JOIN rule_action_config ac ON ac.rule_id = er.id;
  315. COMMENT ON VIEW v_rule_full_config IS '规则完整配置视图';
  316. -- ============================================================
  317. -- 6. 创建索引
  318. -- ============================================================
  319. -- report_templates 索引
  320. CREATE INDEX IF NOT EXISTS idx_templates_category ON report_templates(category);
  321. CREATE INDEX IF NOT EXISTS idx_templates_status ON report_templates(status);
  322. -- template_dynamic_elements 索引
  323. CREATE INDEX IF NOT EXISTS idx_template_elements_template ON template_dynamic_elements(template_id);
  324. CREATE INDEX IF NOT EXISTS idx_template_elements_type ON template_dynamic_elements(element_type);
  325. CREATE INDEX IF NOT EXISTS idx_template_elements_namespace ON template_dynamic_elements(namespace);
  326. -- element_values 索引
  327. CREATE INDEX IF NOT EXISTS idx_element_values_report ON element_values(report_id);
  328. CREATE INDEX IF NOT EXISTS idx_element_values_key ON element_values(element_key);
  329. CREATE INDEX IF NOT EXISTS idx_element_values_filled ON element_values(is_filled);
  330. -- element_rules 索引
  331. CREATE INDEX IF NOT EXISTS idx_element_rules_report ON element_rules(report_id);
  332. CREATE INDEX IF NOT EXISTS idx_element_rules_key ON element_rules(element_key);
  333. CREATE INDEX IF NOT EXISTS idx_element_rules_status ON element_rules(status);
  334. -- rule_inputs 索引
  335. CREATE INDEX IF NOT EXISTS idx_rule_inputs_rule ON rule_inputs(rule_id);
  336. -- report_attachments 索引
  337. CREATE INDEX IF NOT EXISTS idx_attachments_report ON report_attachments(report_id);
  338. CREATE INDEX IF NOT EXISTS idx_attachments_parse_status ON report_attachments(parse_status);
  339. -- attachment_entities 索引
  340. CREATE INDEX IF NOT EXISTS idx_attachment_entities_attachment ON attachment_entities(attachment_id);
  341. CREATE INDEX IF NOT EXISTS idx_attachment_entities_type ON attachment_entities(entity_type);
  342. CREATE INDEX IF NOT EXISTS idx_attachment_entities_label ON attachment_entities(business_label);
  343. -- report_copy_records 索引
  344. CREATE INDEX IF NOT EXISTS idx_copy_records_source ON report_copy_records(source_report_id);
  345. CREATE INDEX IF NOT EXISTS idx_copy_records_target ON report_copy_records(target_report_id);
  346. -- ============================================================
  347. -- 7. Mock 数据
  348. -- ============================================================
  349. -- ------------------------------------------------------------
  350. -- 7.1 模板数据
  351. -- ------------------------------------------------------------
  352. INSERT INTO report_templates (id, name, category, description, dynamic_element_count, table_element_count, status, created_at)
  353. VALUES (1, '电力安全生产标准化复审报告', '安全评审', '电力建设企业安全生产标准化达标评级评审报告模板', 45, 4, 'active', '2026-01-15 10:00:00')
  354. ON CONFLICT (id) DO NOTHING;
  355. SELECT setval('report_templates_id_seq', GREATEST((SELECT MAX(id) FROM report_templates), 1));
  356. -- ------------------------------------------------------------
  357. -- 7.2 模板动态要素数据
  358. -- ------------------------------------------------------------
  359. -- 文本型动态要素
  360. INSERT INTO template_dynamic_elements (id, template_id, element_key, element_name, element_type, namespace, field_name, required, sort_order)
  361. VALUES
  362. (1, 1, 'basicInfo.projectCode', '项目编号', 'text', 'basicInfo', 'projectCode', true, 1),
  363. (2, 1, 'project.reviewObject', '评审对象', 'text', 'project', 'reviewObject', true, 2),
  364. (3, 1, 'project.reviewObjectAlias', '评审对象简称', 'text', 'project', 'reviewObjectAlias', true, 3),
  365. (4, 1, 'basicInfo.requestLevel', '申请级别', 'text', 'basicInfo', 'requestLevel', true, 4),
  366. (5, 1, 'project.resultScore', '评审得分', 'text', 'project', 'resultScore', true, 5),
  367. (6, 1, 'project.resultLevel', '评审级别', 'text', 'project', 'resultLevel', true, 6),
  368. (7, 1, 'project.workStartAt', '评审开始日期', 'text', 'project', 'workStartAt', true, 7),
  369. (8, 1, 'project.workEndAt', '评审结束日期', 'text', 'project', 'workEndAt', true, 8),
  370. (9, 1, 'project.createdAt', '报告日期', 'text', 'project', 'createdAt', true, 9),
  371. (10, 1, 'basicInfo.applyAt', '申请日期', 'text', 'basicInfo', 'applyAt', false, 10),
  372. (11, 1, 'project.reviewPeriod', '评审期', 'text', 'project', 'reviewPeriod', false, 11),
  373. (12, 1, 'basicInfo.reviewObjectCertificateGetAt', '证书获取日期', 'text', 'basicInfo', 'reviewObjectCertificateGetAt', false, 12),
  374. (13, 1, 'basicInfo.reviewObjectCertificate2GetAt', '二次证书获取日期', 'text', 'basicInfo', 'reviewObjectCertificate2GetAt', false, 13)
  375. ON CONFLICT (template_id, element_key) DO NOTHING;
  376. -- 段落型动态要素
  377. INSERT INTO template_dynamic_elements (id, template_id, element_key, element_name, element_type, namespace, field_name, required, sort_order)
  378. VALUES
  379. (20, 1, 'project.reviewObjectSummary', '评审对象概述', 'paragraph', 'project', 'reviewObjectSummary', true, 20),
  380. (21, 1, 'project.reviewObjectDescription', '企业简介', 'paragraph', 'project', 'reviewObjectDescription', true, 21),
  381. (22, 1, 'project.target', '目标', 'paragraph', 'project', 'target', true, 22),
  382. (23, 1, 'project.duty', '组织机构和职责', 'paragraph', 'project', 'duty', true, 23),
  383. (24, 1, 'project.fullParticipation', '全员参与', 'paragraph', 'project', 'fullParticipation', false, 24),
  384. (25, 1, 'project.safetyInvestment', '安全生产投入', 'paragraph', 'project', 'safetyInvestment', false, 25),
  385. (26, 1, 'project.safetyCulture', '安全文化建设', 'paragraph', 'project', 'safetyCulture', false, 26),
  386. (27, 1, 'project.systematicManagement', '制度化管理', 'paragraph', 'project', 'systematicManagement', false, 27),
  387. (28, 1, 'project.employeeTraining', '人员教育培训', 'paragraph', 'project', 'employeeTraining', false, 28),
  388. (29, 1, 'project.assetManagement', '设备设施管理', 'paragraph', 'project', 'assetManagement', false, 29),
  389. (30, 1, 'project.jobSafety', '作业安全', 'paragraph', 'project', 'jobSafety', false, 30),
  390. (31, 1, 'project.safetyStandardizationStatus', '安全生产标准化建设和持续运行情况', 'paragraph', 'project', 'safetyStandardizationStatus', false, 31)
  391. ON CONFLICT (template_id, element_key) DO NOTHING;
  392. -- 表格型动态要素
  393. INSERT INTO template_dynamic_elements (id, template_id, element_key, element_name, element_type, namespace, field_name, required, table_columns, sort_order)
  394. VALUES
  395. (40, 1, '+review_status', '现场复审情况表', 'table', NULL, 'review_status', true, '["序号", "项目", "存在的问题", "扣分标准"]', 40),
  396. (41, 1, '+target_responsibility', '目标职责评审表', 'table', NULL, 'target_responsibility', true, '["序号", "项目", "存在的问题", "扣分标准"]', 41),
  397. (42, 1, '+institutionalized_management', '制度化管理评审表', 'table', NULL, 'institutionalized_management', true, '["序号", "项目", "存在的问题", "扣分标准"]', 42),
  398. (43, 1, '+education_and_training', '教育培训评审表', 'table', NULL, 'education_and_training', true, '["序号", "项目", "存在的问题", "扣分标准"]', 43)
  399. ON CONFLICT (template_id, element_key) DO NOTHING;
  400. SELECT setval('template_dynamic_elements_id_seq', GREATEST((SELECT MAX(id) FROM template_dynamic_elements), 43));
  401. -- ------------------------------------------------------------
  402. -- 7.3 报告数据
  403. -- ------------------------------------------------------------
  404. -- 成都院复审报告(原始报告)
  405. INSERT INTO reports (id, title, report_type, status, template_id, project_id, created_by, created_at)
  406. VALUES (1001, '成都院复审报告', '电力安全生产标准化复审报告', 'draft', 1, 1, 1, '2026-02-10 10:30:00')
  407. ON CONFLICT (id) DO NOTHING;
  408. -- 华东院复审报告(从成都院复制)
  409. INSERT INTO reports (id, title, report_type, status, template_id, project_id, created_by, source_report_id, copy_time, created_at)
  410. VALUES (1002, '华东院复审报告', '电力安全生产标准化复审报告', 'draft', 1, 1, 1, 1001, '2026-02-11 14:00:00', '2026-02-11 14:00:00')
  411. ON CONFLICT (id) DO NOTHING;
  412. SELECT setval('reports_id_seq', GREATEST((SELECT MAX(id) FROM reports), 1002));
  413. -- ------------------------------------------------------------
  414. -- 7.4 附件数据
  415. -- ------------------------------------------------------------
  416. INSERT INTO report_attachments (id, report_id, display_name, file_name, file_path, file_type, file_size, parse_status, entity_count, parsed_at, sort_order)
  417. VALUES
  418. (1, 1001, '01-复审通知', '复审通知.docx', '/uploads/2026/02/复审通知.docx', 'docx', 102400, 'completed', 15, '2026-02-10 10:35:00', 1),
  419. (2, 1001, '02-评审报告原文', '评审报告.pdf', '/uploads/2026/02/评审报告.pdf', 'pdf', 512000, 'completed', 25, '2026-02-10 10:40:00', 2),
  420. (3, 1001, '03-安全标准化达标证书', '达标证书.pdf', '/uploads/2026/02/达标证书.pdf', 'pdf', 256000, 'completed', 8, '2026-02-10 10:45:00', 3)
  421. ON CONFLICT (id) DO NOTHING;
  422. SELECT setval('report_attachments_id_seq', GREATEST((SELECT MAX(id) FROM report_attachments), 3));
  423. -- ------------------------------------------------------------
  424. -- 7.5 附件实体数据
  425. -- ------------------------------------------------------------
  426. INSERT INTO attachment_entities (id, attachment_id, entity_type, entity_text, business_label, confidence, occurrence_count)
  427. VALUES
  428. -- 复审通知中的实体
  429. (1, 1, 'ORG', '中国电建集团成都勘测设计研究院有限公司', '评审对象', 0.95, 15),
  430. (2, 1, 'ORG', '湖北安源安全环保科技有限公司', '评审单位', 0.92, 8),
  431. (3, 1, 'PERSON', '何彦锋', '董事长', 0.88, 3),
  432. (4, 1, 'PERSON', '张世殊', '总经理', 0.88, 2),
  433. (5, 1, 'DATE', '2024年7月13日', '评审开始日期', 0.99, 2),
  434. (6, 1, 'DATE', '2024年10月17日', '评审结束日期', 0.99, 2),
  435. (7, 1, 'DATE', '2024年7月8日', '申请日期', 0.99, 1),
  436. (8, 1, 'DATE', '2019年12月9日', '证书获取日期', 0.99, 1),
  437. (9, 1, 'DATE', '2015年4月7日', '二次证书获取日期', 0.99, 1),
  438. -- 评审报告中的实体
  439. (10, 2, 'NUMBER', '93.33', '评审得分', 0.99, 3),
  440. (11, 2, 'NUMBER', '50', '注册资本(亿)', 0.95, 2),
  441. (12, 2, 'NUMBER', '2887', '员工人数', 0.95, 1),
  442. (13, 2, 'LOCATION', '成都市温江区政和街8号', '公司地址', 0.90, 1),
  443. -- 达标证书中的实体
  444. (14, 3, 'ORG', '中国电建集团成都勘测设计研究院有限公司', NULL, 0.95, 2),
  445. (15, 3, 'DATE', '2019年12月9日', '发证日期', 0.99, 1)
  446. ON CONFLICT (id) DO NOTHING;
  447. SELECT setval('attachment_entities_id_seq', GREATEST((SELECT MAX(id) FROM attachment_entities), 15));
  448. -- ------------------------------------------------------------
  449. -- 7.6 动态要素值数据(成都院)
  450. -- ------------------------------------------------------------
  451. -- 文本型动态要素值
  452. INSERT INTO element_values (id, report_id, element_key, value_text, is_filled, fill_source)
  453. VALUES
  454. (1, 1001, 'basicInfo.projectCode', 'BZ-0092-2024', true, 'rule'),
  455. (2, 1001, 'project.reviewObject', '中国电建集团成都勘测设计研究院有限公司', true, 'rule'),
  456. (3, 1001, 'project.reviewObjectAlias', '成都院', true, 'rule'),
  457. (4, 1001, 'basicInfo.requestLevel', '一级', true, 'rule'),
  458. (5, 1001, 'project.resultScore', '93.33', true, 'rule'),
  459. (6, 1001, 'project.resultLevel', '一级', true, 'rule'),
  460. (7, 1001, 'project.workStartAt', '2024年7月13日', true, 'rule'),
  461. (8, 1001, 'project.workEndAt', '2024年10月17日', true, 'rule'),
  462. (9, 1001, 'project.createdAt', '2026年02月', true, 'manual'),
  463. (10, 1001, 'basicInfo.applyAt', '2024年7月8日', true, 'rule'),
  464. (11, 1001, 'project.reviewPeriod', '2023年7月8日-2024年7月8日', true, 'rule'),
  465. (12, 1001, 'basicInfo.reviewObjectCertificateGetAt', '2019年12月9日', true, 'rule'),
  466. (13, 1001, 'basicInfo.reviewObjectCertificate2GetAt', '2015年4月7日', true, 'rule')
  467. ON CONFLICT (report_id, element_key) DO NOTHING;
  468. -- 段落型动态要素值
  469. INSERT INTO element_values (id, report_id, element_key, value_text, is_filled, fill_source)
  470. VALUES
  471. (20, 1001, 'project.reviewObjectSummary', '中国电建集团成都勘测设计研究院有限公司(简称:成都院)成立于2005年,是世界500强企业中国电力建设集团的核心成员企业。作为国家级高新技术企业,成都院以水利水电、新能源和基础设施为核心业务,在水电工程领域承担了金沙江、大渡河、雅砻江等重大河流的规划勘测设计工作,创造了多项"中国第一"和"世界之最"。成都院拥有注册资本50亿元人民币,专业技术人员规模近3000人,累计获得4443项专利和100项行业资质认证,展现了雄厚的技术研发实力。近年来,成都院积极拓展风电、光伏、抽水蓄能等清洁能源业务,并在交通、市政、环境工程等领域取得突破性进展。依托"投资-设计-建造-运营"全产业链服务能力,成都院业务遍及全球40多个国家和地区,成为推动能源革命和基础设施建设的重要力量。', true, 'rule'),
  472. (21, 1001, 'project.reviewObjectDescription', '中国电建集团成都勘测设计研究院有限公司(简称:成都院)是中国电力建设集团核心成员企业,作为国内领先的清洁能源工程服务商,成都院在水利水电、新能源及基础设施领域具有突出优势。成都院深度参与了国家西部大开发和"西电东送"战略,承担了包括两河口水电站、杨房沟水电站、乌东德水电站等重大工程的勘测设计工作,其中两河口水电站拥有世界最高土石坝的纪录。近年来,成都院积极拓展新能源业务,承担了多个大型风电、光伏发电基地的规划设计和EPC总承包项目,并在抽水蓄能领域形成了全产业链服务能力。凭借卓越的技术实力,成都院先后获得"全国文明单位"、"国家科技进步奖"、"全国优秀勘察设计企业"等多项荣誉,其技术团队多次参与国家和行业标准编制工作。', true, 'rule'),
  473. (22, 1001, 'project.target', '成都院制定并发布《QHSE"十四五"规划》(安质〔2023〕1号),明确了总体安全生产目标,包括7项安全管理及事故控制目标,总体目标为公司"十四五"规划的子规划,安全生产与职业健康工作目标纳入总体生产经营目标。成都院发布《关于印发<成都院2024年安全生产与职业健康、能源节约与生态环境保护工作目标和重点>的通知》(蓉设安质〔2024〕18号),明确了2024年安全生产与职业健康目标,包括9项安全管理目标和10项事故控制目标。', true, 'rule')
  474. ON CONFLICT (report_id, element_key) DO NOTHING;
  475. -- 表格型动态要素值
  476. INSERT INTO element_values (id, report_id, element_key, value_json, is_filled, fill_source)
  477. VALUES
  478. (40, 1001, '+target_responsibility', '[
  479. {"序号": 1, "项目": "5.1.1.1\n目标制定", "存在的问题": "大邑地勘项目部制定的2024年度安全生产目标,缺少设备设施方面的事故控制目标。", "扣分标准": "依据评估标准②:目标内容有缺失,扣1分/项,共扣1分。"},
  480. {"序号": 2, "项目": "5.1.1.2\n目标落实", "存在的问题": "双江口设计项目部项目经理与各专业部门负责人签订的《2024年度安全责任书》中,目标分解分解不明确,不满足要求。", "扣分标准": "依据评估标准②:签订责任书、目标分解不满足要求,扣1分/单位,共扣1分。"},
  481. {"序号": 3, "项目": "5.1.1.3\n目标考核", "存在的问题": "云阳监理项目未对二季度安全生产目标及工作计划完成情况进行考核、监督检查。", "扣分标准": "依据评估标准①:未对目标的完成情况进行评估和考核,扣2分/次,共扣2分。"},
  482. {"序号": 4, "项目": "5.1.2.1\n机构设置", "存在的问题": "漳州总包项目部安委会组成不符合规定,未包含分包单位负责人。", "扣分标准": "依据评分标准①:安委会组成不符合规定或未及时调整,扣2分/次,共扣2分。"},
  483. {"序号": 5, "项目": "5.1.2.2\n主要负责人及管理层职责", "存在的问题": "双江口设计项目部9月召开的安全生产例会中,未针对成都院隐患大排查、设计分公司安全风险隐患专项整治工作等要求,部署安排隐患排查相关工作。", "扣分标准": "依据评估标准④:会议未分析安全生产存在的问题,未针对问题制定改进措施,扣1分/项,共扣1分。"}
  484. ]', true, 'rule'),
  485. (41, 1001, '+institutionalized_management', '[
  486. {"序号": 1, "项目": "5.2.2\n规章制度", "存在的问题": "勘测设计分公司未按成都院《安全风险管控管理办法》的要求制定安全风险管控制度。", "扣分标准": "依据评估标准①:制度不全,扣2分/项,共扣2分"},
  487. {"序号": 2, "项目": "5.2.3\n操作规程", "存在的问题": "云阳监理项目1#引水洞汽车吊和下库进出水口挖掘机未张贴安全操作规程。", "扣分标准": "依据评估标准③:设备未悬挂安全操作规程,扣1分/处,共扣2分。"}
  488. ]', true, 'rule'),
  489. (42, 1001, '+education_and_training', '[
  490. {"序号": 1, "项目": "5.3.1\n教育培训管理", "存在的问题": "大邑地勘项目部《2024年安全生产教育和培训计划》中,缺少有限空间作业等专项培训内容。", "扣分标准": "依据评估标准③:培训计划未包含职业健康、应急管理及上级要求的培训等内容,内容不全,扣2分。"}
  491. ]', true, 'rule')
  492. ON CONFLICT (report_id, element_key) DO NOTHING;
  493. SELECT setval('element_values_id_seq', GREATEST((SELECT MAX(id) FROM element_values), 42));
  494. -- ------------------------------------------------------------
  495. -- 7.7 动态要素规则数据(成都院)
  496. -- ------------------------------------------------------------
  497. INSERT INTO element_rules (id, report_id, element_key, rule_name, description, rule_type, last_output_text, last_run_status, last_run_time, status)
  498. VALUES
  499. (1, 1001, 'basicInfo.projectCode', '项目编号提取', '从复审通知中提取项目编号', 'extraction', 'BZ-0092-2024', 'success', '2026-02-11 14:00:00', 'active'),
  500. (2, 1001, 'project.reviewObject', '评审对象提取', '从复审通知中提取评审对象', 'extraction', '中国电建集团成都勘测设计研究院有限公司', 'success', '2026-02-11 14:01:00', 'active'),
  501. (3, 1001, 'project.reviewObjectAlias', '评审对象简称提取', '从复审通知中提取评审对象简称', 'extraction', '成都院', 'success', '2026-02-11 14:02:00', 'active'),
  502. (4, 1001, 'project.resultScore', '评审得分提取', '从评审报告中提取评审得分', 'extraction', '93.33', 'success', '2026-02-11 14:03:00', 'active'),
  503. (5, 1001, 'project.workStartAt', '评审开始日期提取', '从复审通知中提取评审开始日期', 'extraction', '2024年7月13日', 'success', '2026-02-11 14:04:00', 'active'),
  504. (6, 1001, 'project.workEndAt', '评审结束日期提取', '从复审通知中提取评审结束日期', 'extraction', '2024年10月17日', 'success', '2026-02-11 14:05:00', 'active'),
  505. (7, 1001, 'project.reviewObjectSummary', '评审对象概述生成', '基于企业简介生成评审对象概述', 'generation', NULL, 'success', '2026-02-11 14:06:00', 'active'),
  506. (8, 1001, 'project.reviewObjectDescription', '企业简介生成', '基于附件内容生成企业简介', 'generation', NULL, 'success', '2026-02-11 14:07:00', 'active'),
  507. (9, 1001, 'project.target', '目标内容生成', '基于附件内容生成目标描述', 'generation', NULL, 'success', '2026-02-11 14:08:00', 'active'),
  508. (10, 1001, '+target_responsibility', '目标职责评审表提取', '从评审报告中提取目标职责评审表', 'extraction', NULL, 'success', '2026-02-11 14:09:00', 'active')
  509. ON CONFLICT (report_id, element_key) DO NOTHING;
  510. SELECT setval('element_rules_id_seq', GREATEST((SELECT MAX(id) FROM element_rules), 10));
  511. -- ------------------------------------------------------------
  512. -- 7.8 规则输入数据
  513. -- ------------------------------------------------------------
  514. INSERT INTO rule_inputs (id, rule_id, input_key, input_name, input_type, ref_attachment_id, ref_entity_id, fixed_value, sort_order)
  515. VALUES
  516. -- 规则1(项目编号提取)的输入
  517. (1, 1, 'input1', '复审通知', 'attachment_ref', 1, NULL, NULL, 1),
  518. -- 规则2(评审对象提取)的输入
  519. (2, 2, 'input1', '复审通知', 'attachment_ref', 1, NULL, NULL, 1),
  520. -- 规则3(评审对象简称提取)的输入
  521. (3, 3, 'input1', '评审对象', 'entity_ref', NULL, 1, NULL, 1),
  522. -- 规则4(评审得分提取)的输入
  523. (4, 4, 'input1', '评审报告', 'attachment_ref', 2, NULL, NULL, 1),
  524. -- 规则5(评审开始日期提取)的输入
  525. (5, 5, 'input1', '复审通知', 'attachment_ref', 1, NULL, NULL, 1),
  526. -- 规则6(评审结束日期提取)的输入
  527. (6, 6, 'input1', '复审通知', 'attachment_ref', 1, NULL, NULL, 1),
  528. -- 规则7(评审对象概述生成)的输入
  529. (7, 7, 'input1', '评审报告', 'attachment_ref', 2, NULL, NULL, 1),
  530. (8, 7, 'prompt', '提示词', 'text', NULL, NULL, '请根据以下企业信息,生成一段简洁的企业概述,突出企业的核心业务和优势。', 2),
  531. -- 规则8(企业简介生成)的输入
  532. (9, 8, 'input1', '评审报告', 'attachment_ref', 2, NULL, NULL, 1),
  533. (10, 8, 'prompt', '提示词', 'text', NULL, NULL, '请根据以下内容,生成详细的企业简介,包括企业历史、主营业务、技术实力等。', 2),
  534. -- 规则9(目标内容生成)的输入
  535. (11, 9, 'input1', '评审报告', 'attachment_ref', 2, NULL, NULL, 1),
  536. (12, 9, 'prompt', '提示词', 'text', NULL, NULL, '请根据以下内容,提取并整理企业的安全生产目标相关内容。', 2),
  537. -- 规则10(目标职责评审表提取)的输入
  538. (13, 10, 'input1', '评审报告', 'attachment_ref', 2, NULL, NULL, 1)
  539. ON CONFLICT (id) DO NOTHING;
  540. SELECT setval('rule_inputs_id_seq', GREATEST((SELECT MAX(id) FROM rule_inputs), 13));
  541. -- ------------------------------------------------------------
  542. -- 7.9 规则动作配置数据
  543. -- ------------------------------------------------------------
  544. INSERT INTO rule_action_config (id, rule_id, action_type, config)
  545. VALUES
  546. (1, 1, 'extract_pattern', '{"pattern": "项目编号[::]\\s*(\\S+)", "group": 1}'),
  547. (2, 2, 'extract_entity', '{"entityType": "ORG", "businessLabel": "评审对象", "selectStrategy": "first"}'),
  548. (3, 3, 'extract_pattern', '{"pattern": "(简称[::](.+?))", "group": 1}'),
  549. (4, 4, 'extract_entity', '{"entityType": "NUMBER", "businessLabel": "评审得分", "selectStrategy": "first"}'),
  550. (5, 5, 'extract_entity', '{"entityType": "DATE", "businessLabel": "评审开始日期", "selectStrategy": "first"}'),
  551. (6, 6, 'extract_entity', '{"entityType": "DATE", "businessLabel": "评审结束日期", "selectStrategy": "first"}'),
  552. (7, 7, 'llm_generate', '{"model": "qwen-max", "temperature": 0.7, "maxTokens": 1000}'),
  553. (8, 8, 'llm_generate', '{"model": "qwen-max", "temperature": 0.7, "maxTokens": 2000}'),
  554. (9, 9, 'llm_generate', '{"model": "qwen-max", "temperature": 0.7, "maxTokens": 2000}'),
  555. (10, 10, 'extract_table', '{"tablePattern": "序号.*项目.*问题", "columns": ["序号", "项目", "存在的问题", "扣分标准"]}')
  556. ON CONFLICT (rule_id) DO NOTHING;
  557. SELECT setval('rule_action_config_id_seq', GREATEST((SELECT MAX(id) FROM rule_action_config), 10));
  558. -- ------------------------------------------------------------
  559. -- 7.10 报告复制记录
  560. -- ------------------------------------------------------------
  561. INSERT INTO report_copy_records (id, source_report_id, target_report_id, copied_by, copy_time, elements_copied, rules_copied, notes)
  562. VALUES (1, 1001, 1002, 1, '2026-02-11 14:00:00', 45, 10, '从成都院复制到华东院')
  563. ON CONFLICT (id) DO NOTHING;
  564. SELECT setval('report_copy_records_id_seq', GREATEST((SELECT MAX(id) FROM report_copy_records), 1));
  565. -- ============================================================
  566. -- 完成
  567. -- ============================================================
  568. SELECT '灵越智报 2.0 数据库增量脚本执行完成(含模板系统和真实数据)' AS result;