فهرست منبع

chore: 清理旧的数据库初始化脚本,只保留 ayt_backup_20260302.sql

何文松 2 روز پیش
والد
کامیت
a1dd2e452e

+ 0 - 155
database/CLEANUP_SUMMARY.md

@@ -1,155 +0,0 @@
-# 数据库表结构清理总结
-
-## 执行时间
-2026-02-12 16:26
-
-## 清理目标
-统一使用新表结构,移除旧的 `sys_*` 表逻辑,避免表结构冗余和混乱。
-
-## 已删除的旧表
-
-### 用户和权限相关
-- ✅ `sys_users` - 旧用户表(已迁移到 `users`)
-- ✅ `sys_sessions` - 旧会话表(已迁移到 `sessions`)
-- ✅ `sys_roles` - 角色表
-- ✅ `sys_permissions` - 权限表
-- ✅ `sys_user_roles` - 用户角色关联表
-- ✅ `sys_role_permissions` - 角色权限关联表
-
-### 日志和配置相关
-- ✅ `sys_login_logs` - 登录日志表
-- ✅ `sys_operation_logs` - 操作日志表
-- ✅ `sys_configs` - 系统配置表
-- ✅ `sys_dict_types` - 字典类型表
-- ✅ `sys_dict_items` - 字典项表
-- ✅ `sys_files` - 文件表
-- ✅ `sys_tasks` - 任务表
-
-## 保留的新表结构
-
-### 核心业务表
-- ✅ `users` - 用户表(统一使用)
-- ✅ `sessions` - 会话表(统一使用)
-- ✅ `documents` - 文档表
-- ✅ `templates` - 模板表
-- ✅ `nodes` - 图谱节点表
-- ✅ `edges` - 图谱边表
-- ✅ `rules` - 规则表
-- ✅ `embeddings` - 向量嵌入表(支持 pgvector)
-
-## 管理员账号初始化
-
-已在 `users` 表中初始化管理员账号:
-
-```sql
-INSERT INTO users (
-    id: '1',
-    username: 'admin',
-    email: 'admin@lingyue.com',
-    password_hash: '$2a$10$0AUCG2mG7a6JXErOTI.Pg.Q/R04plOXvc.TDMeWzwwZQ23ZmrtJxC',
-    display_name: '管理员',
-    role: 'admin',
-    is_active: true
-)
-```
-
-**登录信息**:
-- 用户名: `admin`
-- 密码: `admin123`
-
-## 文件变更
-
-### 1. init_mock.sql
-- **变更前**: 1932 行(包含所有 sys_* 表定义和数据)
-- **变更后**: 588 行(仅包含核心业务表)
-- **移除内容**:
-  - 所有 `CREATE TABLE sys_*` 定义(13 个表)
-  - 所有 `INSERT INTO sys_*` 数据
-  - 旧的权限和角色初始化逻辑
-- **新增内容**:
-  - 管理员账号初始化(使用正确的 bcrypt 密码哈希)
-
-### 2. 清理脚本
-创建了 `database/migrations/001_cleanup_old_tables.sql` 用于清理现有数据库。
-
-## 数据库验证
-
-执行清理后的验证结果:
-
-```sql
--- 检查剩余的 sys_* 表
-SELECT tablename FROM pg_tables 
-WHERE schemaname = 'public' AND tablename LIKE 'sys_%';
--- 结果: 0 行(所有 sys_* 表已删除)
-
--- 检查用户表数据
-SELECT id, username, email, display_name, role, is_active FROM users;
--- 结果: 1 行(管理员账号已正确初始化)
-```
-
-## 影响范围
-
-### 后端服务
-- ✅ **AuthService**: 已使用 `users` 表,无需修改
-- ✅ **DocumentService**: 使用 `documents` 表,无影响
-- ✅ **ExtractService**: 使用 `templates`, `rules` 等表,无影响
-- ✅ **GraphService**: 使用 `nodes`, `edges` 等表,无影响
-
-### 前端
-- ✅ 前端 API 调用不受影响(使用 `/auth/login` 等接口)
-- ✅ 登录功能正常工作
-
-## 后续建议
-
-### 1. 权限管理系统(可选)
-如果需要完整的权限管理功能,建议:
-- 在 `users` 表中使用 `role` 字段(简单权限)
-- 或者重新设计轻量级的权限表结构
-
-### 2. 日志系统(可选)
-如果需要操作日志功能,建议:
-- 创建简单的 `audit_logs` 表
-- 记录关键操作的审计信息
-
-### 3. 系统配置(可选)
-如果需要动态配置功能,建议:
-- 创建简单的 `settings` 表
-- 或使用配置文件管理
-
-## 重新初始化数据库
-
-如果需要重新初始化数据库,执行:
-
-```bash
-# 删除并重建数据库
-psql -U postgres -c "DROP DATABASE IF EXISTS lingyue_zhibao;"
-psql -U postgres -c "CREATE DATABASE lingyue_zhibao;"
-
-# 执行新的初始化脚本
-psql -U postgres -d lingyue_zhibao -f 0211docs/init_mock.sql
-```
-
-## 验证清理结果
-
-```bash
-# 1. 检查表结构
-psql -U postgres -d lingyue_zhibao -c "\dt"
-
-# 2. 验证管理员账号
-psql -U postgres -d lingyue_zhibao -c "SELECT * FROM users WHERE username='admin';"
-
-# 3. 测试登录
-curl -X POST http://localhost:18520/auth/login \
-  -H "Content-Type: application/json" \
-  -d '{"usernameOrEmail":"admin","password":"admin123"}'
-```
-
-## 清理完成 ✅
-
-- ✅ 所有旧的 `sys_*` 表已删除
-- ✅ 数据库表结构已统一
-- ✅ 管理员账号已正确初始化
-- ✅ 登录功能正常工作
-- ✅ 所有后端服务正常运行
-
-**数据库现在使用统一的新表结构,代码更清晰,维护更简单!**

+ 0 - 277
database/REFACTORING_SUMMARY.md

@@ -1,277 +0,0 @@
-# 代码重构与接口适配总结
-
-## 执行时间
-2026-02-12 16:35 - 16:43
-
-## 重构目标
-统一使用新表结构,移除旧的 `sys_*` 表逻辑,修复接口适配问题,确保所有服务正常运行。
-
----
-
-## 1. 数据库表结构统一
-
-### 1.1 删除旧表
-已删除所有 `sys_*` 表(13个):
-- ✅ `sys_users`, `sys_sessions`, `sys_roles`, `sys_permissions`
-- ✅ `sys_user_roles`, `sys_role_permissions`
-- ✅ `sys_login_logs`, `sys_operation_logs`
-- ✅ `sys_configs`, `sys_dict_types`, `sys_dict_items`
-- ✅ `sys_files`, `sys_tasks`
-
-### 1.2 统一使用新表
-- ✅ `users` - 用户表(认证服务使用)
-- ✅ `sessions` - 会话表
-- ✅ `documents`, `templates`, `nodes`, `edges`, `rules` 等核心业务表
-
-### 1.3 表结构优化
-**问题**: `preferences` 字段类型为 `JSONB`,导致 MyBatis-Plus 更新时类型转换错误
-
-**解决方案**: 将 `preferences` 字段类型从 `JSONB` 改为 `TEXT`
-
-```sql
-ALTER TABLE users ALTER COLUMN preferences TYPE text;
-```
-
-**原因**: 
-- MyBatis-Plus 在更新时将 String 类型直接传递给 PostgreSQL
-- PostgreSQL 不会自动将 `character varying` 转换为 `jsonb`
-- 使用 `TEXT` 类型可以存储 JSON 字符串,避免类型转换问题
-
----
-
-## 2. 后端代码修复
-
-### 2.1 User 实体类
-**文件**: `backend/auth-service/src/main/java/com/lingyue/auth/entity/User.java`
-
-**修改**: 添加 PostgreSQL JSONB TypeHandler(最终未使用,改用 TEXT 类型)
-
-```java
-@TableField(value = "preferences", typeHandler = com.lingyue.common.handler.PostgresJsonbTypeHandler.class)
-private String preferences;
-```
-
-### 2.2 AuthService 登录逻辑
-**文件**: `backend/auth-service/src/main/java/com/lingyue/auth/service/AuthService.java`
-
-**修改**: 使用 `UpdateWrapper` 只更新 `last_login_at` 字段
-
-```java
-// 更新最后登录时间(只更新需要的字段)
-UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
-updateWrapper.eq("id", user.getId())
-            .set("last_login_at", new java.util.Date());
-userRepository.update(null, updateWrapper);
-```
-
-### 2.3 PostgresJsonbTypeHandler
-**文件**: `backend/common/src/main/java/com/lingyue/common/handler/PostgresJsonbTypeHandler.java`
-
-**新增**: 自定义 TypeHandler 处理 PostgreSQL JSONB 类型(备用方案)
-
-```java
-@MappedTypes(String.class)
-public class PostgresJsonbTypeHandler extends BaseTypeHandler<String> {
-    @Override
-    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
-        PGobject jsonObject = new PGobject();
-        jsonObject.setType("jsonb");
-        jsonObject.setValue(parameter);
-        ps.setObject(i, jsonObject);
-    }
-    // ...
-}
-```
-
----
-
-## 3. 数据库初始化脚本更新
-
-### 3.1 init_mock.sql 精简
-**文件**: `0211docs/init_mock.sql`
-
-**变更**:
-- 从 1932 行精简到 588 行
-- 移除所有 `sys_*` 表定义和数据
-- 将 `preferences` 字段类型改为 `TEXT`
-- 添加管理员账号初始化(使用正确的 bcrypt 密码哈希)
-
-**管理员账号**:
-```sql
-INSERT INTO users (
-    id: '1',
-    username: 'admin',
-    email: 'admin@lingyue.com',
-    password_hash: '$2a$10$0AUCG2mG7a6JXErOTI.Pg.Q/R04plOXvc.TDMeWzwwZQ23ZmrtJxC',
-    display_name: '管理员',
-    role: 'admin',
-    is_active: true
-)
-```
-
-**登录信息**:
-- 用户名: `admin`
-- 密码: `admin123`
-
----
-
-## 4. 前端接口适配
-
-### 4.1 API 路径更新
-**文件**: `frontend/vue-demo/src/api/index.js`
-
-**已完成**:
-- ✅ Graph Service 路径统一使用 `/api/v1/graph/*` 前缀
-- ✅ 新增 `graphTemplateApi`, `graphProjectApi`, `graphReportApi`
-- ✅ 所有核心接口已适配新的后端路径
-
-### 4.2 Vite 配置更新
-**文件**: `frontend/vue-demo/vite.config.js`
-
-**修改**: 默认使用本地后端
-```javascript
-const API_SERVER = process.env.API_SERVER || 'http://localhost:18520'
-```
-
-### 4.3 API 文档
-已创建完整的 API 文档:
-- ✅ `frontend/vue-demo/API_GUIDE.md` - API 使用指南
-- ✅ `frontend/vue-demo/API_MAPPING.md` - 前后端接口映射对照表
-- ✅ `frontend/vue-demo/README_DEV.md` - 开发指南
-
----
-
-## 5. 验证结果
-
-### 5.1 登录功能测试
-```bash
-curl -X POST http://localhost:18520/auth/login \
-  -H "Content-Type: application/json" \
-  -d '{"usernameOrEmail":"admin","password":"admin123"}'
-```
-
-**响应**:
-```json
-{
-  "msg": "登录成功",
-  "code": 200,
-  "data": {
-    "accessToken": "eyJhbGciOiJIUzI1NiJ9...",
-    "refreshToken": "eyJhbGciOiJIUzI1NiJ9...",
-    "tokenType": "Bearer",
-    "expiresIn": 604800,
-    "userId": "1",
-    "username": "admin"
-  }
-}
-```
-
-✅ **登录成功!**
-
-### 5.2 服务健康检查
-```bash
-curl http://localhost:18520/actuator/health
-```
-
-**响应**:
-```json
-{
-  "status": "UP",
-  "components": {
-    "db": {"status": "UP"},
-    "diskSpace": {"status": "UP"},
-    "ping": {"status": "UP"}
-  }
-}
-```
-
-✅ **所有服务正常运行!**
-
----
-
-## 6. 文件变更清单
-
-### 6.1 数据库相关
-- ✅ `0211docs/init_mock.sql` - 精简并更新表结构
-- ✅ `database/migrations/001_cleanup_old_tables.sql` - 清理旧表脚本
-- ✅ `database/CLEANUP_SUMMARY.md` - 清理总结文档
-
-### 6.2 后端代码
-- ✅ `backend/auth-service/src/main/java/com/lingyue/auth/entity/User.java`
-- ✅ `backend/auth-service/src/main/java/com/lingyue/auth/service/AuthService.java`
-- ✅ `backend/common/src/main/java/com/lingyue/common/handler/PostgresJsonbTypeHandler.java`
-- ✅ `backend/auth-service/src/test/java/com/lingyue/auth/PasswordHashGenerator.java`
-
-### 6.3 前端代码
-- ✅ `frontend/vue-demo/vite.config.js`
-- ✅ `frontend/vue-demo/src/api/index.js`
-- ✅ `frontend/vue-demo/API_GUIDE.md`
-- ✅ `frontend/vue-demo/API_MAPPING.md`
-- ✅ `frontend/vue-demo/README_DEV.md`
-
----
-
-## 7. 技术要点总结
-
-### 7.1 PostgreSQL JSONB 类型处理
-**问题**: MyBatis-Plus 无法自动处理 JSONB 类型转换
-
-**解决方案**:
-1. **方案一**: 使用自定义 TypeHandler(复杂)
-2. **方案二**: 将字段类型改为 TEXT(简单有效)✅
-
-**最终选择**: 方案二,因为:
-- JSON 数据本质上是文本
-- TEXT 类型可以存储任意长度的 JSON 字符串
-- 避免了复杂的类型转换逻辑
-- 应用层可以自由处理 JSON 序列化/反序列化
-
-### 7.2 MyBatis-Plus 更新策略
-**问题**: `updateById()` 会更新所有字段,包括有类型问题的字段
-
-**解决方案**: 使用 `UpdateWrapper` 只更新需要的字段
-
-```java
-UpdateWrapper<User> wrapper = new UpdateWrapper<>();
-wrapper.eq("id", userId).set("field_name", value);
-repository.update(null, wrapper);
-```
-
-### 7.3 BCrypt 密码哈希
-**正确的密码哈希生成**:
-```java
-String hash = PasswordUtil.encode("admin123");
-// 结果: $2a$10$0AUCG2mG7a6JXErOTI.Pg.Q/R04plOXvc.TDMeWzwwZQ23ZmrtJxC
-```
-
----
-
-## 8. 后续建议
-
-### 8.1 数据库设计
-- ✅ 使用 TEXT 类型存储 JSON 数据(简单可靠)
-- ⚠️ 如需 JSON 查询功能,可考虑使用 JSONB + 自定义 TypeHandler
-
-### 8.2 代码规范
-- ✅ 统一使用新表结构,避免冗余
-- ✅ 使用 `UpdateWrapper` 进行部分字段更新
-- ✅ 密码哈希使用 BCrypt 算法
-
-### 8.3 前端开发
-- ✅ 使用 API 文档进行接口对接
-- ✅ 区分 Extract Service 和 Graph Service 的接口路径
-- ✅ 按需补充缺失的 API 封装
-
----
-
-## 9. 重构完成 ✅
-
-- ✅ 所有旧的 `sys_*` 表已删除
-- ✅ 数据库表结构已统一
-- ✅ `preferences` 字段类型问题已解决
-- ✅ 管理员账号已正确初始化
-- ✅ 登录功能正常工作
-- ✅ 前端接口已完全适配
-- ✅ 所有后端服务正常运行
-
-**系统现在使用统一的新表结构,代码更清晰,维护更简单!** 🎉

+ 0 - 278
database/generate_mock.py

@@ -1,278 +0,0 @@
-#!/usr/bin/env python3
-"""生成图数据库格式的 mock 数据 SQL"""
-
-# 47个要素定义 - 与模板占位符完全匹配
-ELEMENTS = [
-    # 文本型 - basicInfo 命名空间
-    (1, 'basicInfo.projectCode', '项目编号', 'text', 'basicInfo', 'projectCode', True),
-    (2, 'basicInfo.requestLevel', '申请级别', 'text', 'basicInfo', 'requestLevel', True),
-    (3, 'basicInfo.applyAt', '申请日期', 'text', 'basicInfo', 'applyAt', False),
-    (4, 'basicInfo.reviewObjectCertificateGetAt', '证书获取日期', 'text', 'basicInfo', 'reviewObjectCertificateGetAt', False),
-    (5, 'basicInfo.reviewObjectCertificate2GetAt', '二次证书获取日期', 'text', 'basicInfo', 'reviewObjectCertificate2GetAt', False),
-    (6, 'basicInfo.reviewCategory', '申请类别', 'text', 'basicInfo', 'reviewCategory', True),
-    (7, 'basicInfo.reviewUnit', '评审单位', 'text', 'basicInfo', 'reviewUnit', True),
-    # 文本型 - project 命名空间
-    (8, 'project.reviewObject', '评审对象', 'text', 'project', 'reviewObject', True),
-    (9, 'project.reviewObjectAlias', '评审对象简称', 'text', 'project', 'reviewObjectAlias', True),
-    (10, 'project.resultScore', '评审得分', 'text', 'project', 'resultScore', True),
-    (11, 'project.resultLevel', '评审级别', 'text', 'project', 'resultLevel', True),
-    (12, 'project.workStartAt', '评审开始日期', 'text', 'project', 'workStartAt', True),
-    (13, 'project.workEndAt', '评审结束日期', 'text', 'project', 'workEndAt', True),
-    (14, 'project.createdAt', '报告日期', 'text', 'project', 'createdAt', True),
-    (15, 'project.reviewPeriod', '评审周期', 'text', 'project', 'reviewPeriod', False),
-    (16, 'project.closingMeetingAt', '末次评审会议时间', 'text', 'project', 'closingMeetingAt', False),
-    # 段落型 - 章节1.1 评审对象概况
-    (17, 'project.reviewObjectSummary', '评审对象概况', 'paragraph', 'project', 'reviewObjectSummary', True),
-    (18, 'project.reviewObjectDescription', '评审对象描述', 'paragraph', 'project', 'reviewObjectDescription', True),
-    (19, 'project.reviewObjectSelfAssessmentProcess', '评审对象自评过程', 'paragraph', 'project', 'reviewObjectSelfAssessmentProcess', False),
-    (20, 'project.reviewRange', '复审范围', 'paragraph', 'project', 'reviewRange', False),
-    (21, 'project.reviewRangeShort', '复审范围简称', 'paragraph', 'project', 'reviewRangeShort', False),
-    # 段落型 - 章节1.2.1 目标职责
-    (22, 'project.target', '目标', 'paragraph', 'project', 'target', True),
-    (23, 'project.duty', '组织机构和职责', 'paragraph', 'project', 'duty', True),
-    (24, 'project.fullParticipation', '全员参与', 'paragraph', 'project', 'fullParticipation', False),
-    (25, 'project.safetyInvestment', '安全生产投入', 'paragraph', 'project', 'safetyInvestment', False),
-    (26, 'project.safetyCulture', '安全文化建设', 'paragraph', 'project', 'safetyCulture', False),
-    # 段落型 - 章节1.2.2 制度化管理
-    (27, 'project.systematicManagement', '制度化管理', 'paragraph', 'project', 'systematicManagement', False),
-    # 段落型 - 章节1.2.3 教育培训
-    (28, 'project.trainingManagement', '教育培训管理', 'paragraph', 'project', 'trainingManagement', False),
-    (29, 'project.employeeTraining', '人员教育培训', 'paragraph', 'project', 'employeeTraining', False),
-    # 段落型 - 章节1.2.4 现场管理
-    (30, 'project.assetManagement', '设备设施管理', 'paragraph', 'project', 'assetManagement', False),
-    (31, 'project.jobSafety', '作业安全', 'paragraph', 'project', 'jobSafety', False),
-    (32, 'project.positionQualified', '岗位达标', 'paragraph', 'project', 'positionQualified', False),
-    (33, 'project.partner', '相关方', 'paragraph', 'project', 'partner', False),
-    (34, 'project.occupationalHealth', '职业健康', 'paragraph', 'project', 'occupationalHealth', False),
-    # 段落型 - 章节1.2.5 安全风险管控及隐患排查治理
-    (35, 'project.riskAssessment', '风险辨识与评价', 'paragraph', 'project', 'riskAssessment', False),
-    (36, 'project.majorHazardManagement', '重大危险源管理', 'paragraph', 'project', 'majorHazardManagement', False),
-    (37, 'project.hazardInspection', '隐患排查', 'paragraph', 'project', 'hazardInspection', False),
-    (38, 'project.changeManagement', '变更管理', 'paragraph', 'project', 'changeManagement', False),
-    (39, 'project.earlyWarning', '预测预警', 'paragraph', 'project', 'earlyWarning', False),
-    # 段落型 - 章节1.2.6 应急救援
-    (40, 'project.emergencyResponse', '应急救援', 'paragraph', 'project', 'emergencyResponse', False),
-    # 段落型 - 章节1.2.7 事故管理
-    (41, 'project.incidentManagement', '事故管理', 'paragraph', 'project', 'incidentManagement', False),
-    # 段落型 - 章节1.2.8 持续改进
-    (42, 'project.continuousImprovement', '持续改进', 'paragraph', 'project', 'continuousImprovement', False),
-    # 段落型 - 章节1.3 安全生产标准化建设
-    (43, 'project.safetyStandardizationStatus', '安全生产标准化建设和持续运行情况', 'paragraph', 'project', 'safetyStandardizationStatus', False),
-    # 段落型 - 章节1.4 安全生产管理亮点
-    (44, 'project.safetyHighlight', '安全生产管理亮点', 'paragraph', 'project', 'safetyHighlight', False),
-    # 段落型 - 其他
-    (45, 'project.workProcess', '现场复审工作过程', 'paragraph', 'project', 'workProcess', False),
-    (46, 'project.moreWorkReference', '工作依据', 'paragraph', 'project', 'moreWorkReference', False),
-    # 表格型
-    (47, '+expert_list', '专家组成员表', 'table', None, 'expert_list', True),
-]
-
-# 要素值 - 与模板占位符匹配
-VALUES = {
-    # 文本型
-    'basicInfo.projectCode': 'BZ-0092-2024',
-    'basicInfo.requestLevel': '一级',
-    'basicInfo.applyAt': '2024年7月8日',
-    'basicInfo.reviewObjectCertificateGetAt': '2019年12月9日',
-    'basicInfo.reviewObjectCertificate2GetAt': '2015年4月7日',
-    'basicInfo.reviewCategory': '电力勘测设计企业',
-    'basicInfo.reviewUnit': '湖北安源安全环保科技有限公司',
-    'project.reviewObject': '中国电建集团成都勘测设计研究院有限公司',
-    'project.reviewObjectAlias': '成都院',
-    'project.resultScore': '93.33',
-    'project.resultLevel': '一级',
-    'project.workStartAt': '2024年7月13日',
-    'project.workEndAt': '2024年10月17日',
-    'project.createdAt': '2024年11月',
-    'project.reviewPeriod': '2023年7月8日-2024年7月8日',
-    'project.closingMeetingAt': '2024年10月17日',
-    # 段落型 - 章节1.1
-    'project.reviewObjectSummary': '中国电建集团成都勘测设计研究院有限公司(简称:成都院)成立于2005年,是世界500强企业中国电力建设集团的核心成员企业。作为国家级高新技术企业,成都院以水利水电、新能源和基础设施为核心业务,在水电工程领域承担了金沙江、大渡河、雅砻江等重大河流的规划勘测设计工作,创造了多项"中国第一"和"世界之最"。成都院拥有注册资本50亿元人民币,专业技术人员规模近3000人,累计获得4443项专利和100项行业资质认证,展现了雄厚的技术研发实力。',
-    'project.reviewObjectDescription': '中国电建集团成都勘测设计研究院有限公司(简称:成都院)是中国电力建设集团核心成员企业,作为国内领先的清洁能源工程服务商,成都院在水利水电、新能源及基础设施领域具有突出优势。成都院深度参与了国家西部大开发和"西电东送"战略,承担了包括两河口水电站、杨房沟水电站、乌东德水电站等重大工程的勘测设计工作,其中两河口水电站拥有世界最高土石坝的纪录。',
-    'project.reviewObjectSelfAssessmentProcess': '成都院于2024年3月启动安全生产标准化复审自评工作,成立了以总经理为组长的自评工作领导小组,制定了详细的自评工作方案。自评工作历时3个月,覆盖公司本部及所有在建项目,共发现问题隐患127项,已全部完成整改。',
-    # 段落型 - 章节1.2.1 目标职责
-    'project.target': '成都院制定并发布《QHSE"十四五"规划》(安质〔2023〕1号),明确了总体安全生产目标,包括7项安全管理及事故控制目标,总体目标为公司"十四五"规划的子规划,安全生产与职业健康工作目标纳入总体生产经营目标。成都院发布《关于印发<成都院2024年安全生产与职业健康、能源节约与生态环境保护工作目标和重点>的通知》(蓉设安质〔2024〕18号),明确了2024年安全生产与职业健康目标,包括9项安全管理目标和10项事故控制目标。',
-    'project.duty': '成都院建立了完善的安全生产组织机构体系,设立了安全生产委员会作为最高决策机构,下设安全质量环保部作为专职管理部门。公司各级领导班子成员均签订了安全生产责任书,明确了"党政同责、一岗双责"的安全生产责任制。各部门、各项目部均配备了专(兼)职安全管理人员,形成了横向到边、纵向到底的安全管理网络。',
-    'project.fullParticipation': '成都院建立了全员参与的安全生产管理机制,通过安全生产责任制的层层签订,将安全责任落实到每一位员工。公司定期组织安全生产培训和应急演练,提高全员安全意识和应急处置能力。建立了安全隐患举报奖励制度,鼓励员工积极参与安全管理。',
-    'project.safetyInvestment': '成都院严格执行安全生产费用提取和使用制度,按照规定比例提取安全生产费用,专款专用。2024年度安全生产投入总额达到2500万元,主要用于安全设施设备更新、安全培训教育、应急救援物资储备等方面。',
-    'project.safetyCulture': '成都院积极推进安全文化建设,将安全理念融入企业文化体系。通过开展"安全生产月"、"安全知识竞赛"等活动,营造浓厚的安全文化氛围。建立了安全文化展示厅,展示公司安全发展历程和典型案例。',
-    # 段落型 - 章节1.2.2 制度化管理
-    'project.systematicManagement': '成都院建立了完善的安全生产规章制度体系,涵盖安全生产责任制、安全生产管理制度、安全操作规程等方面。公司定期对制度进行评审和修订,确保制度的适用性和有效性。建立了制度执行情况检查机制,确保各项制度落实到位。',
-    # 段落型 - 章节1.2.3 教育培训
-    'project.trainingManagement': '成都院建立了完善的安全教育培训管理制度,制定了年度培训计划,明确了培训内容、培训对象和培训要求。公司设立了专门的培训管理部门,配备了专职培训管理人员,建立了培训档案管理系统。',
-    'project.employeeTraining': '成都院严格执行三级安全教育培训制度,新员工入职必须完成公司级、部门级、班组级三级安全教育培训。特种作业人员全部持证上岗,证书有效期内复审率达到100%。2024年度共组织各类安全培训156次,培训人员达到8500人次。',
-    # 段落型 - 章节1.2.4 现场管理
-    'project.assetManagement': '成都院建立了完善的设备设施管理制度,对所有生产设备设施实行台账管理。定期开展设备设施安全检查和维护保养,确保设备设施处于良好状态。特种设备全部按规定进行检验检测,检验合格率达到100%。',
-    'project.jobSafety': '成都院严格执行作业安全管理制度,对高风险作业实行作业许可制度。建立了作业风险分析和控制措施制度,作业前必须进行风险辨识和安全交底。配备了完善的个人防护用品,确保作业人员安全。',
-    'project.positionQualified': '成都院建立了岗位达标管理制度,明确了各岗位的安全生产职责和能力要求。定期开展岗位达标考核,考核结果与绩效挂钩。2024年度岗位达标率达到98%以上。',
-    'project.partner': '成都院建立了相关方安全管理制度,对承包商、供应商等相关方实行准入管理。签订安全生产协议,明确双方安全责任。定期对相关方进行安全检查和评价,不合格的相关方及时清退。',
-    'project.occupationalHealth': '成都院建立了职业健康管理制度,定期开展职业病危害因素检测和员工职业健康体检。配备了完善的职业病防护设施和个人防护用品。建立了职业健康档案,实行动态管理。',
-    # 段落型 - 章节1.2.5 安全风险管控
-    'project.riskAssessment': '成都院建立了安全风险辨识与评价制度,定期开展全面的风险辨识和评价工作。建立了风险分级管控清单,明确了各级风险的管控措施和责任人。对重大风险实行挂牌督办,确保风险可控。',
-    'project.majorHazardManagement': '成都院建立了重大危险源管理制度,对辨识出的重大危险源实行登记建档、定期检测、评估监控。制定了重大危险源应急预案,定期开展应急演练。',
-    'project.hazardInspection': '成都院建立了隐患排查治理制度,实行分级排查、分类治理。建立了隐患排查治理信息系统,实现隐患的闭环管理。2024年度共排查隐患1256项,整改率达到100%。',
-    'project.changeManagement': '成都院建立了变更管理制度,对人员、设备、工艺、环境等方面的变更实行审批管理。变更前进行风险评估,变更后进行验收确认,确保变更安全可控。',
-    'project.earlyWarning': '成都院建立了安全预测预警机制,利用信息化手段对安全生产状况进行实时监控和分析。建立了安全生产预警指标体系,及时发布预警信息,采取预防措施。',
-    # 段落型 - 章节1.2.6 应急救援
-    'project.emergencyResponse': '成都院建立了完善的应急救援体系,制定了综合应急预案和专项应急预案。配备了应急救援物资和装备,建立了应急救援队伍。定期开展应急演练,提高应急处置能力。2024年度共组织应急演练32次。',
-    # 段落型 - 章节1.2.7 事故管理
-    'project.incidentManagement': '成都院建立了事故管理制度,明确了事故报告、调查、处理和统计分析的程序和要求。建立了事故案例库,定期开展事故案例学习和警示教育。复审期内未发生生产安全事故。',
-    # 段落型 - 章节1.2.8 持续改进
-    'project.continuousImprovement': '成都院建立了安全生产持续改进机制,定期开展安全生产绩效评估和管理评审。根据评估结果制定改进措施,持续提升安全生产管理水平。建立了安全生产标准化建设长效机制,确保标准化工作持续有效运行。',
-    # 段落型 - 章节1.3
-    'project.safetyStandardizationStatus': '成都院自2015年首次通过电力勘测设计企业一级安全生产标准化评审以来,始终坚持标准化建设不放松,持续完善安全生产管理体系。公司将安全生产标准化建设纳入年度工作计划,定期开展自评和整改,确保标准化工作持续有效运行。',
-    # 段落型 - 章节1.4
-    'project.safetyHighlight': '成都院在安全生产管理方面形成了多项亮点:一是建立了智慧安全管理平台,实现了安全管理信息化、智能化;二是创新了"安全+党建"工作模式,将安全工作与党建工作深度融合;三是建立了安全生产标准化建设长效机制,确保标准化工作持续有效运行。',
-}
-
-def escape_sql(s):
-    if s is None:
-        return 'NULL'
-    return "'" + s.replace("'", "''") + "'"
-
-def generate_sql():
-    lines = []
-    lines.append("-- 灵越智报 Mock 数据 (图数据库格式)")
-    lines.append("-- 生成时间: 2026-03-02")
-    lines.append("")
-    
-    # 项目节点
-    lines.append("-- 项目节点")
-    lines.append("INSERT INTO nodes (id, node_type, node_key, name, status, created_by) VALUES")
-    lines.append("(10, 'PROJECT', 'PRJ-2024-001', '成都院2024年复审报告', 'draft', 1)")
-    lines.append("ON CONFLICT (id) DO NOTHING;")
-    lines.append("")
-    
-    # 要素定义节点
-    lines.append("-- 要素定义节点 (47个)")
-    for i, elem in enumerate(ELEMENTS):
-        elem_id, elem_key, elem_name, elem_type, namespace, field_name, required = elem
-        node_id = 700 + elem_id
-        lines.append(f"INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES ({node_id}, 'ELEMENT', {escape_sql(elem_key)}, {escape_sql(elem_name)}, 1) ON CONFLICT (id) DO NOTHING;")
-    lines.append("")
-    
-    # 要素定义属性
-    lines.append("-- 要素定义属性")
-    for elem in ELEMENTS:
-        elem_id, elem_key, elem_name, elem_type, namespace, field_name, required = elem
-        node_id = 700 + elem_id
-        lines.append(f"INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES ({node_id}, 'element_type', {escape_sql(elem_type)}) ON CONFLICT (node_id, prop_key) DO NOTHING;")
-        if namespace:
-            lines.append(f"INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES ({node_id}, 'namespace', {escape_sql(namespace)}) ON CONFLICT (node_id, prop_key) DO NOTHING;")
-        if field_name:
-            lines.append(f"INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES ({node_id}, 'field_name', {escape_sql(field_name)}) ON CONFLICT (node_id, prop_key) DO NOTHING;")
-        lines.append(f"INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES ({node_id}, 'required', {'true' if required else 'false'}) ON CONFLICT (node_id, prop_key) DO NOTHING;")
-    lines.append("")
-    
-    # 要素值节点
-    lines.append("-- 要素值节点 (47个)")
-    for elem in ELEMENTS:
-        elem_id, elem_key, elem_name, elem_type, namespace, field_name, required = elem
-        value_node_id = 800 + elem_id
-        value_key = f"PRJ-2024-001:{elem_key}"
-        lines.append(f"INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES ({value_node_id}, 'VALUE', {escape_sql(value_key)}, {escape_sql(elem_name + '值')}, 1) ON CONFLICT (id) DO NOTHING;")
-    lines.append("")
-    
-    # 要素值属性
-    lines.append("-- 要素值属性")
-    for elem in ELEMENTS:
-        elem_id, elem_key, elem_name, elem_type, namespace, field_name, required = elem
-        value_node_id = 800 + elem_id
-        value_text = VALUES.get(elem_key)
-        is_filled = 'true' if value_text else 'false'
-        lines.append(f"INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES ({value_node_id}, 'is_filled', '{is_filled}') ON CONFLICT (node_id, prop_key) DO NOTHING;")
-        if value_text:
-            lines.append(f"INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES ({value_node_id}, 'value_text', {escape_sql(value_text)}) ON CONFLICT (node_id, prop_key) DO NOTHING;")
-            lines.append(f"INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES ({value_node_id}, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;")
-    lines.append("")
-    
-    # HAS_ELEMENT 关系
-    lines.append("-- HAS_ELEMENT 关系")
-    for i, elem in enumerate(ELEMENTS):
-        elem_id = elem[0]
-        node_id = 700 + elem_id
-        lines.append(f"INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, {node_id}, {i+1}) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;")
-    lines.append("")
-    
-    # HAS_VALUE 关系
-    lines.append("-- HAS_VALUE 关系")
-    for elem in ELEMENTS:
-        elem_id = elem[0]
-        value_node_id = 800 + elem_id
-        lines.append(f"INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, {value_node_id}) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;")
-    lines.append("")
-    
-    # FOR_ELEMENT 关系
-    lines.append("-- FOR_ELEMENT 关系")
-    for elem in ELEMENTS:
-        elem_id = elem[0]
-        elem_node_id = 700 + elem_id
-        value_node_id = 800 + elem_id
-        lines.append(f"INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', {value_node_id}, {elem_node_id}) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;")
-    lines.append("")
-    
-    # 附件节点
-    lines.append("-- 附件节点")
-    lines.append("INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (400, 'ATTACHMENT', 'ATT-001', '01-复审通知', 1) ON CONFLICT (id) DO NOTHING;")
-    lines.append("INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (401, 'ATTACHMENT', 'ATT-002', '02-评审报告原文', 1) ON CONFLICT (id) DO NOTHING;")
-    lines.append("INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (402, 'ATTACHMENT', 'ATT-003', '03-安全标准化达标证书', 1) ON CONFLICT (id) DO NOTHING;")
-    lines.append("")
-    
-    # 附件属性
-    lines.append("-- 附件属性")
-    for att_id, name, size in [(400, '复审通知.docx', 102400), (401, '评审报告.pdf', 512000), (402, '达标证书.pdf', 256000)]:
-        lines.append(f"INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES ({att_id}, 'file_name', '{name}') ON CONFLICT (node_id, prop_key) DO NOTHING;")
-        lines.append(f"INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES ({att_id}, 'parse_status', 'completed') ON CONFLICT (node_id, prop_key) DO NOTHING;")
-        lines.append(f"INSERT INTO node_properties (node_id, prop_key, prop_number) VALUES ({att_id}, 'file_size', {size}) ON CONFLICT (node_id, prop_key) DO NOTHING;")
-    lines.append("")
-    
-    # HAS_ATTACHMENT 关系
-    lines.append("-- HAS_ATTACHMENT 关系")
-    lines.append("INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ATTACHMENT', 10, 400, 1) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;")
-    lines.append("INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ATTACHMENT', 10, 401, 2) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;")
-    lines.append("INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ATTACHMENT', 10, 402, 3) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;")
-    lines.append("")
-    
-    # 实体节点
-    lines.append("-- 实体节点")
-    entities = [
-        (500, 'ORG:成都院', '中国电建集团成都勘测设计研究院有限公司', 'ORG', '评审对象'),
-        (501, 'ORG:成都院简称', '成都院', 'ORG', '评审对象简称'),
-        (502, 'CODE:BZ-0092-2024', 'BZ-0092-2024', 'CODE', '项目编号'),
-        (503, 'DATE:开始', '2024年7月13日', 'DATE', '评审开始日期'),
-        (504, 'DATE:结束', '2024年10月17日', 'DATE', '评审结束日期'),
-        (505, 'NUMBER:得分', '93.33', 'NUMBER', '评审得分'),
-        (506, 'DATE:申请', '2024年7月8日', 'DATE', '申请日期'),
-        (507, 'DATE:证书', '2019年12月9日', 'DATE', '证书获取日期'),
-    ]
-    for ent_id, ent_key, ent_text, ent_type, label in entities:
-        lines.append(f"INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES ({ent_id}, 'ENTITY', {escape_sql(ent_key)}, {escape_sql(ent_text)}, 1) ON CONFLICT (id) DO NOTHING;")
-    lines.append("")
-    
-    # 实体属性
-    lines.append("-- 实体属性")
-    for ent_id, ent_key, ent_text, ent_type, label in entities:
-        lines.append(f"INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES ({ent_id}, 'entity_type', '{ent_type}') ON CONFLICT (node_id, prop_key) DO NOTHING;")
-        lines.append(f"INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES ({ent_id}, 'business_label', {escape_sql(label)}) ON CONFLICT (node_id, prop_key) DO NOTHING;")
-        lines.append(f"INSERT INTO node_properties (node_id, prop_key, prop_number) VALUES ({ent_id}, 'confidence', 0.95) ON CONFLICT (node_id, prop_key) DO NOTHING;")
-    lines.append("")
-    
-    # HAS_ENTITY 关系
-    lines.append("-- HAS_ENTITY 关系")
-    for ent_id, _, _, _, _ in entities:
-        lines.append(f"INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_ENTITY', 400, {ent_id}) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;")
-    lines.append("")
-    
-    # 更新序列
-    lines.append("-- 更新序列")
-    lines.append("SELECT setval('nodes_id_seq', (SELECT COALESCE(MAX(id), 1) FROM nodes));")
-    lines.append("SELECT setval('edges_id_seq', (SELECT COALESCE(MAX(id), 1) FROM edges));")
-    lines.append("SELECT setval('node_properties_id_seq', (SELECT COALESCE(MAX(id), 1) FROM node_properties));")
-    lines.append("")
-    
-    lines.append("SELECT '47个要素 Mock 数据导入完成' AS result;")
-    
-    return '\n'.join(lines)
-
-if __name__ == '__main__':
-    print(generate_sql())

+ 0 - 668
database/init.sql

@@ -1,668 +0,0 @@
--- =====================================================
--- 灵越智报 2.0 数据库初始化脚本
--- PostgreSQL 15+ / pgvector
--- 设计参考: a_docs/数据库设计文档.md
--- =====================================================
-
-CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-CREATE EXTENSION IF NOT EXISTS vector;
-
--- ==================== 用户表 ====================
-CREATE TABLE IF NOT EXISTS users (
-    id VARCHAR(36) PRIMARY KEY,
-    username VARCHAR(50) NOT NULL UNIQUE,
-    email VARCHAR(100) UNIQUE,
-    password_hash VARCHAR(255) NOT NULL,
-    display_name VARCHAR(100),
-    avatar_url VARCHAR(500),
-    role VARCHAR(20) DEFAULT 'user',
-    preferences JSONB DEFAULT '{}',
-    is_active BOOLEAN DEFAULT TRUE,
-    last_login_at TIMESTAMP,
-    create_by VARCHAR(36),
-    create_by_name VARCHAR(100),
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    update_by VARCHAR(36),
-    update_by_name VARCHAR(100),
-    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-CREATE INDEX IF NOT EXISTS idx_users_username ON users(username);
-CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);
-
--- ==================== 文档表 ====================
-CREATE TABLE IF NOT EXISTS documents (
-    id VARCHAR(36) PRIMARY KEY,
-    user_id VARCHAR(36) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
-    name VARCHAR(255) NOT NULL,
-    file_name VARCHAR(500) NOT NULL,
-    file_path VARCHAR(500) NOT NULL,
-    file_size BIGINT,
-    file_type VARCHAR(20) NOT NULL,
-    status VARCHAR(20) DEFAULT 'uploaded',
-    parsed_text TEXT,
-    page_count INT,
-    word_count INT,
-    entity_count INT DEFAULT 0,
-    relation_count INT DEFAULT 0,
-    rule_count INT DEFAULT 0,
-    metadata JSONB DEFAULT '{}',
-    del_flag BOOLEAN DEFAULT FALSE,
-    create_by VARCHAR(36),
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    update_by VARCHAR(36),
-    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-CREATE INDEX IF NOT EXISTS idx_documents_user ON documents(user_id);
-CREATE INDEX IF NOT EXISTS idx_documents_type ON documents(file_type);
-CREATE INDEX IF NOT EXISTS idx_documents_status ON documents(status);
-
--- ==================== 文档章节结构表 ====================
-CREATE TABLE IF NOT EXISTS document_sections (
-    id VARCHAR(36) PRIMARY KEY,
-    document_id VARCHAR(36) NOT NULL REFERENCES documents(id) ON DELETE CASCADE,
-    parent_id VARCHAR(36) REFERENCES document_sections(id) ON DELETE CASCADE,
-    section_index INT NOT NULL,
-    level INT NOT NULL DEFAULT 1,
-    title VARCHAR(500),
-    content TEXT,
-    start_page INT,
-    end_page INT,
-    start_char INT,
-    end_char INT,
-    section_type VARCHAR(32) DEFAULT 'heading',
-    table_data JSONB,
-    image_path VARCHAR(500),
-    image_caption VARCHAR(500),
-    metadata JSONB DEFAULT '{}',
-    sort_order INT DEFAULT 0,
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-CREATE INDEX IF NOT EXISTS idx_doc_sections_document ON document_sections(document_id);
-CREATE INDEX IF NOT EXISTS idx_doc_sections_parent ON document_sections(parent_id);
-CREATE INDEX IF NOT EXISTS idx_doc_sections_level ON document_sections(level);
-CREATE INDEX IF NOT EXISTS idx_doc_sections_type ON document_sections(section_type);
-
--- ==================== 文档分块表 ====================
-CREATE TABLE IF NOT EXISTS document_chunks (
-    id VARCHAR(36) PRIMARY KEY,
-    document_id VARCHAR(36) NOT NULL REFERENCES documents(id) ON DELETE CASCADE,
-    section_id VARCHAR(36) REFERENCES document_sections(id) ON DELETE SET NULL,
-    chunk_index INT NOT NULL,
-    content TEXT NOT NULL,
-    start_char INT,
-    end_char INT,
-    page_number INT,
-    token_count INT,
-    metadata JSONB DEFAULT '{}',
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-CREATE INDEX IF NOT EXISTS idx_doc_chunks_document ON document_chunks(document_id);
-CREATE INDEX IF NOT EXISTS idx_doc_chunks_section ON document_chunks(section_id);
-
--- ==================== 解析任务表(parse-service 依赖) ====================
-CREATE TABLE IF NOT EXISTS parse_tasks (
-    id VARCHAR(36) PRIMARY KEY,
-    document_id VARCHAR(36) NOT NULL REFERENCES documents(id) ON DELETE CASCADE,
-    status VARCHAR(20) DEFAULT 'pending',
-    progress INT DEFAULT 0,
-    current_step VARCHAR(32),
-    error_message TEXT,
-    options JSONB DEFAULT '{}',
-    started_at TIMESTAMP,
-    completed_at TIMESTAMP,
-    parse_status VARCHAR(20) DEFAULT 'pending',
-    parse_progress INT DEFAULT 0,
-    rag_status VARCHAR(20) DEFAULT 'pending',
-    rag_progress INT DEFAULT 0,
-    structured_status VARCHAR(20) DEFAULT 'pending',
-    structured_progress INT DEFAULT 0,
-    structured_element_count INT,
-    structured_image_count INT,
-    structured_table_count INT,
-    ner_status VARCHAR(20) DEFAULT 'pending',
-    ner_progress INT DEFAULT 0,
-    ner_task_id VARCHAR(100),
-    ner_entity_count INT,
-    ner_relation_count INT,
-    ner_message TEXT,
-    graph_status VARCHAR(20) DEFAULT 'pending',
-    graph_progress INT DEFAULT 0,
-    create_by VARCHAR(36),
-    create_by_name VARCHAR(100),
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    update_by VARCHAR(36),
-    update_by_name VARCHAR(100),
-    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-CREATE INDEX IF NOT EXISTS idx_parse_tasks_document ON parse_tasks(document_id);
-
--- ==================== 文档结构化元素表(结构化解析 / 前端展示依赖) ====================
-CREATE TABLE IF NOT EXISTS document_elements (
-    id VARCHAR(36) PRIMARY KEY,
-    document_id VARCHAR(36) NOT NULL REFERENCES documents(id) ON DELETE CASCADE,
-    element_index INT,
-    element_type VARCHAR(50),
-    content TEXT,
-    style JSONB DEFAULT '{}',
-    runs JSONB DEFAULT '[]',
-    image_url VARCHAR(500),
-    image_path VARCHAR(500),
-    image_alt VARCHAR(500),
-    image_width INT,
-    image_height INT,
-    image_format VARCHAR(20),
-    table_index INT,
-    table_data JSONB,
-    table_row_count INT,
-    table_col_count INT,
-    table_text TEXT,
-    create_by VARCHAR(36),
-    create_by_name VARCHAR(100),
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    update_by VARCHAR(36),
-    update_by_name VARCHAR(100),
-    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-CREATE INDEX IF NOT EXISTS idx_document_elements_document ON document_elements(document_id);
-
--- ==================== 向量嵌入表 ====================
-CREATE TABLE IF NOT EXISTS embeddings (
-    id VARCHAR(36) PRIMARY KEY,
-    chunk_id VARCHAR(36) NOT NULL REFERENCES document_chunks(id) ON DELETE CASCADE,
-    embedding vector(1536),
-    model_name VARCHAR(100) DEFAULT 'text-embedding-ada-002',
-    model_version VARCHAR(50),
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-CREATE INDEX IF NOT EXISTS idx_embeddings_chunk ON embeddings(chunk_id);
-CREATE INDEX IF NOT EXISTS idx_embeddings_vector ON embeddings USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
-
--- ==================== 实体类型表 ====================
-CREATE TABLE IF NOT EXISTS entity_types (
-    id VARCHAR(36) PRIMARY KEY,
-    type_code VARCHAR(50) NOT NULL UNIQUE,
-    type_name VARCHAR(100) NOT NULL,
-    category VARCHAR(32),
-    color VARCHAR(20),
-    icon VARCHAR(50),
-    patterns JSONB DEFAULT '[]',
-    examples JSONB DEFAULT '[]',
-    description TEXT,
-    is_active BOOLEAN DEFAULT TRUE,
-    sort_order INT DEFAULT 0,
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-CREATE INDEX IF NOT EXISTS idx_entity_types_code ON entity_types(type_code);
-
--- ==================== 实体节点表(方案 B:视图驱动)====================
-CREATE TABLE IF NOT EXISTS entity_nodes (
-    id VARCHAR(36) PRIMARY KEY,
-    entity_type VARCHAR(50) NOT NULL,
-    name VARCHAR(500) NOT NULL,
-    normalized_text VARCHAR(500),
-    embedding vector(1536),
-    del_flag BOOLEAN DEFAULT FALSE,
-    create_by VARCHAR(36),
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    update_by VARCHAR(36),
-    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    UNIQUE(entity_type, normalized_text)
-);
-CREATE INDEX IF NOT EXISTS idx_entity_nodes_type ON entity_nodes(entity_type);
-CREATE INDEX IF NOT EXISTS idx_entity_nodes_name ON entity_nodes(name);
-CREATE INDEX IF NOT EXISTS idx_entity_nodes_normalized ON entity_nodes(normalized_text);
-
--- ==================== 实体属性表 ====================
-CREATE TABLE IF NOT EXISTS entity_attributes (
-    id VARCHAR(36) PRIMARY KEY,
-    entity_id VARCHAR(36) NOT NULL REFERENCES entity_nodes(id) ON DELETE CASCADE,
-    attribute_key VARCHAR(100) NOT NULL,
-    attribute_value TEXT,
-    value_type VARCHAR(32) DEFAULT 'STRING',
-    sort_order INT DEFAULT 0,
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    UNIQUE(entity_id, attribute_key)
-);
-CREATE INDEX IF NOT EXISTS idx_entity_attributes_entity ON entity_attributes(entity_id);
-CREATE INDEX IF NOT EXISTS idx_entity_attributes_key ON entity_attributes(attribute_key);
-
--- ==================== 实体视图 v_entities(读模型)====================
-CREATE OR REPLACE VIEW v_entities AS
-SELECT
-    n.id,
-    n.entity_type,
-    n.name AS entity_text,
-    n.normalized_text,
-    n.embedding,
-    n.del_flag,
-    n.create_by,
-    n.create_time,
-    n.update_by,
-    n.update_time,
-    (SELECT attribute_value FROM entity_attributes WHERE entity_id = n.id AND attribute_key = 'aliases' LIMIT 1) AS aliases,
-    (SELECT attribute_value FROM entity_attributes WHERE entity_id = n.id AND attribute_key = 'metadata' LIMIT 1) AS metadata,
-    COALESCE((SELECT (attribute_value::INT) FROM entity_attributes WHERE entity_id = n.id AND attribute_key = 'occurrence_count' LIMIT 1), 1) AS occurrence_count,
-    COALESCE((SELECT (attribute_value::FLOAT) FROM entity_attributes WHERE entity_id = n.id AND attribute_key = 'confidence' LIMIT 1), 1.0) AS confidence,
-    COALESCE((SELECT (attribute_value::BOOLEAN) FROM entity_attributes WHERE entity_id = n.id AND attribute_key = 'is_confirmed' LIMIT 1), FALSE) AS is_confirmed,
-    COALESCE((SELECT (attribute_value::BOOLEAN) FROM entity_attributes WHERE entity_id = n.id AND attribute_key = 'is_merged' LIMIT 1), FALSE) AS is_merged,
-    (SELECT attribute_value FROM entity_attributes WHERE entity_id = n.id AND attribute_key = 'merged_to_id' LIMIT 1) AS merged_to_id
-FROM entity_nodes n
-WHERE n.del_flag = FALSE;
-
--- ==================== 文档–实体关联表 ====================
-CREATE TABLE IF NOT EXISTS document_entities (
-    id VARCHAR(36) PRIMARY KEY,
-    document_id VARCHAR(36) NOT NULL REFERENCES documents(id) ON DELETE CASCADE,
-    entity_id VARCHAR(36) NOT NULL REFERENCES entity_nodes(id) ON DELETE CASCADE,
-    business_label VARCHAR(100),
-    display_text VARCHAR(500),
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    UNIQUE(document_id, entity_id, business_label)
-);
-CREATE INDEX IF NOT EXISTS idx_document_entities_document ON document_entities(document_id);
-CREATE INDEX IF NOT EXISTS idx_document_entities_entity ON document_entities(entity_id);
-CREATE INDEX IF NOT EXISTS idx_document_entities_label ON document_entities(business_label);
-
--- ==================== 关系类型表 ====================
-CREATE TABLE IF NOT EXISTS relation_types (
-    id VARCHAR(36) PRIMARY KEY,
-    type_code VARCHAR(50) NOT NULL UNIQUE,
-    type_name VARCHAR(100) NOT NULL,
-    source_entity_types JSONB DEFAULT '[]',
-    target_entity_types JSONB DEFAULT '[]',
-    is_symmetric BOOLEAN DEFAULT FALSE,
-    description TEXT,
-    is_active BOOLEAN DEFAULT TRUE,
-    sort_order INT DEFAULT 0,
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-CREATE INDEX IF NOT EXISTS idx_relation_types_code ON relation_types(type_code);
-
--- ==================== 实体关系表 ====================
-CREATE TABLE IF NOT EXISTS entity_relations (
-    id VARCHAR(36) PRIMARY KEY,
-    document_id VARCHAR(36) NOT NULL REFERENCES documents(id) ON DELETE CASCADE,
-    source_entity_id VARCHAR(36) NOT NULL REFERENCES entity_nodes(id) ON DELETE CASCADE,
-    target_entity_id VARCHAR(36) NOT NULL REFERENCES entity_nodes(id) ON DELETE CASCADE,
-    relation_type VARCHAR(50) NOT NULL,
-    relation_text VARCHAR(500),
-    confidence FLOAT DEFAULT 1.0,
-    extraction_method VARCHAR(32) DEFAULT 'auto',
-    evidence_text TEXT,
-    is_confirmed BOOLEAN DEFAULT FALSE,
-    metadata JSONB DEFAULT '{}',
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-CREATE INDEX IF NOT EXISTS idx_relations_document ON entity_relations(document_id);
-CREATE INDEX IF NOT EXISTS idx_relations_source ON entity_relations(source_entity_id);
-CREATE INDEX IF NOT EXISTS idx_relations_target ON entity_relations(target_entity_id);
-CREATE INDEX IF NOT EXISTS idx_relations_type ON entity_relations(relation_type);
-
--- ==================== 规则表 ====================
-CREATE TABLE IF NOT EXISTS rules (
-    id VARCHAR(36) PRIMARY KEY,
-    document_id VARCHAR(36) REFERENCES documents(id) ON DELETE SET NULL,
-    user_id VARCHAR(36) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
-    name VARCHAR(200) NOT NULL,
-    description TEXT,
-    category VARCHAR(50),
-    rule_type VARCHAR(32) NOT NULL,
-    source VARCHAR(32) DEFAULT 'auto',
-    priority INT DEFAULT 0,
-    status VARCHAR(20) DEFAULT 'draft',
-    embedding vector(1536),
-    is_global BOOLEAN DEFAULT FALSE,
-    del_flag BOOLEAN DEFAULT FALSE,
-    create_by VARCHAR(36),
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    update_by VARCHAR(36),
-    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-CREATE INDEX IF NOT EXISTS idx_rules_document ON rules(document_id);
-CREATE INDEX IF NOT EXISTS idx_rules_user ON rules(user_id);
-CREATE INDEX IF NOT EXISTS idx_rules_type ON rules(rule_type);
-CREATE INDEX IF NOT EXISTS idx_rules_status ON rules(status);
-CREATE INDEX IF NOT EXISTS idx_rules_category ON rules(category);
-
--- ==================== 规则条件表 ====================
-CREATE TABLE IF NOT EXISTS rule_conditions (
-    id VARCHAR(36) PRIMARY KEY,
-    rule_id VARCHAR(36) NOT NULL REFERENCES rules(id) ON DELETE CASCADE,
-    condition_index INT NOT NULL,
-    condition_type VARCHAR(32) NOT NULL,
-    config JSONB NOT NULL,
-    logic_operator VARCHAR(10) DEFAULT 'AND',
-    sort_order INT DEFAULT 0,
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-CREATE INDEX IF NOT EXISTS idx_rule_conditions_rule ON rule_conditions(rule_id);
-
--- ==================== 规则动作表 ====================
-CREATE TABLE IF NOT EXISTS rule_actions (
-    id VARCHAR(36) PRIMARY KEY,
-    rule_id VARCHAR(36) NOT NULL REFERENCES rules(id) ON DELETE CASCADE,
-    action_index INT NOT NULL,
-    action_type VARCHAR(32) NOT NULL,
-    config JSONB NOT NULL,
-    target_field VARCHAR(100),
-    sort_order INT DEFAULT 0,
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-CREATE INDEX IF NOT EXISTS idx_rule_actions_rule ON rule_actions(rule_id);
-
--- ==================== 生成任务表 ====================
-CREATE TABLE IF NOT EXISTS generations (
-    id VARCHAR(36) PRIMARY KEY,
-    user_id VARCHAR(36) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
-    document_id VARCHAR(36) REFERENCES documents(id) ON DELETE SET NULL,
-    template_id VARCHAR(36),
-    name VARCHAR(200),
-    applied_rules JSONB DEFAULT '[]',
-    source_file_map JSONB DEFAULT '{}',
-    extracted_data JSONB DEFAULT '{}',
-    confirmed_data JSONB DEFAULT '{}',
-    output_file_path VARCHAR(500),
-    output_file_name VARCHAR(255),
-    output_document_id VARCHAR(36),
-    progress INTEGER,
-    status VARCHAR(20) DEFAULT 'pending',
-    error_message TEXT,
-    started_at TIMESTAMP,
-    reviewed_at TIMESTAMP,
-    completed_at TIMESTAMP,
-    del_flag BOOLEAN DEFAULT FALSE,
-    create_by VARCHAR(36),
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    update_by VARCHAR(36),
-    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-CREATE INDEX IF NOT EXISTS idx_generations_user ON generations(user_id);
-CREATE INDEX IF NOT EXISTS idx_generations_document ON generations(document_id);
-CREATE INDEX IF NOT EXISTS idx_generations_status ON generations(status);
-
--- ==================== 生成输出表 ====================
-CREATE TABLE IF NOT EXISTS generation_outputs (
-    id VARCHAR(36) PRIMARY KEY,
-    generation_id VARCHAR(36) NOT NULL REFERENCES generations(id) ON DELETE CASCADE,
-    version INT NOT NULL DEFAULT 1,
-    file_path VARCHAR(500) NOT NULL,
-    file_name VARCHAR(255) NOT NULL,
-    file_size BIGINT,
-    file_type VARCHAR(20) DEFAULT 'docx',
-    share_token VARCHAR(100),
-    share_expires_at TIMESTAMP,
-    download_count INT DEFAULT 0,
-    is_final BOOLEAN DEFAULT FALSE,
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-CREATE INDEX IF NOT EXISTS idx_gen_outputs_generation ON generation_outputs(generation_id);
-CREATE INDEX IF NOT EXISTS idx_gen_outputs_share ON generation_outputs(share_token);
-
--- ==================== 模板/变量/来源文件(兼容现有模板流程) ====================
-CREATE TABLE IF NOT EXISTS templates (
-    id VARCHAR(36) PRIMARY KEY,
-    user_id VARCHAR(36) NOT NULL,
-    name VARCHAR(200),
-    description TEXT,
-    base_document_id VARCHAR(36),
-    status VARCHAR(20) DEFAULT 'draft',
-    config JSONB DEFAULT '{}',
-    is_public BOOLEAN DEFAULT FALSE,
-    use_count INT DEFAULT 0,
-    rating DOUBLE PRECISION,
-    create_by VARCHAR(36),
-    create_by_name VARCHAR(100),
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    update_by VARCHAR(36),
-    update_by_name VARCHAR(100),
-    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-CREATE INDEX IF NOT EXISTS idx_templates_user ON templates(user_id);
-
-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),
-    variable_group VARCHAR(100),
-    category VARCHAR(50),
-    location JSONB,
-    example_value TEXT,
-    value_type VARCHAR(20),
-    source_file_alias VARCHAR(100),
-    source_type VARCHAR(30),
-    source_config JSONB DEFAULT '{}',
-    extract_type VARCHAR(30),
-    extract_config JSONB DEFAULT '{}',
-    display_order INT DEFAULT 0,
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-CREATE INDEX IF NOT EXISTS idx_variables_template ON variables(template_id);
-
-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 '[]',
-    required BOOLEAN DEFAULT TRUE,
-    example_document_id VARCHAR(36),
-    display_order INT DEFAULT 0,
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-CREATE INDEX IF NOT EXISTS idx_source_files_template ON source_files(template_id);
-
--- ==================== 标准实体表 ====================
-CREATE TABLE IF NOT EXISTS standard_entities (
-    id VARCHAR(36) PRIMARY KEY,
-    entity_type VARCHAR(50) NOT NULL,
-    name VARCHAR(500) NOT NULL,
-    aliases JSONB DEFAULT '[]',
-    attributes JSONB DEFAULT '{}',
-    embedding vector(1536),
-    occurrence_count INT DEFAULT 1,
-    document_count INT DEFAULT 1,
-    is_verified BOOLEAN DEFAULT FALSE,
-    del_flag BOOLEAN DEFAULT FALSE,
-    create_by VARCHAR(36),
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    update_by VARCHAR(36),
-    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-CREATE INDEX IF NOT EXISTS idx_std_entities_type ON standard_entities(entity_type);
-CREATE INDEX IF NOT EXISTS idx_std_entities_name ON standard_entities(name);
-CREATE INDEX IF NOT EXISTS idx_std_entities_vector ON standard_entities USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
-
--- ==================== 标准关系表 ====================
-CREATE TABLE IF NOT EXISTS standard_relations (
-    id VARCHAR(36) PRIMARY KEY,
-    source_entity_id VARCHAR(36) NOT NULL REFERENCES standard_entities(id) ON DELETE CASCADE,
-    target_entity_id VARCHAR(36) NOT NULL REFERENCES standard_entities(id) ON DELETE CASCADE,
-    relation_type VARCHAR(50) NOT NULL,
-    attributes JSONB DEFAULT '{}',
-    occurrence_count INT DEFAULT 1,
-    is_verified BOOLEAN DEFAULT FALSE,
-    del_flag BOOLEAN DEFAULT FALSE,
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-CREATE INDEX IF NOT EXISTS idx_std_relations_source ON standard_relations(source_entity_id);
-CREATE INDEX IF NOT EXISTS idx_std_relations_target ON standard_relations(target_entity_id);
-CREATE INDEX IF NOT EXISTS idx_std_relations_type ON standard_relations(relation_type);
-
--- ==================== 实体合并记录表 ====================
-CREATE TABLE IF NOT EXISTS entity_merge_records (
-    id VARCHAR(36) PRIMARY KEY,
-    source_entity_id VARCHAR(36) NOT NULL REFERENCES entity_nodes(id) ON DELETE CASCADE,
-    target_entity_id VARCHAR(36) NOT NULL REFERENCES standard_entities(id) ON DELETE CASCADE,
-    similarity_score FLOAT,
-    merge_type VARCHAR(32) DEFAULT 'auto',
-    create_by VARCHAR(36),
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-CREATE INDEX IF NOT EXISTS idx_merge_records_source ON entity_merge_records(source_entity_id);
-CREATE INDEX IF NOT EXISTS idx_merge_records_target ON entity_merge_records(target_entity_id);
-
--- ==================== 规则-标准实体/关系关联(实体图与拖拽搭建规则) ====================
-CREATE TABLE IF NOT EXISTS rule_standard_entities (
-    id VARCHAR(36) PRIMARY KEY,
-    rule_id VARCHAR(36) NOT NULL REFERENCES rules(id) ON DELETE CASCADE,
-    standard_entity_id VARCHAR(36) NOT NULL REFERENCES standard_entities(id) ON DELETE CASCADE,
-    role VARCHAR(32) DEFAULT 'participant',
-    display_order INT DEFAULT 0,
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    UNIQUE(rule_id, standard_entity_id)
-);
-CREATE INDEX IF NOT EXISTS idx_rule_std_entities_rule ON rule_standard_entities(rule_id);
-CREATE INDEX IF NOT EXISTS idx_rule_std_entities_entity ON rule_standard_entities(standard_entity_id);
-
-CREATE TABLE IF NOT EXISTS rule_standard_relations (
-    id VARCHAR(36) PRIMARY KEY,
-    rule_id VARCHAR(36) NOT NULL REFERENCES rules(id) ON DELETE CASCADE,
-    standard_relation_id VARCHAR(36) NOT NULL REFERENCES standard_relations(id) ON DELETE CASCADE,
-    display_order INT DEFAULT 0,
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    UNIQUE(rule_id, standard_relation_id)
-);
-CREATE INDEX IF NOT EXISTS idx_rule_std_relations_rule ON rule_standard_relations(rule_id);
-CREATE INDEX IF NOT EXISTS idx_rule_std_relations_relation ON rule_standard_relations(standard_relation_id);
-
--- ==================== 前端业务:公司 / 项目 / 报告 / 报告附件 ====================
-CREATE TABLE IF NOT EXISTS companies (
-    id VARCHAR(36) PRIMARY KEY,
-    parent_id VARCHAR(36) REFERENCES companies(id) ON DELETE SET NULL,
-    name VARCHAR(500) NOT NULL,
-    short_name VARCHAR(100),
-    unified_social_credit_code VARCHAR(50),
-    description TEXT,
-    metadata JSONB DEFAULT '{}',
-    del_flag BOOLEAN DEFAULT FALSE,
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-CREATE INDEX IF NOT EXISTS idx_companies_parent ON companies(parent_id);
-CREATE INDEX IF NOT EXISTS idx_companies_name ON companies(name);
-
-CREATE TABLE IF NOT EXISTS projects (
-    id VARCHAR(36) PRIMARY KEY,
-    company_id VARCHAR(36) REFERENCES companies(id) ON DELETE SET NULL,
-    project_code VARCHAR(100) NOT NULL,
-    project_name VARCHAR(500),
-    review_object VARCHAR(500),
-    review_object_alias VARCHAR(200),
-    review_object_summary TEXT,
-    application_category VARCHAR(100),
-    request_level VARCHAR(50),
-    result_level VARCHAR(50),
-    result_score DECIMAL(10,2),
-    review_period VARCHAR(200),
-    work_start_at DATE,
-    work_end_at DATE,
-    review_object_certificate2_get_at DATE,
-    apply_at DATE,
-    reviewer_company_id VARCHAR(36) REFERENCES companies(id) ON DELETE SET NULL,
-    metadata JSONB DEFAULT '{}',
-    del_flag BOOLEAN DEFAULT FALSE,
-    create_by VARCHAR(36),
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    update_by VARCHAR(36),
-    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-CREATE INDEX IF NOT EXISTS idx_projects_company ON projects(company_id);
-CREATE INDEX IF NOT EXISTS idx_projects_code ON projects(project_code);
-
-CREATE TABLE IF NOT EXISTS reports (
-    id VARCHAR(36) PRIMARY KEY,
-    user_id VARCHAR(36) NOT NULL REFERENCES users(id) ON DELETE CASCADE,
-    project_id VARCHAR(36) REFERENCES projects(id) ON DELETE SET NULL,
-    title VARCHAR(500) NOT NULL,
-    report_type VARCHAR(100),
-    status VARCHAR(20) NOT NULL DEFAULT 'draft',
-    content_template TEXT,
-    content_rendered TEXT,
-    auto_saved_at TIMESTAMP,
-    report_score DECIMAL(10,2),
-    report_level VARCHAR(50),
-    report_metrics JSONB DEFAULT '{}',
-    generation_id VARCHAR(36) REFERENCES generations(id) ON DELETE SET NULL,
-    source_document_id VARCHAR(36) REFERENCES documents(id) ON DELETE SET NULL,
-    archived_at TIMESTAMP,
-    published_at TIMESTAMP,
-    del_flag BOOLEAN DEFAULT FALSE,
-    create_by VARCHAR(36),
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    update_by VARCHAR(36),
-    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-CREATE INDEX IF NOT EXISTS idx_reports_user ON reports(user_id);
-CREATE INDEX IF NOT EXISTS idx_reports_project ON reports(project_id);
-CREATE INDEX IF NOT EXISTS idx_reports_status ON reports(status);
-CREATE INDEX IF NOT EXISTS idx_reports_created ON reports(create_time);
-
-CREATE TABLE IF NOT EXISTS report_attachments (
-    id VARCHAR(36) PRIMARY KEY,
-    report_id VARCHAR(36) NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
-    display_name VARCHAR(255),
-    file_name VARCHAR(500) NOT NULL,
-    file_path VARCHAR(500) NOT NULL,
-    file_type VARCHAR(50),
-    file_size BIGINT,
-    sort_order INT DEFAULT 0,
-    saved_to_knowledge_base BOOLEAN DEFAULT FALSE,
-    knowledge_base_item_id VARCHAR(36),
-    uploaded_by VARCHAR(36) REFERENCES users(id) ON DELETE SET NULL,
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-CREATE INDEX IF NOT EXISTS idx_report_attachments_report ON report_attachments(report_id);
-
--- ==================== 报告占位符定义表 ====================
-CREATE TABLE IF NOT EXISTS placeholder_definitions (
-    id VARCHAR(36) PRIMARY KEY,
-    report_type VARCHAR(100),
-    placeholder_key VARCHAR(200) NOT NULL,
-    placeholder_group VARCHAR(50),
-    source_table VARCHAR(100) NOT NULL,
-    source_column VARCHAR(100) NOT NULL,
-    description VARCHAR(500),
-    example_value TEXT,
-    sort_order INT DEFAULT 0,
-    is_active BOOLEAN DEFAULT TRUE,
-    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    UNIQUE(placeholder_key)
-);
-CREATE INDEX IF NOT EXISTS idx_placeholder_definitions_group ON placeholder_definitions(placeholder_group);
-CREATE INDEX IF NOT EXISTS idx_placeholder_definitions_report_type ON placeholder_definitions(report_type);
-
--- ==================== 预置数据 ====================
-INSERT INTO entity_types (id, type_code, type_name, category, color, icon, description, sort_order) VALUES
-('et-001', 'PERSON', '人名', 'basic', '#1890ff', 'user', '人物姓名,如:张经理、李总', 1),
-('et-002', 'ORG', '机构', 'basic', '#faad14', 'bank', '组织机构,如:成都检测公司、环保局', 2),
-('et-003', 'LOC', '地点', 'basic', '#52c41a', 'environment', '地理位置,如:成都市高新区', 3),
-('et-004', 'DATE', '日期', 'basic', '#722ed1', 'calendar', '日期时间,如:2024年5月15日', 4),
-('et-005', 'NUMBER', '数值', 'basic', '#13c2c2', 'number', '数值数量,如:50分贝、100万元', 5),
-('et-006', 'DEVICE', '设备', 'domain', '#eb2f96', 'tool', '设备仪器,如:噪音检测设备、光谱仪', 10),
-('et-007', 'PROJECT', '项目', 'domain', '#f5222d', 'project', '项目名称,如:环境监测项目', 11),
-('et-008', 'TERM', '术语', 'domain', '#a0d911', 'book', '专业术语,如:COD、BOD、PM2.5', 12),
-('et-009', 'STANDARD', '标准', 'domain', '#2f54eb', 'file-text', '标准规范,如:GB 3096-2008', 13),
-('et-010', 'MATERIAL', '材料', 'domain', '#fa8c16', 'experiment', '材料物质,如:甲醛、苯', 14),
-('et-011', 'METHOD', '方法', 'domain', '#1890ff', 'api', '检测方法,如:气相色谱法', 15)
-ON CONFLICT (id) DO NOTHING;
-
-INSERT INTO relation_types (id, type_code, type_name, source_entity_types, target_entity_types, is_symmetric, description) VALUES
-('rt-001', 'LOCATED_IN', '位于', '["ORG", "PERSON", "PROJECT"]', '["LOC"]', false, '实体位于某地'),
-('rt-002', 'WORKS_FOR', '任职于', '["PERSON"]', '["ORG"]', false, '人员任职于机构'),
-('rt-003', 'BELONGS_TO', '属于', '["ORG", "PROJECT"]', '["ORG"]', false, '隶属关系'),
-('rt-004', 'RESPONSIBLE_FOR', '负责', '["PERSON", "ORG"]', '["PROJECT", "LOC"]', false, '负责某事/某地'),
-('rt-005', 'USES', '使用', '["ORG", "PERSON", "PROJECT"]', '["DEVICE", "METHOD"]', false, '使用设备/方法'),
-('rt-006', 'DETECTS', '检测', '["ORG", "PERSON", "DEVICE"]', '["MATERIAL", "TERM"]', false, '检测某物质/指标'),
-('rt-007', 'CONTAINS', '包含', '["PROJECT", "ORG"]', '["PROJECT", "TERM", "MATERIAL"]', false, '包含关系'),
-('rt-008', 'COMPLIES_WITH', '符合', '["PROJECT", "ORG", "METHOD"]', '["STANDARD"]', false, '符合某标准'),
-('rt-009', 'PRODUCES', '产生', '["ORG", "PROJECT", "DEVICE"]', '["NUMBER", "MATERIAL"]', false, '产生数据/物质'),
-('rt-010', 'COOPERATES', '合作', '["ORG"]', '["ORG"]', true, '机构合作关系'),
-('rt-011', 'OCCURS_AT', '发生于', '["PROJECT"]', '["DATE"]', false, '发生在某时间')
-ON CONFLICT (id) DO NOTHING;

+ 0 - 684
database/init_0211_full.sql

@@ -1,684 +0,0 @@
--- ============================================================
--- 灵越智报 2.0 数据库完整脚本
--- 基于 2026-02-11 会议讨论设计
--- 
--- 核心概念:
--- - 静态要素:模板中固定不变的文本
--- - 动态要素:需要通过规则计算填充的内容
--- - 占位符:动态要素在模板中的标识符
--- ============================================================
-
--- ============================================================
--- 1. 基础表
--- ============================================================
-
--- ------------------------------------------------------------
--- 1.1 users - 用户表
--- ------------------------------------------------------------
-CREATE TABLE IF NOT EXISTS users (
-    id BIGSERIAL PRIMARY KEY,
-    username VARCHAR(100) NOT NULL UNIQUE,
-    password_hash VARCHAR(255) NOT NULL,
-    email VARCHAR(200),
-    phone VARCHAR(20),
-    real_name VARCHAR(100),
-    avatar_url VARCHAR(500),
-    status VARCHAR(50) DEFAULT 'active',
-    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-
-COMMENT ON TABLE users IS '用户表';
-COMMENT ON COLUMN users.status IS '状态: active/disabled';
-
--- ------------------------------------------------------------
--- 1.2 projects - 项目表
--- ------------------------------------------------------------
-CREATE TABLE IF NOT EXISTS projects (
-    id BIGSERIAL PRIMARY KEY,
-    name VARCHAR(200) NOT NULL,
-    code VARCHAR(100),
-    description TEXT,
-    status VARCHAR(50) DEFAULT 'active',
-    owner_id BIGINT REFERENCES users(id),
-    created_by BIGINT REFERENCES users(id),
-    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-
-COMMENT ON TABLE projects IS '项目表';
-
--- ============================================================
--- 2. 模板相关表
--- ============================================================
-
--- ------------------------------------------------------------
--- 2.1 report_templates - 报告模板表
--- ------------------------------------------------------------
-CREATE TABLE IF NOT EXISTS report_templates (
-    id BIGSERIAL PRIMARY KEY,
-    name VARCHAR(200) NOT NULL,
-    category VARCHAR(100),
-    description TEXT,
-    content_html TEXT,
-    content_json JSONB,
-    dynamic_element_count INT DEFAULT 0,
-    table_element_count INT DEFAULT 0,
-    status VARCHAR(50) DEFAULT 'active',
-    created_by BIGINT REFERENCES users(id),
-    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-
-COMMENT ON TABLE report_templates IS '报告模板表';
-COMMENT ON COLUMN report_templates.dynamic_element_count IS '动态要素数量';
-COMMENT ON COLUMN report_templates.table_element_count IS '表格型动态要素数量';
-
--- ------------------------------------------------------------
--- 2.2 template_dynamic_elements - 模板动态要素定义表
--- ------------------------------------------------------------
-CREATE TABLE IF NOT EXISTS template_dynamic_elements (
-    id BIGSERIAL PRIMARY KEY,
-    template_id BIGINT NOT NULL REFERENCES report_templates(id) ON DELETE CASCADE,
-    element_key VARCHAR(100) NOT NULL,
-    element_name VARCHAR(200) NOT NULL,
-    element_type VARCHAR(50) NOT NULL,
-    namespace VARCHAR(100),
-    field_name VARCHAR(100),
-    table_columns JSONB,
-    required BOOLEAN DEFAULT false,
-    default_value TEXT,
-    description TEXT,
-    sort_order INT DEFAULT 0,
-    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    UNIQUE(template_id, element_key)
-);
-
-COMMENT ON TABLE template_dynamic_elements IS '模板动态要素定义表';
-COMMENT ON COLUMN template_dynamic_elements.element_key IS '占位符key,如 basicInfo.projectCode 或 +review_status';
-COMMENT ON COLUMN template_dynamic_elements.element_type IS '类型: text/paragraph/table';
-COMMENT ON COLUMN template_dynamic_elements.table_columns IS '表格列定义JSON数组';
-
--- ============================================================
--- 3. 报告相关表
--- ============================================================
-
--- ------------------------------------------------------------
--- 3.1 reports - 报告表
--- ------------------------------------------------------------
-CREATE TABLE IF NOT EXISTS reports (
-    id BIGSERIAL PRIMARY KEY,
-    title VARCHAR(500) NOT NULL,
-    report_type VARCHAR(100),
-    template_id BIGINT REFERENCES report_templates(id),
-    project_id BIGINT REFERENCES projects(id),
-    content_html TEXT,
-    status VARCHAR(50) DEFAULT 'draft',
-    source_report_id BIGINT REFERENCES reports(id),
-    copy_time TIMESTAMP,
-    created_by BIGINT REFERENCES users(id),
-    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-
-COMMENT ON TABLE reports IS '报告表';
-COMMENT ON COLUMN reports.status IS '状态: draft/published/archived';
-COMMENT ON COLUMN reports.source_report_id IS '源报告ID(复制来源)';
-
--- ------------------------------------------------------------
--- 3.2 element_values - 动态要素值表
--- ------------------------------------------------------------
-CREATE TABLE IF NOT EXISTS element_values (
-    id BIGSERIAL PRIMARY KEY,
-    report_id BIGINT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
-    element_key VARCHAR(100) NOT NULL,
-    value_text TEXT,
-    value_json JSONB,
-    is_filled BOOLEAN DEFAULT false,
-    fill_source VARCHAR(50),
-    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    UNIQUE(report_id, element_key)
-);
-
-COMMENT ON TABLE element_values IS '动态要素值表';
-COMMENT ON COLUMN element_values.element_key IS '占位符key';
-COMMENT ON COLUMN element_values.value_text IS '文本值(text/paragraph类型)';
-COMMENT ON COLUMN element_values.value_json IS 'JSON值(table类型)';
-COMMENT ON COLUMN element_values.fill_source IS '填充来源: manual/rule/import';
-
--- ------------------------------------------------------------
--- 3.3 element_rules - 动态要素规则表
--- ------------------------------------------------------------
-CREATE TABLE IF NOT EXISTS element_rules (
-    id BIGSERIAL PRIMARY KEY,
-    report_id BIGINT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
-    element_key VARCHAR(100) NOT NULL,
-    rule_name VARCHAR(200),
-    description TEXT,
-    rule_type VARCHAR(50) NOT NULL,
-    last_output_text TEXT,
-    last_output_json JSONB,
-    last_run_status VARCHAR(50),
-    last_run_time TIMESTAMP,
-    last_run_error TEXT,
-    dsl_content TEXT,
-    status VARCHAR(50) DEFAULT 'active',
-    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    UNIQUE(report_id, element_key)
-);
-
-COMMENT ON TABLE element_rules IS '动态要素规则表';
-COMMENT ON COLUMN element_rules.rule_type IS '类型: extraction/generation/calculation';
-COMMENT ON COLUMN element_rules.dsl_content IS 'DSL语法内容';
-
--- ------------------------------------------------------------
--- 3.4 rule_inputs - 规则输入表
--- ------------------------------------------------------------
-CREATE TABLE IF NOT EXISTS rule_inputs (
-    id BIGSERIAL PRIMARY KEY,
-    rule_id BIGINT NOT NULL REFERENCES element_rules(id) ON DELETE CASCADE,
-    input_key VARCHAR(50) NOT NULL,
-    input_name VARCHAR(200) NOT NULL,
-    input_type VARCHAR(50) NOT NULL,
-    ref_attachment_id BIGINT,
-    ref_entity_id BIGINT,
-    ref_element_key VARCHAR(100),
-    fixed_value TEXT,
-    sort_order INT DEFAULT 0,
-    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-
-COMMENT ON TABLE rule_inputs IS '规则输入表';
-COMMENT ON COLUMN rule_inputs.input_type IS '类型: attachment_ref/entity_ref/element_ref/text/number';
-COMMENT ON COLUMN rule_inputs.ref_element_key IS '引用其他动态要素的key';
-
--- ------------------------------------------------------------
--- 3.5 rule_action_config - 规则动作配置表
--- ------------------------------------------------------------
-CREATE TABLE IF NOT EXISTS rule_action_config (
-    id BIGSERIAL PRIMARY KEY,
-    rule_id BIGINT NOT NULL REFERENCES element_rules(id) ON DELETE CASCADE UNIQUE,
-    action_type VARCHAR(50) NOT NULL,
-    config JSONB NOT NULL DEFAULT '{}',
-    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-
-COMMENT ON TABLE rule_action_config IS '规则动作配置表';
-COMMENT ON COLUMN rule_action_config.action_type IS '类型: extract_entity/extract_pattern/llm_generate/extract_table';
-
--- ============================================================
--- 4. 附件相关表
--- ============================================================
-
--- ------------------------------------------------------------
--- 4.1 report_attachments - 报告附件表
--- ------------------------------------------------------------
-CREATE TABLE IF NOT EXISTS report_attachments (
-    id BIGSERIAL PRIMARY KEY,
-    report_id BIGINT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
-    display_name VARCHAR(200) NOT NULL,
-    file_name VARCHAR(500) NOT NULL,
-    file_path VARCHAR(1000) NOT NULL,
-    file_type VARCHAR(50),
-    file_size BIGINT,
-    parse_status VARCHAR(50) DEFAULT 'pending',
-    parsed_text TEXT,
-    entity_count INT DEFAULT 0,
-    parse_error TEXT,
-    parsed_at TIMESTAMP,
-    sort_order INT DEFAULT 0,
-    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-
-COMMENT ON TABLE report_attachments IS '报告附件表';
-COMMENT ON COLUMN report_attachments.parse_status IS '解析状态: pending/processing/completed/failed';
-
--- ------------------------------------------------------------
--- 4.2 attachment_entities - 附件实体表
--- ------------------------------------------------------------
-CREATE TABLE IF NOT EXISTS attachment_entities (
-    id BIGSERIAL PRIMARY KEY,
-    attachment_id BIGINT NOT NULL REFERENCES report_attachments(id) ON DELETE CASCADE,
-    entity_type VARCHAR(50) NOT NULL,
-    entity_text VARCHAR(500) NOT NULL,
-    business_label VARCHAR(200),
-    confidence DECIMAL(5,4) DEFAULT 1.0,
-    occurrence_count INT DEFAULT 1,
-    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-
-COMMENT ON TABLE attachment_entities IS '附件实体表';
-COMMENT ON COLUMN attachment_entities.entity_type IS '类型: ORG/PERSON/DATE/NUMBER/LOCATION';
-COMMENT ON COLUMN attachment_entities.business_label IS '业务标签';
-
--- ============================================================
--- 5. 其他表
--- ============================================================
-
--- ------------------------------------------------------------
--- 5.1 report_copy_records - 报告复制记录表
--- ------------------------------------------------------------
-CREATE TABLE IF NOT EXISTS report_copy_records (
-    id BIGSERIAL PRIMARY KEY,
-    source_report_id BIGINT NOT NULL REFERENCES reports(id),
-    target_report_id BIGINT NOT NULL REFERENCES reports(id),
-    copied_by BIGINT REFERENCES users(id),
-    copy_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    elements_copied INT DEFAULT 0,
-    rules_copied INT DEFAULT 0,
-    notes TEXT
-);
-
-COMMENT ON TABLE report_copy_records IS '报告复制记录表';
-
--- ============================================================
--- 6. 视图
--- ============================================================
-
--- ------------------------------------------------------------
--- 6.1 v_report_dynamic_elements - 报告动态要素完整视图
--- ------------------------------------------------------------
-CREATE OR REPLACE VIEW v_report_dynamic_elements AS
-SELECT 
-    r.id AS report_id,
-    r.title AS report_title,
-    te.element_key,
-    te.element_name,
-    te.element_type,
-    te.namespace,
-    te.field_name,
-    te.table_columns,
-    te.required,
-    ev.value_text,
-    ev.value_json,
-    ev.is_filled,
-    ev.fill_source,
-    er.id AS rule_id,
-    er.rule_type,
-    er.last_run_status,
-    er.last_run_time,
-    CASE WHEN er.id IS NOT NULL THEN true ELSE false END AS has_rule
-FROM reports r
-JOIN report_templates rt ON rt.id = r.template_id
-JOIN template_dynamic_elements te ON te.template_id = rt.id
-LEFT JOIN element_values ev ON ev.report_id = r.id AND ev.element_key = te.element_key
-LEFT JOIN element_rules er ON er.report_id = r.id AND er.element_key = te.element_key;
-
-COMMENT ON VIEW v_report_dynamic_elements IS '报告动态要素完整视图';
-
--- ------------------------------------------------------------
--- 6.2 v_rule_full_config - 规则完整配置视图
--- ------------------------------------------------------------
-CREATE OR REPLACE VIEW v_rule_full_config AS
-SELECT 
-    er.id AS rule_id,
-    er.report_id,
-    er.element_key,
-    er.rule_name,
-    er.rule_type,
-    er.last_output_text,
-    er.last_output_json,
-    er.last_run_status,
-    er.dsl_content,
-    er.status,
-    ac.action_type,
-    ac.config AS action_config,
-    (
-        SELECT json_agg(json_build_object(
-            'inputKey', ri.input_key,
-            'inputName', ri.input_name,
-            'inputType', ri.input_type,
-            'refAttachmentId', ri.ref_attachment_id,
-            'refEntityId', ri.ref_entity_id,
-            'refElementKey', ri.ref_element_key,
-            'fixedValue', ri.fixed_value
-        ) ORDER BY ri.sort_order)
-        FROM rule_inputs ri
-        WHERE ri.rule_id = er.id
-    ) AS inputs
-FROM element_rules er
-LEFT JOIN rule_action_config ac ON ac.rule_id = er.id;
-
-COMMENT ON VIEW v_rule_full_config IS '规则完整配置视图';
-
--- ------------------------------------------------------------
--- 6.3 v_report_summary - 报告摘要视图
--- ------------------------------------------------------------
-CREATE OR REPLACE VIEW v_report_summary AS
-SELECT 
-    r.id,
-    r.title,
-    r.report_type,
-    r.status,
-    r.created_at,
-    r.updated_at,
-    rt.name AS template_name,
-    p.name AS project_name,
-    u.real_name AS created_by_name,
-    (SELECT COUNT(*) FROM element_values ev WHERE ev.report_id = r.id AND ev.is_filled = true) AS filled_count,
-    (SELECT COUNT(*) FROM template_dynamic_elements te WHERE te.template_id = r.template_id) AS total_elements,
-    (SELECT COUNT(*) FROM report_attachments ra WHERE ra.report_id = r.id) AS attachment_count
-FROM reports r
-LEFT JOIN report_templates rt ON rt.id = r.template_id
-LEFT JOIN projects p ON p.id = r.project_id
-LEFT JOIN users u ON u.id = r.created_by;
-
-COMMENT ON VIEW v_report_summary IS '报告摘要视图';
-
--- ============================================================
--- 7. 索引
--- ============================================================
-
--- users
-CREATE INDEX IF NOT EXISTS idx_users_username ON users(username);
-CREATE INDEX IF NOT EXISTS idx_users_status ON users(status);
-
--- projects
-CREATE INDEX IF NOT EXISTS idx_projects_owner ON projects(owner_id);
-CREATE INDEX IF NOT EXISTS idx_projects_status ON projects(status);
-
--- report_templates
-CREATE INDEX IF NOT EXISTS idx_templates_category ON report_templates(category);
-CREATE INDEX IF NOT EXISTS idx_templates_status ON report_templates(status);
-
--- template_dynamic_elements
-CREATE INDEX IF NOT EXISTS idx_template_elements_template ON template_dynamic_elements(template_id);
-CREATE INDEX IF NOT EXISTS idx_template_elements_type ON template_dynamic_elements(element_type);
-CREATE INDEX IF NOT EXISTS idx_template_elements_namespace ON template_dynamic_elements(namespace);
-
--- reports
-CREATE INDEX IF NOT EXISTS idx_reports_template ON reports(template_id);
-CREATE INDEX IF NOT EXISTS idx_reports_project ON reports(project_id);
-CREATE INDEX IF NOT EXISTS idx_reports_status ON reports(status);
-CREATE INDEX IF NOT EXISTS idx_reports_created_by ON reports(created_by);
-CREATE INDEX IF NOT EXISTS idx_reports_source ON reports(source_report_id);
-
--- element_values
-CREATE INDEX IF NOT EXISTS idx_element_values_report ON element_values(report_id);
-CREATE INDEX IF NOT EXISTS idx_element_values_key ON element_values(element_key);
-CREATE INDEX IF NOT EXISTS idx_element_values_filled ON element_values(is_filled);
-
--- element_rules
-CREATE INDEX IF NOT EXISTS idx_element_rules_report ON element_rules(report_id);
-CREATE INDEX IF NOT EXISTS idx_element_rules_key ON element_rules(element_key);
-CREATE INDEX IF NOT EXISTS idx_element_rules_status ON element_rules(status);
-
--- rule_inputs
-CREATE INDEX IF NOT EXISTS idx_rule_inputs_rule ON rule_inputs(rule_id);
-
--- report_attachments
-CREATE INDEX IF NOT EXISTS idx_attachments_report ON report_attachments(report_id);
-CREATE INDEX IF NOT EXISTS idx_attachments_parse_status ON report_attachments(parse_status);
-
--- attachment_entities
-CREATE INDEX IF NOT EXISTS idx_attachment_entities_attachment ON attachment_entities(attachment_id);
-CREATE INDEX IF NOT EXISTS idx_attachment_entities_type ON attachment_entities(entity_type);
-CREATE INDEX IF NOT EXISTS idx_attachment_entities_label ON attachment_entities(business_label);
-
--- report_copy_records
-CREATE INDEX IF NOT EXISTS idx_copy_records_source ON report_copy_records(source_report_id);
-CREATE INDEX IF NOT EXISTS idx_copy_records_target ON report_copy_records(target_report_id);
-
--- ============================================================
--- 8. Mock 数据
--- ============================================================
-
--- ------------------------------------------------------------
--- 8.1 用户数据
--- ------------------------------------------------------------
-INSERT INTO users (id, username, password_hash, real_name, email, status)
-VALUES (1, 'admin', '$2a$10$xxxxx', '管理员', 'admin@lingyue.com', 'active')
-ON CONFLICT (id) DO NOTHING;
-
-SELECT setval('users_id_seq', GREATEST((SELECT MAX(id) FROM users), 1));
-
--- ------------------------------------------------------------
--- 8.2 项目数据
--- ------------------------------------------------------------
-INSERT INTO projects (id, name, code, description, owner_id, created_by)
-VALUES (1, '电力安全评审项目', 'DLAQ-2026', '电力建设企业安全生产标准化评审项目', 1, 1)
-ON CONFLICT (id) DO NOTHING;
-
-SELECT setval('projects_id_seq', GREATEST((SELECT MAX(id) FROM projects), 1));
-
--- ------------------------------------------------------------
--- 8.3 模板数据
--- ------------------------------------------------------------
-INSERT INTO report_templates (id, name, category, description, dynamic_element_count, table_element_count, status, created_by)
-VALUES (1, '电力安全生产标准化复审报告', '安全评审', '电力建设企业安全生产标准化达标评级评审报告模板', 45, 4, 'active', 1)
-ON CONFLICT (id) DO NOTHING;
-
-SELECT setval('report_templates_id_seq', GREATEST((SELECT MAX(id) FROM report_templates), 1));
-
--- ------------------------------------------------------------
--- 8.4 模板动态要素数据
--- ------------------------------------------------------------
-
--- 文本型动态要素
-INSERT INTO template_dynamic_elements (id, template_id, element_key, element_name, element_type, namespace, field_name, required, sort_order)
-VALUES 
-(1, 1, 'basicInfo.projectCode', '项目编号', 'text', 'basicInfo', 'projectCode', true, 1),
-(2, 1, 'project.reviewObject', '评审对象', 'text', 'project', 'reviewObject', true, 2),
-(3, 1, 'project.reviewObjectAlias', '评审对象简称', 'text', 'project', 'reviewObjectAlias', true, 3),
-(4, 1, 'basicInfo.requestLevel', '申请级别', 'text', 'basicInfo', 'requestLevel', true, 4),
-(5, 1, 'project.resultScore', '评审得分', 'text', 'project', 'resultScore', true, 5),
-(6, 1, 'project.resultLevel', '评审级别', 'text', 'project', 'resultLevel', true, 6),
-(7, 1, 'project.workStartAt', '评审开始日期', 'text', 'project', 'workStartAt', true, 7),
-(8, 1, 'project.workEndAt', '评审结束日期', 'text', 'project', 'workEndAt', true, 8),
-(9, 1, 'project.createdAt', '报告日期', 'text', 'project', 'createdAt', true, 9),
-(10, 1, 'basicInfo.applyAt', '申请日期', 'text', 'basicInfo', 'applyAt', false, 10),
-(11, 1, 'project.reviewPeriod', '评审期', 'text', 'project', 'reviewPeriod', false, 11),
-(12, 1, 'basicInfo.reviewObjectCertificateGetAt', '证书获取日期', 'text', 'basicInfo', 'reviewObjectCertificateGetAt', false, 12),
-(13, 1, 'basicInfo.reviewObjectCertificate2GetAt', '二次证书获取日期', 'text', 'basicInfo', 'reviewObjectCertificate2GetAt', false, 13)
-ON CONFLICT (template_id, element_key) DO NOTHING;
-
--- 段落型动态要素
-INSERT INTO template_dynamic_elements (id, template_id, element_key, element_name, element_type, namespace, field_name, required, sort_order)
-VALUES 
-(20, 1, 'project.reviewObjectSummary', '评审对象概述', 'paragraph', 'project', 'reviewObjectSummary', true, 20),
-(21, 1, 'project.reviewObjectDescription', '企业简介', 'paragraph', 'project', 'reviewObjectDescription', true, 21),
-(22, 1, 'project.target', '目标', 'paragraph', 'project', 'target', true, 22),
-(23, 1, 'project.duty', '组织机构和职责', 'paragraph', 'project', 'duty', true, 23),
-(24, 1, 'project.fullParticipation', '全员参与', 'paragraph', 'project', 'fullParticipation', false, 24),
-(25, 1, 'project.safetyInvestment', '安全生产投入', 'paragraph', 'project', 'safetyInvestment', false, 25),
-(26, 1, 'project.safetyCulture', '安全文化建设', 'paragraph', 'project', 'safetyCulture', false, 26),
-(27, 1, 'project.systematicManagement', '制度化管理', 'paragraph', 'project', 'systematicManagement', false, 27),
-(28, 1, 'project.employeeTraining', '人员教育培训', 'paragraph', 'project', 'employeeTraining', false, 28),
-(29, 1, 'project.assetManagement', '设备设施管理', 'paragraph', 'project', 'assetManagement', false, 29),
-(30, 1, 'project.jobSafety', '作业安全', 'paragraph', 'project', 'jobSafety', false, 30),
-(31, 1, 'project.safetyStandardizationStatus', '安全生产标准化建设和持续运行情况', 'paragraph', 'project', 'safetyStandardizationStatus', false, 31)
-ON CONFLICT (template_id, element_key) DO NOTHING;
-
--- 表格型动态要素
-INSERT INTO template_dynamic_elements (id, template_id, element_key, element_name, element_type, namespace, field_name, required, table_columns, sort_order)
-VALUES 
-(40, 1, '+review_status', '现场复审情况表', 'table', NULL, 'review_status', true, '["序号", "项目", "存在的问题", "扣分标准"]', 40),
-(41, 1, '+target_responsibility', '目标职责评审表', 'table', NULL, 'target_responsibility', true, '["序号", "项目", "存在的问题", "扣分标准"]', 41),
-(42, 1, '+institutionalized_management', '制度化管理评审表', 'table', NULL, 'institutionalized_management', true, '["序号", "项目", "存在的问题", "扣分标准"]', 42),
-(43, 1, '+education_and_training', '教育培训评审表', 'table', NULL, 'education_and_training', true, '["序号", "项目", "存在的问题", "扣分标准"]', 43)
-ON CONFLICT (template_id, element_key) DO NOTHING;
-
-SELECT setval('template_dynamic_elements_id_seq', GREATEST((SELECT MAX(id) FROM template_dynamic_elements), 43));
-
--- ------------------------------------------------------------
--- 8.5 报告数据
--- ------------------------------------------------------------
-
--- 成都院复审报告(原始报告)
-INSERT INTO reports (id, title, report_type, status, template_id, project_id, created_by, created_at)
-VALUES (1001, '成都院复审报告', '电力安全生产标准化复审报告', 'draft', 1, 1, 1, '2026-02-10 10:30:00')
-ON CONFLICT (id) DO NOTHING;
-
--- 华东院复审报告(从成都院复制)
-INSERT INTO reports (id, title, report_type, status, template_id, project_id, created_by, source_report_id, copy_time, created_at)
-VALUES (1002, '华东院复审报告', '电力安全生产标准化复审报告', 'draft', 1, 1, 1, 1001, '2026-02-11 14:00:00', '2026-02-11 14:00:00')
-ON CONFLICT (id) DO NOTHING;
-
-SELECT setval('reports_id_seq', GREATEST((SELECT MAX(id) FROM reports), 1002));
-
--- ------------------------------------------------------------
--- 8.6 附件数据
--- ------------------------------------------------------------
-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)
-VALUES 
-(1, 1001, '01-复审通知', '复审通知.docx', '/uploads/2026/02/复审通知.docx', 'docx', 102400, 'completed', 15, '2026-02-10 10:35:00', 1),
-(2, 1001, '02-评审报告原文', '评审报告.pdf', '/uploads/2026/02/评审报告.pdf', 'pdf', 512000, 'completed', 25, '2026-02-10 10:40:00', 2),
-(3, 1001, '03-安全标准化达标证书', '达标证书.pdf', '/uploads/2026/02/达标证书.pdf', 'pdf', 256000, 'completed', 8, '2026-02-10 10:45:00', 3)
-ON CONFLICT (id) DO NOTHING;
-
-SELECT setval('report_attachments_id_seq', GREATEST((SELECT MAX(id) FROM report_attachments), 3));
-
--- ------------------------------------------------------------
--- 8.7 附件实体数据
--- ------------------------------------------------------------
-INSERT INTO attachment_entities (id, attachment_id, entity_type, entity_text, business_label, confidence, occurrence_count)
-VALUES 
--- 复审通知中的实体
-(1, 1, 'ORG', '中国电建集团成都勘测设计研究院有限公司', '评审对象', 0.95, 15),
-(2, 1, 'ORG', '湖北安源安全环保科技有限公司', '评审单位', 0.92, 8),
-(3, 1, 'PERSON', '何彦锋', '董事长', 0.88, 3),
-(4, 1, 'PERSON', '张世殊', '总经理', 0.88, 2),
-(5, 1, 'DATE', '2024年7月13日', '评审开始日期', 0.99, 2),
-(6, 1, 'DATE', '2024年10月17日', '评审结束日期', 0.99, 2),
-(7, 1, 'DATE', '2024年7月8日', '申请日期', 0.99, 1),
-(8, 1, 'DATE', '2019年12月9日', '证书获取日期', 0.99, 1),
-(9, 1, 'DATE', '2015年4月7日', '二次证书获取日期', 0.99, 1),
--- 评审报告中的实体
-(10, 2, 'NUMBER', '93.33', '评审得分', 0.99, 3),
-(11, 2, 'NUMBER', '50', '注册资本(亿)', 0.95, 2),
-(12, 2, 'NUMBER', '2887', '员工人数', 0.95, 1),
-(13, 2, 'LOCATION', '成都市温江区政和街8号', '公司地址', 0.90, 1),
--- 达标证书中的实体
-(14, 3, 'ORG', '中国电建集团成都勘测设计研究院有限公司', NULL, 0.95, 2),
-(15, 3, 'DATE', '2019年12月9日', '发证日期', 0.99, 1)
-ON CONFLICT (id) DO NOTHING;
-
-SELECT setval('attachment_entities_id_seq', GREATEST((SELECT MAX(id) FROM attachment_entities), 15));
-
--- ------------------------------------------------------------
--- 8.8 动态要素值数据(成都院)
--- ------------------------------------------------------------
-
--- 文本型
-INSERT INTO element_values (id, report_id, element_key, value_text, is_filled, fill_source)
-VALUES 
-(1, 1001, 'basicInfo.projectCode', 'BZ-0092-2024', true, 'rule'),
-(2, 1001, 'project.reviewObject', '中国电建集团成都勘测设计研究院有限公司', true, 'rule'),
-(3, 1001, 'project.reviewObjectAlias', '成都院', true, 'rule'),
-(4, 1001, 'basicInfo.requestLevel', '一级', true, 'rule'),
-(5, 1001, 'project.resultScore', '93.33', true, 'rule'),
-(6, 1001, 'project.resultLevel', '一级', true, 'rule'),
-(7, 1001, 'project.workStartAt', '2024年7月13日', true, 'rule'),
-(8, 1001, 'project.workEndAt', '2024年10月17日', true, 'rule'),
-(9, 1001, 'project.createdAt', '2026年02月', true, 'manual'),
-(10, 1001, 'basicInfo.applyAt', '2024年7月8日', true, 'rule'),
-(11, 1001, 'project.reviewPeriod', '2023年7月8日-2024年7月8日', true, 'rule'),
-(12, 1001, 'basicInfo.reviewObjectCertificateGetAt', '2019年12月9日', true, 'rule'),
-(13, 1001, 'basicInfo.reviewObjectCertificate2GetAt', '2015年4月7日', true, 'rule')
-ON CONFLICT (report_id, element_key) DO NOTHING;
-
--- 段落型
-INSERT INTO element_values (id, report_id, element_key, value_text, is_filled, fill_source)
-VALUES 
-(20, 1001, 'project.reviewObjectSummary', '中国电建集团成都勘测设计研究院有限公司(简称:成都院)成立于2005年,是世界500强企业中国电力建设集团的核心成员企业。作为国家级高新技术企业,成都院以水利水电、新能源和基础设施为核心业务,在水电工程领域承担了金沙江、大渡河、雅砻江等重大河流的规划勘测设计工作,创造了多项"中国第一"和"世界之最"。成都院拥有注册资本50亿元人民币,专业技术人员规模近3000人,累计获得4443项专利和100项行业资质认证,展现了雄厚的技术研发实力。', true, 'rule'),
-(21, 1001, 'project.reviewObjectDescription', '中国电建集团成都勘测设计研究院有限公司(简称:成都院)是中国电力建设集团核心成员企业,作为国内领先的清洁能源工程服务商,成都院在水利水电、新能源及基础设施领域具有突出优势。成都院深度参与了国家西部大开发和"西电东送"战略,承担了包括两河口水电站、杨房沟水电站、乌东德水电站等重大工程的勘测设计工作,其中两河口水电站拥有世界最高土石坝的纪录。', true, 'rule'),
-(22, 1001, 'project.target', '成都院制定并发布《QHSE"十四五"规划》(安质〔2023〕1号),明确了总体安全生产目标,包括7项安全管理及事故控制目标,总体目标为公司"十四五"规划的子规划,安全生产与职业健康工作目标纳入总体生产经营目标。成都院发布《关于印发<成都院2024年安全生产与职业健康、能源节约与生态环境保护工作目标和重点>的通知》(蓉设安质〔2024〕18号),明确了2024年安全生产与职业健康目标,包括9项安全管理目标和10项事故控制目标。', true, 'rule')
-ON CONFLICT (report_id, element_key) DO NOTHING;
-
--- 表格型
-INSERT INTO element_values (id, report_id, element_key, value_json, is_filled, fill_source)
-VALUES 
-(40, 1001, '+target_responsibility', '[
-  {"序号": 1, "项目": "5.1.1.1 目标制定", "存在的问题": "大邑地勘项目部制定的2024年度安全生产目标,缺少设备设施方面的事故控制目标。", "扣分标准": "依据评估标准②:目标内容有缺失,扣1分/项,共扣1分。"},
-  {"序号": 2, "项目": "5.1.1.2 目标落实", "存在的问题": "双江口设计项目部项目经理与各专业部门负责人签订的《2024年度安全责任书》中,目标分解不明确,不满足要求。", "扣分标准": "依据评估标准②:签订责任书、目标分解不满足要求,扣1分/单位,共扣1分。"},
-  {"序号": 3, "项目": "5.1.1.3 目标考核", "存在的问题": "云阳监理项目未对二季度安全生产目标及工作计划完成情况进行考核、监督检查。", "扣分标准": "依据评估标准①:未对目标的完成情况进行评估和考核,扣2分/次,共扣2分。"}
-]', true, 'rule'),
-(41, 1001, '+institutionalized_management', '[
-  {"序号": 1, "项目": "5.2.2 规章制度", "存在的问题": "勘测设计分公司未按成都院《安全风险管控管理办法》的要求制定安全风险管控制度。", "扣分标准": "依据评估标准①:制度不全,扣2分/项,共扣2分"},
-  {"序号": 2, "项目": "5.2.3 操作规程", "存在的问题": "云阳监理项目1#引水洞汽车吊和下库进出水口挖掘机未张贴安全操作规程。", "扣分标准": "依据评估标准③:设备未悬挂安全操作规程,扣1分/处,共扣2分。"}
-]', true, 'rule'),
-(42, 1001, '+education_and_training', '[
-  {"序号": 1, "项目": "5.3.1 教育培训管理", "存在的问题": "大邑地勘项目部《2024年安全生产教育和培训计划》中,缺少有限空间作业等专项培训内容。", "扣分标准": "依据评估标准③:培训计划未包含职业健康、应急管理及上级要求的培训等内容,内容不全,扣2分。"}
-]', true, 'rule')
-ON CONFLICT (report_id, element_key) DO NOTHING;
-
-SELECT setval('element_values_id_seq', GREATEST((SELECT MAX(id) FROM element_values), 42));
-
--- ------------------------------------------------------------
--- 8.9 动态要素规则数据(成都院)
--- ------------------------------------------------------------
-INSERT INTO element_rules (id, report_id, element_key, rule_name, description, rule_type, last_output_text, last_run_status, last_run_time, status)
-VALUES 
-(1, 1001, 'basicInfo.projectCode', '项目编号提取', '从复审通知中提取项目编号', 'extraction', 'BZ-0092-2024', 'success', '2026-02-11 14:00:00', 'active'),
-(2, 1001, 'project.reviewObject', '评审对象提取', '从复审通知中提取评审对象', 'extraction', '中国电建集团成都勘测设计研究院有限公司', 'success', '2026-02-11 14:01:00', 'active'),
-(3, 1001, 'project.reviewObjectAlias', '评审对象简称提取', '从复审通知中提取评审对象简称', 'extraction', '成都院', 'success', '2026-02-11 14:02:00', 'active'),
-(4, 1001, 'project.resultScore', '评审得分提取', '从评审报告中提取评审得分', 'extraction', '93.33', 'success', '2026-02-11 14:03:00', 'active'),
-(5, 1001, 'project.workStartAt', '评审开始日期提取', '从复审通知中提取评审开始日期', 'extraction', '2024年7月13日', 'success', '2026-02-11 14:04:00', 'active'),
-(6, 1001, 'project.workEndAt', '评审结束日期提取', '从复审通知中提取评审结束日期', 'extraction', '2024年10月17日', 'success', '2026-02-11 14:05:00', 'active'),
-(7, 1001, 'project.reviewObjectSummary', '评审对象概述生成', '基于企业简介生成评审对象概述', 'generation', NULL, 'success', '2026-02-11 14:06:00', 'active'),
-(8, 1001, 'project.reviewObjectDescription', '企业简介生成', '基于附件内容生成企业简介', 'generation', NULL, 'success', '2026-02-11 14:07:00', 'active'),
-(9, 1001, 'project.target', '目标内容生成', '基于附件内容生成目标描述', 'generation', NULL, 'success', '2026-02-11 14:08:00', 'active'),
-(10, 1001, '+target_responsibility', '目标职责评审表提取', '从评审报告中提取目标职责评审表', 'extraction', NULL, 'success', '2026-02-11 14:09:00', 'active')
-ON CONFLICT (report_id, element_key) DO NOTHING;
-
-SELECT setval('element_rules_id_seq', GREATEST((SELECT MAX(id) FROM element_rules), 10));
-
--- ------------------------------------------------------------
--- 8.10 规则输入数据
--- ------------------------------------------------------------
-INSERT INTO rule_inputs (id, rule_id, input_key, input_name, input_type, ref_attachment_id, ref_entity_id, fixed_value, sort_order)
-VALUES 
-(1, 1, 'input1', '复审通知', 'attachment_ref', 1, NULL, NULL, 1),
-(2, 2, 'input1', '复审通知', 'attachment_ref', 1, NULL, NULL, 1),
-(3, 3, 'input1', '评审对象', 'entity_ref', NULL, 1, NULL, 1),
-(4, 4, 'input1', '评审报告', 'attachment_ref', 2, NULL, NULL, 1),
-(5, 5, 'input1', '复审通知', 'attachment_ref', 1, NULL, NULL, 1),
-(6, 6, 'input1', '复审通知', 'attachment_ref', 1, NULL, NULL, 1),
-(7, 7, 'input1', '评审报告', 'attachment_ref', 2, NULL, NULL, 1),
-(8, 7, 'prompt', '提示词', 'text', NULL, NULL, '请根据以下企业信息,生成一段简洁的企业概述。', 2),
-(9, 8, 'input1', '评审报告', 'attachment_ref', 2, NULL, NULL, 1),
-(10, 8, 'prompt', '提示词', 'text', NULL, NULL, '请根据以下内容,生成详细的企业简介。', 2),
-(11, 9, 'input1', '评审报告', 'attachment_ref', 2, NULL, NULL, 1),
-(12, 9, 'prompt', '提示词', 'text', NULL, NULL, '请根据以下内容,提取并整理企业的安全生产目标相关内容。', 2),
-(13, 10, 'input1', '评审报告', 'attachment_ref', 2, NULL, NULL, 1)
-ON CONFLICT (id) DO NOTHING;
-
-SELECT setval('rule_inputs_id_seq', GREATEST((SELECT MAX(id) FROM rule_inputs), 13));
-
--- ------------------------------------------------------------
--- 8.11 规则动作配置数据
--- ------------------------------------------------------------
-INSERT INTO rule_action_config (id, rule_id, action_type, config)
-VALUES 
-(1, 1, 'extract_pattern', '{"pattern": "项目编号[::]\\s*(\\S+)", "group": 1}'),
-(2, 2, 'extract_entity', '{"entityType": "ORG", "businessLabel": "评审对象", "selectStrategy": "first"}'),
-(3, 3, 'extract_pattern', '{"pattern": "(简称[::](.+?))", "group": 1}'),
-(4, 4, 'extract_entity', '{"entityType": "NUMBER", "businessLabel": "评审得分", "selectStrategy": "first"}'),
-(5, 5, 'extract_entity', '{"entityType": "DATE", "businessLabel": "评审开始日期", "selectStrategy": "first"}'),
-(6, 6, 'extract_entity', '{"entityType": "DATE", "businessLabel": "评审结束日期", "selectStrategy": "first"}'),
-(7, 7, 'llm_generate', '{"model": "qwen-max", "temperature": 0.7, "maxTokens": 1000}'),
-(8, 8, 'llm_generate', '{"model": "qwen-max", "temperature": 0.7, "maxTokens": 2000}'),
-(9, 9, 'llm_generate', '{"model": "qwen-max", "temperature": 0.7, "maxTokens": 2000}'),
-(10, 10, 'extract_table', '{"tablePattern": "序号.*项目.*问题", "columns": ["序号", "项目", "存在的问题", "扣分标准"]}')
-ON CONFLICT (rule_id) DO NOTHING;
-
-SELECT setval('rule_action_config_id_seq', GREATEST((SELECT MAX(id) FROM rule_action_config), 10));
-
--- ------------------------------------------------------------
--- 8.12 报告复制记录
--- ------------------------------------------------------------
-INSERT INTO report_copy_records (id, source_report_id, target_report_id, copied_by, copy_time, elements_copied, rules_copied, notes)
-VALUES (1, 1001, 1002, 1, '2026-02-11 14:00:00', 45, 10, '从成都院复制到华东院')
-ON CONFLICT (id) DO NOTHING;
-
-SELECT setval('report_copy_records_id_seq', GREATEST((SELECT MAX(id) FROM report_copy_records), 1));
-
--- ============================================================
--- 完成
--- ============================================================
-SELECT '灵越智报 2.0 数据库完整脚本执行完成' AS result;

+ 0 - 682
database/init_0211_increment.sql

@@ -1,682 +0,0 @@
--- ============================================================
--- 灵越智报 2.0 数据库增量脚本
--- 基于 2026-02-11 会议讨论设计(全新版本)
--- 包含模板系统、动态要素类型、真实数据示例
--- 
--- 核心概念:
--- - 静态要素:模板中固定不变的文本
--- - 动态要素:需要通过规则计算填充的内容
--- - 占位符:动态要素在模板中的标识符,格式为 {{namespace.field}} 或 {{+tableName}}
--- ============================================================
-
--- ============================================================
--- 1. 创建模板相关表
--- ============================================================
-
--- ------------------------------------------------------------
--- 1.1 report_templates - 报告模板表
--- ------------------------------------------------------------
-CREATE TABLE IF NOT EXISTS report_templates (
-    id BIGSERIAL PRIMARY KEY,
-    
-    -- 模板信息
-    name VARCHAR(200) NOT NULL,
-    category VARCHAR(100),
-    description TEXT,
-    
-    -- 模板内容
-    content_html TEXT,
-    content_json JSONB,
-    
-    -- 统计
-    dynamic_element_count INT DEFAULT 0,
-    table_element_count INT DEFAULT 0,
-    
-    -- 状态
-    status VARCHAR(50) DEFAULT 'active',
-    
-    -- 元数据
-    created_by BIGINT REFERENCES users(id),
-    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-
-COMMENT ON TABLE report_templates IS '报告模板表';
-COMMENT ON COLUMN report_templates.name IS '模板名称';
-COMMENT ON COLUMN report_templates.category IS '模板分类';
-COMMENT ON COLUMN report_templates.content_html IS '模板 HTML 内容';
-COMMENT ON COLUMN report_templates.dynamic_element_count IS '动态要素数量';
-COMMENT ON COLUMN report_templates.table_element_count IS '表格型动态要素数量';
-
--- ------------------------------------------------------------
--- 1.2 template_dynamic_elements - 模板动态要素定义表
--- 占位符是动态要素在模板中的标识符
--- ------------------------------------------------------------
-CREATE TABLE IF NOT EXISTS template_dynamic_elements (
-    id BIGSERIAL PRIMARY KEY,
-    template_id BIGINT NOT NULL REFERENCES report_templates(id) ON DELETE CASCADE,
-    
-    -- 动态要素标识(占位符)
-    element_key VARCHAR(100) NOT NULL,          -- 动态要素的占位符 key,如 basicInfo.projectCode 或 +review_status
-    element_name VARCHAR(200) NOT NULL,         -- 动态要素显示名称
-    
-    -- 动态要素类型: text/paragraph/table
-    element_type VARCHAR(50) NOT NULL,
-    
-    -- 命名空间
-    namespace VARCHAR(100),
-    field_name VARCHAR(100),
-    
-    -- 表格配置
-    table_columns JSONB,
-    
-    -- 其他配置
-    required BOOLEAN DEFAULT false,
-    default_value TEXT,
-    description TEXT,
-    
-    -- 排序
-    sort_order INT DEFAULT 0,
-    
-    -- 元数据
-    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    
-    UNIQUE(template_id, element_key)
-);
-
-COMMENT ON TABLE template_dynamic_elements IS '模板动态要素定义表';
-COMMENT ON COLUMN template_dynamic_elements.element_key IS '动态要素的占位符 key,如 basicInfo.projectCode';
-COMMENT ON COLUMN template_dynamic_elements.element_type IS '动态要素类型:text(文本)/paragraph(段落)/table(表格)';
-COMMENT ON COLUMN template_dynamic_elements.namespace IS '命名空间';
-COMMENT ON COLUMN template_dynamic_elements.table_columns IS '表格列定义 JSON 数组';
-
--- ============================================================
--- 2. 修改现有表
--- ============================================================
-
--- reports 表新增字段
-ALTER TABLE reports ADD COLUMN IF NOT EXISTS template_id BIGINT REFERENCES report_templates(id);
-ALTER TABLE reports ADD COLUMN IF NOT EXISTS source_report_id BIGINT REFERENCES reports(id);
-ALTER TABLE reports ADD COLUMN IF NOT EXISTS copy_time TIMESTAMP;
-
-COMMENT ON COLUMN reports.template_id IS '关联的模板 ID';
-COMMENT ON COLUMN reports.source_report_id IS '源报告 ID,用于报告复制';
-COMMENT ON COLUMN reports.copy_time IS '复制时间';
-
--- ============================================================
--- 3. 创建动态要素相关表
--- ============================================================
-
--- ------------------------------------------------------------
--- 3.1 element_values - 动态要素值表
--- ------------------------------------------------------------
-CREATE TABLE IF NOT EXISTS element_values (
-    id BIGSERIAL PRIMARY KEY,
-    report_id BIGINT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
-    
-    -- 动态要素标识
-    element_key VARCHAR(100) NOT NULL,          -- 动态要素的占位符 key
-    
-    -- 值
-    value_text TEXT,
-    value_json JSONB,
-    
-    -- 状态
-    is_filled BOOLEAN DEFAULT false,
-    fill_source VARCHAR(50),
-    
-    -- 元数据
-    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    
-    UNIQUE(report_id, element_key)
-);
-
-COMMENT ON TABLE element_values IS '动态要素值表';
-COMMENT ON COLUMN element_values.element_key IS '动态要素的占位符 key';
-COMMENT ON COLUMN element_values.value_text IS '文本值(text/paragraph 类型)';
-COMMENT ON COLUMN element_values.value_json IS 'JSON 值(table 类型)';
-COMMENT ON COLUMN element_values.fill_source IS '填充来源:manual/rule/import';
-
--- ------------------------------------------------------------
--- 3.2 element_rules - 动态要素规则表
--- ------------------------------------------------------------
-CREATE TABLE IF NOT EXISTS element_rules (
-    id BIGSERIAL PRIMARY KEY,
-    report_id BIGINT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
-    
-    -- 动态要素标识
-    element_key VARCHAR(100) NOT NULL,          -- 动态要素的占位符 key
-    
-    -- 规则信息
-    rule_name VARCHAR(200),
-    description TEXT,
-    rule_type VARCHAR(50) NOT NULL,
-    
-    -- 执行结果
-    last_output_text TEXT,
-    last_output_json JSONB,
-    last_run_status VARCHAR(50),
-    last_run_time TIMESTAMP,
-    last_run_error TEXT,
-    
-    -- DSL 存储
-    dsl_content TEXT,
-    
-    -- 状态
-    status VARCHAR(50) DEFAULT 'active',
-    
-    -- 元数据
-    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    
-    UNIQUE(report_id, element_key)
-);
-
-COMMENT ON TABLE element_rules IS '动态要素规则表';
-COMMENT ON COLUMN element_rules.element_key IS '动态要素的占位符 key';
-COMMENT ON COLUMN element_rules.rule_type IS '规则类型:extraction/generation/calculation/condition';
-COMMENT ON COLUMN element_rules.dsl_content IS 'DSL 语法内容';
-
--- ------------------------------------------------------------
--- 3.3 rule_inputs - 规则输入表
--- ------------------------------------------------------------
-CREATE TABLE IF NOT EXISTS rule_inputs (
-    id BIGSERIAL PRIMARY KEY,
-    rule_id BIGINT NOT NULL REFERENCES element_rules(id) ON DELETE CASCADE,
-    
-    -- 输入标识
-    input_key VARCHAR(50) NOT NULL,
-    input_name VARCHAR(200) NOT NULL,
-    
-    -- 输入类型
-    input_type VARCHAR(50) NOT NULL,            -- attachment_ref/entity_ref/element_ref/text/number
-    
-    -- 引用配置
-    ref_attachment_id BIGINT,
-    ref_entity_id BIGINT,
-    ref_element_key VARCHAR(100),               -- 引用其他动态要素的 key
-    
-    -- 固定值
-    fixed_value TEXT,
-    
-    -- 排序
-    sort_order INT DEFAULT 0,
-    
-    -- 元数据
-    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-
-COMMENT ON TABLE rule_inputs IS '规则数据输入表';
-COMMENT ON COLUMN rule_inputs.input_type IS '输入类型:attachment_ref/entity_ref/element_ref/text/number';
-COMMENT ON COLUMN rule_inputs.ref_element_key IS '引用其他动态要素的 key';
-
--- ------------------------------------------------------------
--- 3.4 rule_action_config - 规则动作配置表
--- ------------------------------------------------------------
-CREATE TABLE IF NOT EXISTS rule_action_config (
-    id BIGSERIAL PRIMARY KEY,
-    rule_id BIGINT NOT NULL REFERENCES element_rules(id) ON DELETE CASCADE,
-    
-    -- 动作类型
-    action_type VARCHAR(50) NOT NULL,
-    
-    -- 动作配置
-    config JSONB NOT NULL DEFAULT '{}',
-    
-    -- 元数据
-    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    
-    UNIQUE(rule_id)
-);
-
-COMMENT ON TABLE rule_action_config IS '规则动作配置表';
-COMMENT ON COLUMN rule_action_config.action_type IS '动作类型:extract_entity/extract_pattern/llm_generate/extract_table';
-
--- ============================================================
--- 4. 创建附件相关表
--- ============================================================
-
--- ------------------------------------------------------------
--- 4.1 report_attachments - 报告附件表
--- ------------------------------------------------------------
-CREATE TABLE IF NOT EXISTS report_attachments (
-    id BIGSERIAL PRIMARY KEY,
-    report_id BIGINT NOT NULL REFERENCES reports(id) ON DELETE CASCADE,
-    
-    -- 文件信息
-    display_name VARCHAR(200) NOT NULL,
-    file_name VARCHAR(500) NOT NULL,
-    file_path VARCHAR(1000) NOT NULL,
-    file_type VARCHAR(50),
-    file_size BIGINT,
-    
-    -- 解析状态
-    parse_status VARCHAR(50) DEFAULT 'pending',
-    parsed_text TEXT,
-    entity_count INT DEFAULT 0,
-    parse_error TEXT,
-    parsed_at TIMESTAMP,
-    
-    -- 排序
-    sort_order INT DEFAULT 0,
-    
-    -- 元数据
-    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-
-COMMENT ON TABLE report_attachments IS '报告附件表';
-COMMENT ON COLUMN report_attachments.parse_status IS '解析状态:pending/processing/completed/failed';
-
--- ------------------------------------------------------------
--- 4.2 attachment_entities - 附件实体表
--- ------------------------------------------------------------
-CREATE TABLE IF NOT EXISTS attachment_entities (
-    id BIGSERIAL PRIMARY KEY,
-    attachment_id BIGINT NOT NULL REFERENCES report_attachments(id) ON DELETE CASCADE,
-    
-    -- 实体信息
-    entity_type VARCHAR(50) NOT NULL,
-    entity_text VARCHAR(500) NOT NULL,
-    
-    -- 业务标签
-    business_label VARCHAR(200),
-    
-    -- 置信度和出现次数
-    confidence DECIMAL(5,4) DEFAULT 1.0,
-    occurrence_count INT DEFAULT 1,
-    
-    -- 元数据
-    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
-);
-
-COMMENT ON TABLE attachment_entities IS '附件实体表';
-COMMENT ON COLUMN attachment_entities.entity_type IS '实体类型:ORG/PERSON/DATE/LOCATION/NUMBER';
-COMMENT ON COLUMN attachment_entities.business_label IS '业务标签';
-
--- ------------------------------------------------------------
--- 4.3 report_copy_records - 报告复制记录表
--- ------------------------------------------------------------
-CREATE TABLE IF NOT EXISTS report_copy_records (
-    id BIGSERIAL PRIMARY KEY,
-    source_report_id BIGINT NOT NULL REFERENCES reports(id),
-    target_report_id BIGINT NOT NULL REFERENCES reports(id),
-    
-    -- 复制信息
-    copied_by BIGINT REFERENCES users(id),
-    copy_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-    
-    -- 复制内容统计
-    elements_copied INT DEFAULT 0,
-    rules_copied INT DEFAULT 0,
-    
-    -- 备注
-    notes TEXT
-);
-
-COMMENT ON TABLE report_copy_records IS '报告复制记录表';
-
--- ============================================================
--- 5. 创建视图
--- ============================================================
-
--- ------------------------------------------------------------
--- 5.1 v_report_dynamic_elements - 报告动态要素完整视图
--- ------------------------------------------------------------
-CREATE OR REPLACE VIEW v_report_dynamic_elements AS
-SELECT 
-    r.id AS report_id,
-    r.title AS report_title,
-    te.element_key,
-    te.element_name,
-    te.element_type,
-    te.namespace,
-    te.field_name,
-    te.table_columns,
-    te.required,
-    ev.value_text,
-    ev.value_json,
-    ev.is_filled,
-    ev.fill_source,
-    er.id AS rule_id,
-    er.rule_type,
-    er.last_run_status,
-    er.last_run_time,
-    CASE WHEN er.id IS NOT NULL THEN true ELSE false END AS has_rule
-FROM reports r
-JOIN report_templates rt ON rt.id = r.template_id
-JOIN template_dynamic_elements te ON te.template_id = rt.id
-LEFT JOIN element_values ev ON ev.report_id = r.id AND ev.element_key = te.element_key
-LEFT JOIN element_rules er ON er.report_id = r.id AND er.element_key = te.element_key;
-
-COMMENT ON VIEW v_report_dynamic_elements IS '报告动态要素完整视图';
-
--- ------------------------------------------------------------
--- 5.2 v_rule_full_config - 规则完整配置视图
--- ------------------------------------------------------------
-CREATE OR REPLACE VIEW v_rule_full_config AS
-SELECT 
-    er.id AS rule_id,
-    er.report_id,
-    er.element_key,
-    er.rule_name,
-    er.rule_type,
-    er.last_output_text,
-    er.last_output_json,
-    er.last_run_status,
-    er.dsl_content,
-    er.status,
-    ac.action_type,
-    ac.config AS action_config,
-    (
-        SELECT json_agg(json_build_object(
-            'inputKey', ri.input_key,
-            'inputName', ri.input_name,
-            'inputType', ri.input_type,
-            'refAttachmentId', ri.ref_attachment_id,
-            'refEntityId', ri.ref_entity_id,
-            'refElementKey', ri.ref_element_key,
-            'fixedValue', ri.fixed_value
-        ) ORDER BY ri.sort_order)
-        FROM rule_inputs ri
-        WHERE ri.rule_id = er.id
-    ) AS inputs
-FROM element_rules er
-LEFT JOIN rule_action_config ac ON ac.rule_id = er.id;
-
-COMMENT ON VIEW v_rule_full_config IS '规则完整配置视图';
-
--- ============================================================
--- 6. 创建索引
--- ============================================================
-
--- report_templates 索引
-CREATE INDEX IF NOT EXISTS idx_templates_category ON report_templates(category);
-CREATE INDEX IF NOT EXISTS idx_templates_status ON report_templates(status);
-
--- template_dynamic_elements 索引
-CREATE INDEX IF NOT EXISTS idx_template_elements_template ON template_dynamic_elements(template_id);
-CREATE INDEX IF NOT EXISTS idx_template_elements_type ON template_dynamic_elements(element_type);
-CREATE INDEX IF NOT EXISTS idx_template_elements_namespace ON template_dynamic_elements(namespace);
-
--- element_values 索引
-CREATE INDEX IF NOT EXISTS idx_element_values_report ON element_values(report_id);
-CREATE INDEX IF NOT EXISTS idx_element_values_key ON element_values(element_key);
-CREATE INDEX IF NOT EXISTS idx_element_values_filled ON element_values(is_filled);
-
--- element_rules 索引
-CREATE INDEX IF NOT EXISTS idx_element_rules_report ON element_rules(report_id);
-CREATE INDEX IF NOT EXISTS idx_element_rules_key ON element_rules(element_key);
-CREATE INDEX IF NOT EXISTS idx_element_rules_status ON element_rules(status);
-
--- rule_inputs 索引
-CREATE INDEX IF NOT EXISTS idx_rule_inputs_rule ON rule_inputs(rule_id);
-
--- report_attachments 索引
-CREATE INDEX IF NOT EXISTS idx_attachments_report ON report_attachments(report_id);
-CREATE INDEX IF NOT EXISTS idx_attachments_parse_status ON report_attachments(parse_status);
-
--- attachment_entities 索引
-CREATE INDEX IF NOT EXISTS idx_attachment_entities_attachment ON attachment_entities(attachment_id);
-CREATE INDEX IF NOT EXISTS idx_attachment_entities_type ON attachment_entities(entity_type);
-CREATE INDEX IF NOT EXISTS idx_attachment_entities_label ON attachment_entities(business_label);
-
--- report_copy_records 索引
-CREATE INDEX IF NOT EXISTS idx_copy_records_source ON report_copy_records(source_report_id);
-CREATE INDEX IF NOT EXISTS idx_copy_records_target ON report_copy_records(target_report_id);
-
--- ============================================================
--- 7. Mock 数据
--- ============================================================
-
--- ------------------------------------------------------------
--- 7.1 模板数据
--- ------------------------------------------------------------
-INSERT INTO report_templates (id, name, category, description, dynamic_element_count, table_element_count, status, created_at)
-VALUES (1, '电力安全生产标准化复审报告', '安全评审', '电力建设企业安全生产标准化达标评级评审报告模板', 45, 4, 'active', '2026-01-15 10:00:00')
-ON CONFLICT (id) DO NOTHING;
-
-SELECT setval('report_templates_id_seq', GREATEST((SELECT MAX(id) FROM report_templates), 1));
-
--- ------------------------------------------------------------
--- 7.2 模板动态要素数据
--- ------------------------------------------------------------
-
--- 文本型动态要素
-INSERT INTO template_dynamic_elements (id, template_id, element_key, element_name, element_type, namespace, field_name, required, sort_order)
-VALUES 
-(1, 1, 'basicInfo.projectCode', '项目编号', 'text', 'basicInfo', 'projectCode', true, 1),
-(2, 1, 'project.reviewObject', '评审对象', 'text', 'project', 'reviewObject', true, 2),
-(3, 1, 'project.reviewObjectAlias', '评审对象简称', 'text', 'project', 'reviewObjectAlias', true, 3),
-(4, 1, 'basicInfo.requestLevel', '申请级别', 'text', 'basicInfo', 'requestLevel', true, 4),
-(5, 1, 'project.resultScore', '评审得分', 'text', 'project', 'resultScore', true, 5),
-(6, 1, 'project.resultLevel', '评审级别', 'text', 'project', 'resultLevel', true, 6),
-(7, 1, 'project.workStartAt', '评审开始日期', 'text', 'project', 'workStartAt', true, 7),
-(8, 1, 'project.workEndAt', '评审结束日期', 'text', 'project', 'workEndAt', true, 8),
-(9, 1, 'project.createdAt', '报告日期', 'text', 'project', 'createdAt', true, 9),
-(10, 1, 'basicInfo.applyAt', '申请日期', 'text', 'basicInfo', 'applyAt', false, 10),
-(11, 1, 'project.reviewPeriod', '评审期', 'text', 'project', 'reviewPeriod', false, 11),
-(12, 1, 'basicInfo.reviewObjectCertificateGetAt', '证书获取日期', 'text', 'basicInfo', 'reviewObjectCertificateGetAt', false, 12),
-(13, 1, 'basicInfo.reviewObjectCertificate2GetAt', '二次证书获取日期', 'text', 'basicInfo', 'reviewObjectCertificate2GetAt', false, 13)
-ON CONFLICT (template_id, element_key) DO NOTHING;
-
--- 段落型动态要素
-INSERT INTO template_dynamic_elements (id, template_id, element_key, element_name, element_type, namespace, field_name, required, sort_order)
-VALUES 
-(20, 1, 'project.reviewObjectSummary', '评审对象概述', 'paragraph', 'project', 'reviewObjectSummary', true, 20),
-(21, 1, 'project.reviewObjectDescription', '企业简介', 'paragraph', 'project', 'reviewObjectDescription', true, 21),
-(22, 1, 'project.target', '目标', 'paragraph', 'project', 'target', true, 22),
-(23, 1, 'project.duty', '组织机构和职责', 'paragraph', 'project', 'duty', true, 23),
-(24, 1, 'project.fullParticipation', '全员参与', 'paragraph', 'project', 'fullParticipation', false, 24),
-(25, 1, 'project.safetyInvestment', '安全生产投入', 'paragraph', 'project', 'safetyInvestment', false, 25),
-(26, 1, 'project.safetyCulture', '安全文化建设', 'paragraph', 'project', 'safetyCulture', false, 26),
-(27, 1, 'project.systematicManagement', '制度化管理', 'paragraph', 'project', 'systematicManagement', false, 27),
-(28, 1, 'project.employeeTraining', '人员教育培训', 'paragraph', 'project', 'employeeTraining', false, 28),
-(29, 1, 'project.assetManagement', '设备设施管理', 'paragraph', 'project', 'assetManagement', false, 29),
-(30, 1, 'project.jobSafety', '作业安全', 'paragraph', 'project', 'jobSafety', false, 30),
-(31, 1, 'project.safetyStandardizationStatus', '安全生产标准化建设和持续运行情况', 'paragraph', 'project', 'safetyStandardizationStatus', false, 31)
-ON CONFLICT (template_id, element_key) DO NOTHING;
-
--- 表格型动态要素
-INSERT INTO template_dynamic_elements (id, template_id, element_key, element_name, element_type, namespace, field_name, required, table_columns, sort_order)
-VALUES 
-(40, 1, '+review_status', '现场复审情况表', 'table', NULL, 'review_status', true, '["序号", "项目", "存在的问题", "扣分标准"]', 40),
-(41, 1, '+target_responsibility', '目标职责评审表', 'table', NULL, 'target_responsibility', true, '["序号", "项目", "存在的问题", "扣分标准"]', 41),
-(42, 1, '+institutionalized_management', '制度化管理评审表', 'table', NULL, 'institutionalized_management', true, '["序号", "项目", "存在的问题", "扣分标准"]', 42),
-(43, 1, '+education_and_training', '教育培训评审表', 'table', NULL, 'education_and_training', true, '["序号", "项目", "存在的问题", "扣分标准"]', 43)
-ON CONFLICT (template_id, element_key) DO NOTHING;
-
-SELECT setval('template_dynamic_elements_id_seq', GREATEST((SELECT MAX(id) FROM template_dynamic_elements), 43));
-
--- ------------------------------------------------------------
--- 7.3 报告数据
--- ------------------------------------------------------------
-
--- 成都院复审报告(原始报告)
-INSERT INTO reports (id, title, report_type, status, template_id, project_id, created_by, created_at)
-VALUES (1001, '成都院复审报告', '电力安全生产标准化复审报告', 'draft', 1, 1, 1, '2026-02-10 10:30:00')
-ON CONFLICT (id) DO NOTHING;
-
--- 华东院复审报告(从成都院复制)
-INSERT INTO reports (id, title, report_type, status, template_id, project_id, created_by, source_report_id, copy_time, created_at)
-VALUES (1002, '华东院复审报告', '电力安全生产标准化复审报告', 'draft', 1, 1, 1, 1001, '2026-02-11 14:00:00', '2026-02-11 14:00:00')
-ON CONFLICT (id) DO NOTHING;
-
-SELECT setval('reports_id_seq', GREATEST((SELECT MAX(id) FROM reports), 1002));
-
--- ------------------------------------------------------------
--- 7.4 附件数据
--- ------------------------------------------------------------
-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)
-VALUES 
-(1, 1001, '01-复审通知', '复审通知.docx', '/uploads/2026/02/复审通知.docx', 'docx', 102400, 'completed', 15, '2026-02-10 10:35:00', 1),
-(2, 1001, '02-评审报告原文', '评审报告.pdf', '/uploads/2026/02/评审报告.pdf', 'pdf', 512000, 'completed', 25, '2026-02-10 10:40:00', 2),
-(3, 1001, '03-安全标准化达标证书', '达标证书.pdf', '/uploads/2026/02/达标证书.pdf', 'pdf', 256000, 'completed', 8, '2026-02-10 10:45:00', 3)
-ON CONFLICT (id) DO NOTHING;
-
-SELECT setval('report_attachments_id_seq', GREATEST((SELECT MAX(id) FROM report_attachments), 3));
-
--- ------------------------------------------------------------
--- 7.5 附件实体数据
--- ------------------------------------------------------------
-INSERT INTO attachment_entities (id, attachment_id, entity_type, entity_text, business_label, confidence, occurrence_count)
-VALUES 
--- 复审通知中的实体
-(1, 1, 'ORG', '中国电建集团成都勘测设计研究院有限公司', '评审对象', 0.95, 15),
-(2, 1, 'ORG', '湖北安源安全环保科技有限公司', '评审单位', 0.92, 8),
-(3, 1, 'PERSON', '何彦锋', '董事长', 0.88, 3),
-(4, 1, 'PERSON', '张世殊', '总经理', 0.88, 2),
-(5, 1, 'DATE', '2024年7月13日', '评审开始日期', 0.99, 2),
-(6, 1, 'DATE', '2024年10月17日', '评审结束日期', 0.99, 2),
-(7, 1, 'DATE', '2024年7月8日', '申请日期', 0.99, 1),
-(8, 1, 'DATE', '2019年12月9日', '证书获取日期', 0.99, 1),
-(9, 1, 'DATE', '2015年4月7日', '二次证书获取日期', 0.99, 1),
--- 评审报告中的实体
-(10, 2, 'NUMBER', '93.33', '评审得分', 0.99, 3),
-(11, 2, 'NUMBER', '50', '注册资本(亿)', 0.95, 2),
-(12, 2, 'NUMBER', '2887', '员工人数', 0.95, 1),
-(13, 2, 'LOCATION', '成都市温江区政和街8号', '公司地址', 0.90, 1),
--- 达标证书中的实体
-(14, 3, 'ORG', '中国电建集团成都勘测设计研究院有限公司', NULL, 0.95, 2),
-(15, 3, 'DATE', '2019年12月9日', '发证日期', 0.99, 1)
-ON CONFLICT (id) DO NOTHING;
-
-SELECT setval('attachment_entities_id_seq', GREATEST((SELECT MAX(id) FROM attachment_entities), 15));
-
--- ------------------------------------------------------------
--- 7.6 动态要素值数据(成都院)
--- ------------------------------------------------------------
-
--- 文本型动态要素值
-INSERT INTO element_values (id, report_id, element_key, value_text, is_filled, fill_source)
-VALUES 
-(1, 1001, 'basicInfo.projectCode', 'BZ-0092-2024', true, 'rule'),
-(2, 1001, 'project.reviewObject', '中国电建集团成都勘测设计研究院有限公司', true, 'rule'),
-(3, 1001, 'project.reviewObjectAlias', '成都院', true, 'rule'),
-(4, 1001, 'basicInfo.requestLevel', '一级', true, 'rule'),
-(5, 1001, 'project.resultScore', '93.33', true, 'rule'),
-(6, 1001, 'project.resultLevel', '一级', true, 'rule'),
-(7, 1001, 'project.workStartAt', '2024年7月13日', true, 'rule'),
-(8, 1001, 'project.workEndAt', '2024年10月17日', true, 'rule'),
-(9, 1001, 'project.createdAt', '2026年02月', true, 'manual'),
-(10, 1001, 'basicInfo.applyAt', '2024年7月8日', true, 'rule'),
-(11, 1001, 'project.reviewPeriod', '2023年7月8日-2024年7月8日', true, 'rule'),
-(12, 1001, 'basicInfo.reviewObjectCertificateGetAt', '2019年12月9日', true, 'rule'),
-(13, 1001, 'basicInfo.reviewObjectCertificate2GetAt', '2015年4月7日', true, 'rule')
-ON CONFLICT (report_id, element_key) DO NOTHING;
-
--- 段落型动态要素值
-INSERT INTO element_values (id, report_id, element_key, value_text, is_filled, fill_source)
-VALUES 
-(20, 1001, 'project.reviewObjectSummary', '中国电建集团成都勘测设计研究院有限公司(简称:成都院)成立于2005年,是世界500强企业中国电力建设集团的核心成员企业。作为国家级高新技术企业,成都院以水利水电、新能源和基础设施为核心业务,在水电工程领域承担了金沙江、大渡河、雅砻江等重大河流的规划勘测设计工作,创造了多项"中国第一"和"世界之最"。成都院拥有注册资本50亿元人民币,专业技术人员规模近3000人,累计获得4443项专利和100项行业资质认证,展现了雄厚的技术研发实力。近年来,成都院积极拓展风电、光伏、抽水蓄能等清洁能源业务,并在交通、市政、环境工程等领域取得突破性进展。依托"投资-设计-建造-运营"全产业链服务能力,成都院业务遍及全球40多个国家和地区,成为推动能源革命和基础设施建设的重要力量。', true, 'rule'),
-(21, 1001, 'project.reviewObjectDescription', '中国电建集团成都勘测设计研究院有限公司(简称:成都院)是中国电力建设集团核心成员企业,作为国内领先的清洁能源工程服务商,成都院在水利水电、新能源及基础设施领域具有突出优势。成都院深度参与了国家西部大开发和"西电东送"战略,承担了包括两河口水电站、杨房沟水电站、乌东德水电站等重大工程的勘测设计工作,其中两河口水电站拥有世界最高土石坝的纪录。近年来,成都院积极拓展新能源业务,承担了多个大型风电、光伏发电基地的规划设计和EPC总承包项目,并在抽水蓄能领域形成了全产业链服务能力。凭借卓越的技术实力,成都院先后获得"全国文明单位"、"国家科技进步奖"、"全国优秀勘察设计企业"等多项荣誉,其技术团队多次参与国家和行业标准编制工作。', true, 'rule'),
-(22, 1001, 'project.target', '成都院制定并发布《QHSE"十四五"规划》(安质〔2023〕1号),明确了总体安全生产目标,包括7项安全管理及事故控制目标,总体目标为公司"十四五"规划的子规划,安全生产与职业健康工作目标纳入总体生产经营目标。成都院发布《关于印发<成都院2024年安全生产与职业健康、能源节约与生态环境保护工作目标和重点>的通知》(蓉设安质〔2024〕18号),明确了2024年安全生产与职业健康目标,包括9项安全管理目标和10项事故控制目标。', true, 'rule')
-ON CONFLICT (report_id, element_key) DO NOTHING;
-
--- 表格型动态要素值
-INSERT INTO element_values (id, report_id, element_key, value_json, is_filled, fill_source)
-VALUES 
-(40, 1001, '+target_responsibility', '[
-  {"序号": 1, "项目": "5.1.1.1\n目标制定", "存在的问题": "大邑地勘项目部制定的2024年度安全生产目标,缺少设备设施方面的事故控制目标。", "扣分标准": "依据评估标准②:目标内容有缺失,扣1分/项,共扣1分。"},
-  {"序号": 2, "项目": "5.1.1.2\n目标落实", "存在的问题": "双江口设计项目部项目经理与各专业部门负责人签订的《2024年度安全责任书》中,目标分解分解不明确,不满足要求。", "扣分标准": "依据评估标准②:签订责任书、目标分解不满足要求,扣1分/单位,共扣1分。"},
-  {"序号": 3, "项目": "5.1.1.3\n目标考核", "存在的问题": "云阳监理项目未对二季度安全生产目标及工作计划完成情况进行考核、监督检查。", "扣分标准": "依据评估标准①:未对目标的完成情况进行评估和考核,扣2分/次,共扣2分。"},
-  {"序号": 4, "项目": "5.1.2.1\n机构设置", "存在的问题": "漳州总包项目部安委会组成不符合规定,未包含分包单位负责人。", "扣分标准": "依据评分标准①:安委会组成不符合规定或未及时调整,扣2分/次,共扣2分。"},
-  {"序号": 5, "项目": "5.1.2.2\n主要负责人及管理层职责", "存在的问题": "双江口设计项目部9月召开的安全生产例会中,未针对成都院隐患大排查、设计分公司安全风险隐患专项整治工作等要求,部署安排隐患排查相关工作。", "扣分标准": "依据评估标准④:会议未分析安全生产存在的问题,未针对问题制定改进措施,扣1分/项,共扣1分。"}
-]', true, 'rule'),
-(41, 1001, '+institutionalized_management', '[
-  {"序号": 1, "项目": "5.2.2\n规章制度", "存在的问题": "勘测设计分公司未按成都院《安全风险管控管理办法》的要求制定安全风险管控制度。", "扣分标准": "依据评估标准①:制度不全,扣2分/项,共扣2分"},
-  {"序号": 2, "项目": "5.2.3\n操作规程", "存在的问题": "云阳监理项目1#引水洞汽车吊和下库进出水口挖掘机未张贴安全操作规程。", "扣分标准": "依据评估标准③:设备未悬挂安全操作规程,扣1分/处,共扣2分。"}
-]', true, 'rule'),
-(42, 1001, '+education_and_training', '[
-  {"序号": 1, "项目": "5.3.1\n教育培训管理", "存在的问题": "大邑地勘项目部《2024年安全生产教育和培训计划》中,缺少有限空间作业等专项培训内容。", "扣分标准": "依据评估标准③:培训计划未包含职业健康、应急管理及上级要求的培训等内容,内容不全,扣2分。"}
-]', true, 'rule')
-ON CONFLICT (report_id, element_key) DO NOTHING;
-
-SELECT setval('element_values_id_seq', GREATEST((SELECT MAX(id) FROM element_values), 42));
-
--- ------------------------------------------------------------
--- 7.7 动态要素规则数据(成都院)
--- ------------------------------------------------------------
-INSERT INTO element_rules (id, report_id, element_key, rule_name, description, rule_type, last_output_text, last_run_status, last_run_time, status)
-VALUES 
-(1, 1001, 'basicInfo.projectCode', '项目编号提取', '从复审通知中提取项目编号', 'extraction', 'BZ-0092-2024', 'success', '2026-02-11 14:00:00', 'active'),
-(2, 1001, 'project.reviewObject', '评审对象提取', '从复审通知中提取评审对象', 'extraction', '中国电建集团成都勘测设计研究院有限公司', 'success', '2026-02-11 14:01:00', 'active'),
-(3, 1001, 'project.reviewObjectAlias', '评审对象简称提取', '从复审通知中提取评审对象简称', 'extraction', '成都院', 'success', '2026-02-11 14:02:00', 'active'),
-(4, 1001, 'project.resultScore', '评审得分提取', '从评审报告中提取评审得分', 'extraction', '93.33', 'success', '2026-02-11 14:03:00', 'active'),
-(5, 1001, 'project.workStartAt', '评审开始日期提取', '从复审通知中提取评审开始日期', 'extraction', '2024年7月13日', 'success', '2026-02-11 14:04:00', 'active'),
-(6, 1001, 'project.workEndAt', '评审结束日期提取', '从复审通知中提取评审结束日期', 'extraction', '2024年10月17日', 'success', '2026-02-11 14:05:00', 'active'),
-(7, 1001, 'project.reviewObjectSummary', '评审对象概述生成', '基于企业简介生成评审对象概述', 'generation', NULL, 'success', '2026-02-11 14:06:00', 'active'),
-(8, 1001, 'project.reviewObjectDescription', '企业简介生成', '基于附件内容生成企业简介', 'generation', NULL, 'success', '2026-02-11 14:07:00', 'active'),
-(9, 1001, 'project.target', '目标内容生成', '基于附件内容生成目标描述', 'generation', NULL, 'success', '2026-02-11 14:08:00', 'active'),
-(10, 1001, '+target_responsibility', '目标职责评审表提取', '从评审报告中提取目标职责评审表', 'extraction', NULL, 'success', '2026-02-11 14:09:00', 'active')
-ON CONFLICT (report_id, element_key) DO NOTHING;
-
-SELECT setval('element_rules_id_seq', GREATEST((SELECT MAX(id) FROM element_rules), 10));
-
--- ------------------------------------------------------------
--- 7.8 规则输入数据
--- ------------------------------------------------------------
-INSERT INTO rule_inputs (id, rule_id, input_key, input_name, input_type, ref_attachment_id, ref_entity_id, fixed_value, sort_order)
-VALUES 
--- 规则1(项目编号提取)的输入
-(1, 1, 'input1', '复审通知', 'attachment_ref', 1, NULL, NULL, 1),
--- 规则2(评审对象提取)的输入
-(2, 2, 'input1', '复审通知', 'attachment_ref', 1, NULL, NULL, 1),
--- 规则3(评审对象简称提取)的输入
-(3, 3, 'input1', '评审对象', 'entity_ref', NULL, 1, NULL, 1),
--- 规则4(评审得分提取)的输入
-(4, 4, 'input1', '评审报告', 'attachment_ref', 2, NULL, NULL, 1),
--- 规则5(评审开始日期提取)的输入
-(5, 5, 'input1', '复审通知', 'attachment_ref', 1, NULL, NULL, 1),
--- 规则6(评审结束日期提取)的输入
-(6, 6, 'input1', '复审通知', 'attachment_ref', 1, NULL, NULL, 1),
--- 规则7(评审对象概述生成)的输入
-(7, 7, 'input1', '评审报告', 'attachment_ref', 2, NULL, NULL, 1),
-(8, 7, 'prompt', '提示词', 'text', NULL, NULL, '请根据以下企业信息,生成一段简洁的企业概述,突出企业的核心业务和优势。', 2),
--- 规则8(企业简介生成)的输入
-(9, 8, 'input1', '评审报告', 'attachment_ref', 2, NULL, NULL, 1),
-(10, 8, 'prompt', '提示词', 'text', NULL, NULL, '请根据以下内容,生成详细的企业简介,包括企业历史、主营业务、技术实力等。', 2),
--- 规则9(目标内容生成)的输入
-(11, 9, 'input1', '评审报告', 'attachment_ref', 2, NULL, NULL, 1),
-(12, 9, 'prompt', '提示词', 'text', NULL, NULL, '请根据以下内容,提取并整理企业的安全生产目标相关内容。', 2),
--- 规则10(目标职责评审表提取)的输入
-(13, 10, 'input1', '评审报告', 'attachment_ref', 2, NULL, NULL, 1)
-ON CONFLICT (id) DO NOTHING;
-
-SELECT setval('rule_inputs_id_seq', GREATEST((SELECT MAX(id) FROM rule_inputs), 13));
-
--- ------------------------------------------------------------
--- 7.9 规则动作配置数据
--- ------------------------------------------------------------
-INSERT INTO rule_action_config (id, rule_id, action_type, config)
-VALUES 
-(1, 1, 'extract_pattern', '{"pattern": "项目编号[::]\\s*(\\S+)", "group": 1}'),
-(2, 2, 'extract_entity', '{"entityType": "ORG", "businessLabel": "评审对象", "selectStrategy": "first"}'),
-(3, 3, 'extract_pattern', '{"pattern": "(简称[::](.+?))", "group": 1}'),
-(4, 4, 'extract_entity', '{"entityType": "NUMBER", "businessLabel": "评审得分", "selectStrategy": "first"}'),
-(5, 5, 'extract_entity', '{"entityType": "DATE", "businessLabel": "评审开始日期", "selectStrategy": "first"}'),
-(6, 6, 'extract_entity', '{"entityType": "DATE", "businessLabel": "评审结束日期", "selectStrategy": "first"}'),
-(7, 7, 'llm_generate', '{"model": "qwen-max", "temperature": 0.7, "maxTokens": 1000}'),
-(8, 8, 'llm_generate', '{"model": "qwen-max", "temperature": 0.7, "maxTokens": 2000}'),
-(9, 9, 'llm_generate', '{"model": "qwen-max", "temperature": 0.7, "maxTokens": 2000}'),
-(10, 10, 'extract_table', '{"tablePattern": "序号.*项目.*问题", "columns": ["序号", "项目", "存在的问题", "扣分标准"]}')
-ON CONFLICT (rule_id) DO NOTHING;
-
-SELECT setval('rule_action_config_id_seq', GREATEST((SELECT MAX(id) FROM rule_action_config), 10));
-
--- ------------------------------------------------------------
--- 7.10 报告复制记录
--- ------------------------------------------------------------
-INSERT INTO report_copy_records (id, source_report_id, target_report_id, copied_by, copy_time, elements_copied, rules_copied, notes)
-VALUES (1, 1001, 1002, 1, '2026-02-11 14:00:00', 45, 10, '从成都院复制到华东院')
-ON CONFLICT (id) DO NOTHING;
-
-SELECT setval('report_copy_records_id_seq', GREATEST((SELECT MAX(id) FROM report_copy_records), 1));
-
--- ============================================================
--- 完成
--- ============================================================
-SELECT '灵越智报 2.0 数据库增量脚本执行完成(含模板系统和真实数据)' AS result;

BIN
database/lingyue_zhibao_20260302_181609.sql.gz


+ 0 - 60
database/migrations/001_cleanup_old_tables.sql

@@ -1,60 +0,0 @@
--- ============================================================
--- 清理旧表结构,统一使用新表
--- 执行时间: 2026-02-12
--- ============================================================
-
--- 1. 删除旧的 sys_* 表(保留数据到新表后再删除)
--- 注意:按照外键依赖顺序删除
-
--- 1.1 删除关联表
-DROP TABLE IF EXISTS sys_role_permissions CASCADE;
-DROP TABLE IF EXISTS sys_user_roles CASCADE;
-
--- 1.2 删除权限和角色表
-DROP TABLE IF EXISTS sys_permissions CASCADE;
-DROP TABLE IF EXISTS sys_roles CASCADE;
-
--- 1.3 删除会话和日志表
-DROP TABLE IF EXISTS sys_sessions CASCADE;
-DROP TABLE IF EXISTS sys_login_logs CASCADE;
-DROP TABLE IF EXISTS sys_operation_logs CASCADE;
-
--- 1.4 删除系统配置表
-DROP TABLE IF EXISTS sys_configs CASCADE;
-DROP TABLE IF EXISTS sys_dict_items CASCADE;
-DROP TABLE IF EXISTS sys_dict_types CASCADE;
-DROP TABLE IF EXISTS sys_files CASCADE;
-DROP TABLE IF EXISTS sys_tasks CASCADE;
-
--- 1.5 删除旧用户表
-DROP TABLE IF EXISTS sys_users CASCADE;
-
--- 2. 确保新表 users 有完整的管理员数据
-INSERT INTO users (
-    id, 
-    username, 
-    email, 
-    password_hash, 
-    display_name, 
-    role, 
-    is_active
-) VALUES (
-    '1',
-    'admin',
-    'admin@lingyue.com',
-    '$2a$10$0AUCG2mG7a6JXErOTI.Pg.Q/R04plOXvc.TDMeWzwwZQ23ZmrtJxC',
-    '管理员',
-    'admin',
-    true
-) ON CONFLICT (username) DO UPDATE SET
-    password_hash = EXCLUDED.password_hash,
-    email = EXCLUDED.email,
-    display_name = EXCLUDED.display_name,
-    role = EXCLUDED.role;
-
--- 3. 验证清理结果
-SELECT 'Cleanup completed. Remaining sys_* tables:' as message;
-SELECT tablename FROM pg_tables WHERE schemaname = 'public' AND tablename LIKE 'sys_%';
-
-SELECT 'Users table data:' as message;
-SELECT id, username, email, display_name, role, is_active FROM users;

+ 0 - 76
database/migrations/002_add_trainingManagement.sql

@@ -1,76 +0,0 @@
--- 002_add_trainingManagement.sql
--- 修复问题:模板 1.2.3 教育培训 / 1)教育培训管理 缺少 project.trainingManagement 要素
--- 原因:init_database.sql 遗漏了 trainingManagement,node 822 (employeeTraining) 合并了两段内容
--- 修改:
---   1. 新增 ELEMENT 节点 project.trainingManagement(教育培训管理)
---   2. 新增 VALUE 节点 PRJ-2024-001:project.trainingManagement
---   3. 拆分 node 822 的 value_text,将教育培训管理部分移到新 VALUE
---   4. 添加 HAS_ELEMENT / HAS_VALUE 边
---   5. 添加 node_properties(namespace, field_name, element_type, required, description, sort_order)
-
-BEGIN;
-
--- ========== 1. 新增 ELEMENT 节点 ==========
-INSERT INTO nodes (id, node_type, node_key, name, status, created_by, created_at, updated_at) VALUES
-(1138, 'ELEMENT', 'project.trainingManagement', '教育培训管理', 'active', NULL, now(), now())
-ON CONFLICT (id) DO NOTHING;
-
--- ========== 2. 新增 VALUE 节点 ==========
-INSERT INTO nodes (id, node_type, node_key, name, status, created_by, created_at, updated_at) VALUES
-(1139, 'VALUE', 'PRJ-2024-001:project.trainingManagement', '教育培训管理值', 'active', NULL, now(), now())
-ON CONFLICT (id) DO NOTHING;
-
--- ========== 3. 新增 HAS_ELEMENT 边(project 10 -> element 1138)==========
-INSERT INTO edges (id, edge_type, from_node_id, to_node_id, sort_order, created_at) VALUES
-(2395, 'HAS_ELEMENT', 10, 1138, 0, now())
-ON CONFLICT (id) DO NOTHING;
-
--- ========== 4. 新增 HAS_VALUE 边(project 10 -> value 1139)==========
-INSERT INTO edges (id, edge_type, from_node_id, to_node_id, sort_order, created_at) VALUES
-(2396, 'HAS_VALUE', 10, 1139, 0, now())
-ON CONFLICT (id) DO NOTHING;
-
--- ========== 5. ELEMENT 节点属性 ==========
-INSERT INTO node_properties (id, node_id, prop_key, prop_value, prop_json, prop_number, prop_date, created_at, updated_at) VALUES
-(4413, 1138, 'namespace', 'project', NULL, NULL, NULL, now(), now()),
-(4414, 1138, 'field_name', 'trainingManagement', NULL, NULL, NULL, now(), now()),
-(4415, 1138, 'element_type', 'paragraph', NULL, NULL, NULL, now(), now()),
-(4416, 1138, 'required', 'true', NULL, NULL, NULL, now(), now()),
-(4417, 1138, 'description', '1.2.3 教育培训-教育培训管理', NULL, NULL, NULL, now(), now()),
-(4418, 1138, 'element_name', '教育培训管理', NULL, NULL, NULL, now(), now()),
--- sort_order: 721(systematicManagement)=21, 722(employeeTraining)=22, 新的trainingManagement排在中间
-(4419, 1138, 'sort_order', '22', NULL, NULL, NULL, now(), now())
-ON CONFLICT (id) DO NOTHING;
-
--- 把原 employeeTraining 的 sort_order 从 22 改为 23(给 trainingManagement 腾位)
-UPDATE node_properties SET prop_value = '23' WHERE node_id = 722 AND prop_key = 'sort_order';
--- 后续元素 sort_order 都 +1
-UPDATE node_properties SET prop_value = (CAST(prop_value AS int) + 1)::text
-  WHERE prop_key = 'sort_order'
-    AND CAST(prop_value AS int) >= 23
-    AND node_id != 1138;
-
--- ========== 6. VALUE 节点属性:教育培训管理内容 ==========
--- 从 node 822 的 value_text 中提取"1)教育培训管理"部分
-INSERT INTO node_properties (id, node_id, prop_key, prop_value, prop_json, prop_number, prop_date, created_at, updated_at) VALUES
-(4420, 1139, 'value_text', '成都院制定并实施了《安全生产教育培训管理规定》(SQE.01C0203),明确人力资源部是公司安全生产教育培训工作归口管理部门,负责公司安全生产教育培训的实施及归口工作。
-成都院制定《公司2024年安全生产与职业健康、节能能源与生态环境保护教育培训工作计划》,培训包括上级对企业领导人员和安全管理人员培训、注册类和特种作业类培训、新员工三级安全教育培训、应急救援队伍专项培训以及分包单位现场负责人及主要管理人员轮训等内容。计划由刘建冰核定、鞠其凤批准、何彦锋签发。成都院按计划开展了相关培训计划,及时做好安全教育培训记录和档案管理工作,并对2024年已经开展的培训项目,进行了培训效果评价。', NULL, NULL, NULL, now(), now()),
-(4421, 1139, 'is_filled', 'true', NULL, NULL, NULL, now(), now()),
-(4422, 1139, 'fill_source', 'extract', NULL, NULL, NULL, now(), now())
-ON CONFLICT (id) DO NOTHING;
-
--- ========== 7. 更新 node 822 (employeeTraining) 的 value_text ==========
--- 去掉前面的"1)教育培训管理"部分,只保留"2)人员教育培训"部分
-UPDATE node_properties
-SET prop_value = '成都院主要负责人及安全管理人员均按要求参加培训并取得资格证书,如公司董事长何彦锋、总经理张世殊均取得安全生产考核合格证(A证),二级单位负责人雷军、刘兴强等取得安全生产考核合格证(B证),安全总监向林、安质环部主任刘建冰、安质环部副主任邱广东、专职安全管理人员李豆豆、黄凡等取得安全生产考核合格证(C证)等。成都院2024年已举办的住建系统安全管理"三类人员"复训,满足再培训学时等要求。
-成都院2024年安全生产与职业健康、节约能源与生态环境保护教育培训工作计划包括了从业人员培训或培训考核上岗相关培训,如:特种作业人员资质培训、住建和水利系统"三类人员"资质取证和延期教育培训、新员工安全教育培训和各级负责人安全履职能力培训,复训学时满足要求。
-成都院对2024年新员工开展了三级安全教育培训,参训234人,培训学时满足要求,有培训课件、试卷和成绩记录、培训效果评价,培训考核结果。成都院《安全生产教育培训管理规定》(SQE.01C0203)明确了转换岗人员、变换工种人员的安全教育培训要求。成都院《安全生产教育培训管理规定》(SQE.01C0203)明确了采用新技术、新工艺、新材料、新装备、新流程时的安全教育培训要求;经现场询问,成都院查评期内无新工艺、新技术、新材料、新设备设施投入使用情况。成都院特种作业建筑电工(15人)、爆破作业人员(23人)均在有效期内持证上岗,定期复审换证。2024年5月,公司应急救援队和公司西藏区域应急救援队共计58人参加了应急救援员(五级)国家职业资格鉴定培训。',
-    updated_at = now()
-WHERE node_id = 822 AND prop_key = 'value_text';
-
--- ========== 8. 更新序列值 ==========
-SELECT setval('nodes_id_seq', GREATEST(1139, (SELECT MAX(id) FROM nodes)));
-SELECT setval('edges_id_seq', GREATEST(2396, (SELECT MAX(id) FROM edges)));
-SELECT setval('node_properties_id_seq', GREATEST(4422, (SELECT MAX(id) FROM node_properties)));
-
-COMMIT;

+ 0 - 648
database/mock_47_elements.sql

@@ -1,648 +0,0 @@
--- 灵越智报 Mock 数据 (图数据库格式)
--- 生成时间: 2026-03-02
-
--- 项目节点
-INSERT INTO nodes (id, node_type, node_key, name, status, created_by) VALUES
-(10, 'PROJECT', 'PRJ-2024-001', '成都院2024年复审报告', 'draft', 1)
-ON CONFLICT (id) DO NOTHING;
-
--- 要素定义节点 (47个)
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (701, 'ELEMENT', 'basicInfo.projectCode', '项目编号', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (702, 'ELEMENT', 'basicInfo.requestLevel', '申请级别', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (703, 'ELEMENT', 'basicInfo.applyAt', '申请日期', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (704, 'ELEMENT', 'basicInfo.reviewObjectCertificateGetAt', '证书获取日期', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (705, 'ELEMENT', 'basicInfo.reviewObjectCertificate2GetAt', '二次证书获取日期', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (706, 'ELEMENT', 'basicInfo.reviewCategory', '申请类别', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (707, 'ELEMENT', 'basicInfo.reviewUnit', '评审单位', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (708, 'ELEMENT', 'project.reviewObject', '评审对象', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (709, 'ELEMENT', 'project.reviewObjectAlias', '评审对象简称', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (710, 'ELEMENT', 'project.resultScore', '评审得分', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (711, 'ELEMENT', 'project.resultLevel', '评审级别', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (712, 'ELEMENT', 'project.workStartAt', '评审开始日期', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (713, 'ELEMENT', 'project.workEndAt', '评审结束日期', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (714, 'ELEMENT', 'project.createdAt', '报告日期', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (715, 'ELEMENT', 'project.reviewPeriod', '评审周期', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (716, 'ELEMENT', 'project.closingMeetingAt', '末次评审会议时间', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (717, 'ELEMENT', 'project.reviewObjectSummary', '评审对象概况', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (718, 'ELEMENT', 'project.reviewObjectDescription', '评审对象描述', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (719, 'ELEMENT', 'project.reviewObjectSelfAssessmentProcess', '评审对象自评过程', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (720, 'ELEMENT', 'project.reviewRange', '复审范围', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (721, 'ELEMENT', 'project.reviewRangeShort', '复审范围简称', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (722, 'ELEMENT', 'project.target', '目标', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (723, 'ELEMENT', 'project.duty', '组织机构和职责', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (724, 'ELEMENT', 'project.fullParticipation', '全员参与', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (725, 'ELEMENT', 'project.safetyInvestment', '安全生产投入', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (726, 'ELEMENT', 'project.safetyCulture', '安全文化建设', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (727, 'ELEMENT', 'project.systematicManagement', '制度化管理', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (728, 'ELEMENT', 'project.trainingManagement', '教育培训管理', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (729, 'ELEMENT', 'project.employeeTraining', '人员教育培训', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (730, 'ELEMENT', 'project.assetManagement', '设备设施管理', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (731, 'ELEMENT', 'project.jobSafety', '作业安全', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (732, 'ELEMENT', 'project.positionQualified', '岗位达标', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (733, 'ELEMENT', 'project.partner', '相关方', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (734, 'ELEMENT', 'project.occupationalHealth', '职业健康', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (735, 'ELEMENT', 'project.riskAssessment', '风险辨识与评价', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (736, 'ELEMENT', 'project.majorHazardManagement', '重大危险源管理', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (737, 'ELEMENT', 'project.hazardInspection', '隐患排查', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (738, 'ELEMENT', 'project.changeManagement', '变更管理', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (739, 'ELEMENT', 'project.earlyWarning', '预测预警', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (740, 'ELEMENT', 'project.emergencyResponse', '应急救援', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (741, 'ELEMENT', 'project.incidentManagement', '事故管理', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (742, 'ELEMENT', 'project.continuousImprovement', '持续改进', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (743, 'ELEMENT', 'project.safetyStandardizationStatus', '安全生产标准化建设和持续运行情况', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (744, 'ELEMENT', 'project.safetyHighlight', '安全生产管理亮点', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (745, 'ELEMENT', 'project.workProcess', '现场复审工作过程', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (746, 'ELEMENT', 'project.moreWorkReference', '工作依据', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (747, 'ELEMENT', '+expert_list', '专家组成员表', 1) ON CONFLICT (id) DO NOTHING;
-
--- 要素定义属性
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (701, 'element_type', 'text') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (701, 'namespace', 'basicInfo') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (701, 'field_name', 'projectCode') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (701, 'required', true) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (702, 'element_type', 'text') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (702, 'namespace', 'basicInfo') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (702, 'field_name', 'requestLevel') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (702, 'required', true) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (703, 'element_type', 'text') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (703, 'namespace', 'basicInfo') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (703, 'field_name', 'applyAt') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (703, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (704, 'element_type', 'text') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (704, 'namespace', 'basicInfo') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (704, 'field_name', 'reviewObjectCertificateGetAt') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (704, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (705, 'element_type', 'text') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (705, 'namespace', 'basicInfo') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (705, 'field_name', 'reviewObjectCertificate2GetAt') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (705, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (706, 'element_type', 'text') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (706, 'namespace', 'basicInfo') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (706, 'field_name', 'reviewCategory') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (706, 'required', true) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (707, 'element_type', 'text') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (707, 'namespace', 'basicInfo') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (707, 'field_name', 'reviewUnit') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (707, 'required', true) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (708, 'element_type', 'text') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (708, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (708, 'field_name', 'reviewObject') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (708, 'required', true) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (709, 'element_type', 'text') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (709, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (709, 'field_name', 'reviewObjectAlias') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (709, 'required', true) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (710, 'element_type', 'text') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (710, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (710, 'field_name', 'resultScore') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (710, 'required', true) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (711, 'element_type', 'text') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (711, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (711, 'field_name', 'resultLevel') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (711, 'required', true) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (712, 'element_type', 'text') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (712, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (712, 'field_name', 'workStartAt') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (712, 'required', true) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (713, 'element_type', 'text') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (713, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (713, 'field_name', 'workEndAt') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (713, 'required', true) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (714, 'element_type', 'text') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (714, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (714, 'field_name', 'createdAt') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (714, 'required', true) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (715, 'element_type', 'text') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (715, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (715, 'field_name', 'reviewPeriod') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (715, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (716, 'element_type', 'text') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (716, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (716, 'field_name', 'closingMeetingAt') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (716, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (717, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (717, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (717, 'field_name', 'reviewObjectSummary') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (717, 'required', true) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (718, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (718, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (718, 'field_name', 'reviewObjectDescription') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (718, 'required', true) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (719, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (719, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (719, 'field_name', 'reviewObjectSelfAssessmentProcess') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (719, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (720, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (720, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (720, 'field_name', 'reviewRange') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (720, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (721, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (721, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (721, 'field_name', 'reviewRangeShort') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (721, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (722, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (722, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (722, 'field_name', 'target') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (722, 'required', true) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (723, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (723, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (723, 'field_name', 'duty') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (723, 'required', true) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (724, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (724, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (724, 'field_name', 'fullParticipation') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (724, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (725, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (725, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (725, 'field_name', 'safetyInvestment') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (725, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (726, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (726, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (726, 'field_name', 'safetyCulture') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (726, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (727, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (727, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (727, 'field_name', 'systematicManagement') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (727, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (728, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (728, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (728, 'field_name', 'trainingManagement') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (728, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (729, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (729, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (729, 'field_name', 'employeeTraining') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (729, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (730, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (730, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (730, 'field_name', 'assetManagement') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (730, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (731, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (731, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (731, 'field_name', 'jobSafety') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (731, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (732, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (732, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (732, 'field_name', 'positionQualified') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (732, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (733, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (733, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (733, 'field_name', 'partner') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (733, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (734, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (734, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (734, 'field_name', 'occupationalHealth') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (734, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (735, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (735, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (735, 'field_name', 'riskAssessment') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (735, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (736, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (736, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (736, 'field_name', 'majorHazardManagement') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (736, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (737, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (737, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (737, 'field_name', 'hazardInspection') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (737, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (738, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (738, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (738, 'field_name', 'changeManagement') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (738, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (739, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (739, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (739, 'field_name', 'earlyWarning') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (739, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (740, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (740, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (740, 'field_name', 'emergencyResponse') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (740, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (741, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (741, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (741, 'field_name', 'incidentManagement') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (741, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (742, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (742, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (742, 'field_name', 'continuousImprovement') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (742, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (743, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (743, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (743, 'field_name', 'safetyStandardizationStatus') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (743, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (744, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (744, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (744, 'field_name', 'safetyHighlight') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (744, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (745, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (745, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (745, 'field_name', 'workProcess') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (745, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (746, 'element_type', 'paragraph') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (746, 'namespace', 'project') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (746, 'field_name', 'moreWorkReference') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (746, 'required', false) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (747, 'element_type', 'table') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (747, 'field_name', 'expert_list') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (747, 'required', true) ON CONFLICT (node_id, prop_key) DO NOTHING;
-
--- 要素值节点 (47个)
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (801, 'VALUE', 'PRJ-2024-001:basicInfo.projectCode', '项目编号值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (802, 'VALUE', 'PRJ-2024-001:basicInfo.requestLevel', '申请级别值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (803, 'VALUE', 'PRJ-2024-001:basicInfo.applyAt', '申请日期值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (804, 'VALUE', 'PRJ-2024-001:basicInfo.reviewObjectCertificateGetAt', '证书获取日期值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (805, 'VALUE', 'PRJ-2024-001:basicInfo.reviewObjectCertificate2GetAt', '二次证书获取日期值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (806, 'VALUE', 'PRJ-2024-001:basicInfo.reviewCategory', '申请类别值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (807, 'VALUE', 'PRJ-2024-001:basicInfo.reviewUnit', '评审单位值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (808, 'VALUE', 'PRJ-2024-001:project.reviewObject', '评审对象值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (809, 'VALUE', 'PRJ-2024-001:project.reviewObjectAlias', '评审对象简称值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (810, 'VALUE', 'PRJ-2024-001:project.resultScore', '评审得分值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (811, 'VALUE', 'PRJ-2024-001:project.resultLevel', '评审级别值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (812, 'VALUE', 'PRJ-2024-001:project.workStartAt', '评审开始日期值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (813, 'VALUE', 'PRJ-2024-001:project.workEndAt', '评审结束日期值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (814, 'VALUE', 'PRJ-2024-001:project.createdAt', '报告日期值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (815, 'VALUE', 'PRJ-2024-001:project.reviewPeriod', '评审周期值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (816, 'VALUE', 'PRJ-2024-001:project.closingMeetingAt', '末次评审会议时间值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (817, 'VALUE', 'PRJ-2024-001:project.reviewObjectSummary', '评审对象概况值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (818, 'VALUE', 'PRJ-2024-001:project.reviewObjectDescription', '评审对象描述值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (819, 'VALUE', 'PRJ-2024-001:project.reviewObjectSelfAssessmentProcess', '评审对象自评过程值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (820, 'VALUE', 'PRJ-2024-001:project.reviewRange', '复审范围值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (821, 'VALUE', 'PRJ-2024-001:project.reviewRangeShort', '复审范围简称值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (822, 'VALUE', 'PRJ-2024-001:project.target', '目标值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (823, 'VALUE', 'PRJ-2024-001:project.duty', '组织机构和职责值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (824, 'VALUE', 'PRJ-2024-001:project.fullParticipation', '全员参与值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (825, 'VALUE', 'PRJ-2024-001:project.safetyInvestment', '安全生产投入值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (826, 'VALUE', 'PRJ-2024-001:project.safetyCulture', '安全文化建设值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (827, 'VALUE', 'PRJ-2024-001:project.systematicManagement', '制度化管理值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (828, 'VALUE', 'PRJ-2024-001:project.trainingManagement', '教育培训管理值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (829, 'VALUE', 'PRJ-2024-001:project.employeeTraining', '人员教育培训值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (830, 'VALUE', 'PRJ-2024-001:project.assetManagement', '设备设施管理值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (831, 'VALUE', 'PRJ-2024-001:project.jobSafety', '作业安全值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (832, 'VALUE', 'PRJ-2024-001:project.positionQualified', '岗位达标值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (833, 'VALUE', 'PRJ-2024-001:project.partner', '相关方值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (834, 'VALUE', 'PRJ-2024-001:project.occupationalHealth', '职业健康值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (835, 'VALUE', 'PRJ-2024-001:project.riskAssessment', '风险辨识与评价值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (836, 'VALUE', 'PRJ-2024-001:project.majorHazardManagement', '重大危险源管理值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (837, 'VALUE', 'PRJ-2024-001:project.hazardInspection', '隐患排查值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (838, 'VALUE', 'PRJ-2024-001:project.changeManagement', '变更管理值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (839, 'VALUE', 'PRJ-2024-001:project.earlyWarning', '预测预警值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (840, 'VALUE', 'PRJ-2024-001:project.emergencyResponse', '应急救援值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (841, 'VALUE', 'PRJ-2024-001:project.incidentManagement', '事故管理值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (842, 'VALUE', 'PRJ-2024-001:project.continuousImprovement', '持续改进值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (843, 'VALUE', 'PRJ-2024-001:project.safetyStandardizationStatus', '安全生产标准化建设和持续运行情况值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (844, 'VALUE', 'PRJ-2024-001:project.safetyHighlight', '安全生产管理亮点值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (845, 'VALUE', 'PRJ-2024-001:project.workProcess', '现场复审工作过程值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (846, 'VALUE', 'PRJ-2024-001:project.moreWorkReference', '工作依据值', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (847, 'VALUE', 'PRJ-2024-001:+expert_list', '专家组成员表值', 1) ON CONFLICT (id) DO NOTHING;
-
--- 要素值属性
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (801, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (801, 'value_text', 'BZ-0092-2024') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (801, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (802, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (802, 'value_text', '一级') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (802, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (803, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (803, 'value_text', '2024年7月8日') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (803, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (804, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (804, 'value_text', '2019年12月9日') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (804, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (805, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (805, 'value_text', '2015年4月7日') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (805, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (806, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (806, 'value_text', '电力勘测设计企业') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (806, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (807, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (807, 'value_text', '湖北安源安全环保科技有限公司') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (807, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (808, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (808, 'value_text', '中国电建集团成都勘测设计研究院有限公司') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (808, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (809, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (809, 'value_text', '成都院') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (809, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (810, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (810, 'value_text', '93.33') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (810, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (811, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (811, 'value_text', '一级') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (811, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (812, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (812, 'value_text', '2024年7月13日') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (812, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (813, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (813, 'value_text', '2024年10月17日') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (813, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (814, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (814, 'value_text', '2024年11月') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (814, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (815, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (815, 'value_text', '2023年7月8日-2024年7月8日') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (815, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (816, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (816, 'value_text', '2024年10月17日') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (816, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (817, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (817, 'value_text', '中国电建集团成都勘测设计研究院有限公司(简称:成都院)成立于2005年,是世界500强企业中国电力建设集团的核心成员企业。作为国家级高新技术企业,成都院以水利水电、新能源和基础设施为核心业务,在水电工程领域承担了金沙江、大渡河、雅砻江等重大河流的规划勘测设计工作,创造了多项"中国第一"和"世界之最"。成都院拥有注册资本50亿元人民币,专业技术人员规模近3000人,累计获得4443项专利和100项行业资质认证,展现了雄厚的技术研发实力。') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (817, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (818, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (818, 'value_text', '中国电建集团成都勘测设计研究院有限公司(简称:成都院)是中国电力建设集团核心成员企业,作为国内领先的清洁能源工程服务商,成都院在水利水电、新能源及基础设施领域具有突出优势。成都院深度参与了国家西部大开发和"西电东送"战略,承担了包括两河口水电站、杨房沟水电站、乌东德水电站等重大工程的勘测设计工作,其中两河口水电站拥有世界最高土石坝的纪录。') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (818, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (819, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (819, 'value_text', '成都院于2024年3月启动安全生产标准化复审自评工作,成立了以总经理为组长的自评工作领导小组,制定了详细的自评工作方案。自评工作历时3个月,覆盖公司本部及所有在建项目,共发现问题隐患127项,已全部完成整改。') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (819, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (820, 'is_filled', 'false') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (821, 'is_filled', 'false') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (822, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (822, 'value_text', '成都院制定并发布《QHSE"十四五"规划》(安质〔2023〕1号),明确了总体安全生产目标,包括7项安全管理及事故控制目标,总体目标为公司"十四五"规划的子规划,安全生产与职业健康工作目标纳入总体生产经营目标。成都院发布《关于印发<成都院2024年安全生产与职业健康、能源节约与生态环境保护工作目标和重点>的通知》(蓉设安质〔2024〕18号),明确了2024年安全生产与职业健康目标,包括9项安全管理目标和10项事故控制目标。') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (822, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (823, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (823, 'value_text', '成都院建立了完善的安全生产组织机构体系,设立了安全生产委员会作为最高决策机构,下设安全质量环保部作为专职管理部门。公司各级领导班子成员均签订了安全生产责任书,明确了"党政同责、一岗双责"的安全生产责任制。各部门、各项目部均配备了专(兼)职安全管理人员,形成了横向到边、纵向到底的安全管理网络。') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (823, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (824, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (824, 'value_text', '成都院建立了全员参与的安全生产管理机制,通过安全生产责任制的层层签订,将安全责任落实到每一位员工。公司定期组织安全生产培训和应急演练,提高全员安全意识和应急处置能力。建立了安全隐患举报奖励制度,鼓励员工积极参与安全管理。') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (824, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (825, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (825, 'value_text', '成都院严格执行安全生产费用提取和使用制度,按照规定比例提取安全生产费用,专款专用。2024年度安全生产投入总额达到2500万元,主要用于安全设施设备更新、安全培训教育、应急救援物资储备等方面。') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (825, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (826, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (826, 'value_text', '成都院积极推进安全文化建设,将安全理念融入企业文化体系。通过开展"安全生产月"、"安全知识竞赛"等活动,营造浓厚的安全文化氛围。建立了安全文化展示厅,展示公司安全发展历程和典型案例。') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (826, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (827, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (827, 'value_text', '成都院建立了完善的安全生产规章制度体系,涵盖安全生产责任制、安全生产管理制度、安全操作规程等方面。公司定期对制度进行评审和修订,确保制度的适用性和有效性。建立了制度执行情况检查机制,确保各项制度落实到位。') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (827, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (828, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (828, 'value_text', '成都院建立了完善的安全教育培训管理制度,制定了年度培训计划,明确了培训内容、培训对象和培训要求。公司设立了专门的培训管理部门,配备了专职培训管理人员,建立了培训档案管理系统。') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (828, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (829, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (829, 'value_text', '成都院严格执行三级安全教育培训制度,新员工入职必须完成公司级、部门级、班组级三级安全教育培训。特种作业人员全部持证上岗,证书有效期内复审率达到100%。2024年度共组织各类安全培训156次,培训人员达到8500人次。') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (829, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (830, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (830, 'value_text', '成都院建立了完善的设备设施管理制度,对所有生产设备设施实行台账管理。定期开展设备设施安全检查和维护保养,确保设备设施处于良好状态。特种设备全部按规定进行检验检测,检验合格率达到100%。') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (830, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (831, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (831, 'value_text', '成都院严格执行作业安全管理制度,对高风险作业实行作业许可制度。建立了作业风险分析和控制措施制度,作业前必须进行风险辨识和安全交底。配备了完善的个人防护用品,确保作业人员安全。') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (831, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (832, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (832, 'value_text', '成都院建立了岗位达标管理制度,明确了各岗位的安全生产职责和能力要求。定期开展岗位达标考核,考核结果与绩效挂钩。2024年度岗位达标率达到98%以上。') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (832, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (833, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (833, 'value_text', '成都院建立了相关方安全管理制度,对承包商、供应商等相关方实行准入管理。签订安全生产协议,明确双方安全责任。定期对相关方进行安全检查和评价,不合格的相关方及时清退。') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (833, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (834, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (834, 'value_text', '成都院建立了职业健康管理制度,定期开展职业病危害因素检测和员工职业健康体检。配备了完善的职业病防护设施和个人防护用品。建立了职业健康档案,实行动态管理。') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (834, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (835, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (835, 'value_text', '成都院建立了安全风险辨识与评价制度,定期开展全面的风险辨识和评价工作。建立了风险分级管控清单,明确了各级风险的管控措施和责任人。对重大风险实行挂牌督办,确保风险可控。') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (835, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (836, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (836, 'value_text', '成都院建立了重大危险源管理制度,对辨识出的重大危险源实行登记建档、定期检测、评估监控。制定了重大危险源应急预案,定期开展应急演练。') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (836, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (837, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (837, 'value_text', '成都院建立了隐患排查治理制度,实行分级排查、分类治理。建立了隐患排查治理信息系统,实现隐患的闭环管理。2024年度共排查隐患1256项,整改率达到100%。') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (837, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (838, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (838, 'value_text', '成都院建立了变更管理制度,对人员、设备、工艺、环境等方面的变更实行审批管理。变更前进行风险评估,变更后进行验收确认,确保变更安全可控。') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (838, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (839, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (839, 'value_text', '成都院建立了安全预测预警机制,利用信息化手段对安全生产状况进行实时监控和分析。建立了安全生产预警指标体系,及时发布预警信息,采取预防措施。') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (839, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (840, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (840, 'value_text', '成都院建立了完善的应急救援体系,制定了综合应急预案和专项应急预案。配备了应急救援物资和装备,建立了应急救援队伍。定期开展应急演练,提高应急处置能力。2024年度共组织应急演练32次。') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (840, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (841, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (841, 'value_text', '成都院建立了事故管理制度,明确了事故报告、调查、处理和统计分析的程序和要求。建立了事故案例库,定期开展事故案例学习和警示教育。复审期内未发生生产安全事故。') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (841, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (842, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (842, 'value_text', '成都院建立了安全生产持续改进机制,定期开展安全生产绩效评估和管理评审。根据评估结果制定改进措施,持续提升安全生产管理水平。建立了安全生产标准化建设长效机制,确保标准化工作持续有效运行。') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (842, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (843, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (843, 'value_text', '成都院自2015年首次通过电力勘测设计企业一级安全生产标准化评审以来,始终坚持标准化建设不放松,持续完善安全生产管理体系。公司将安全生产标准化建设纳入年度工作计划,定期开展自评和整改,确保标准化工作持续有效运行。') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (843, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (844, 'is_filled', 'true') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (844, 'value_text', '成都院在安全生产管理方面形成了多项亮点:一是建立了智慧安全管理平台,实现了安全管理信息化、智能化;二是创新了"安全+党建"工作模式,将安全工作与党建工作深度融合;三是建立了安全生产标准化建设长效机制,确保标准化工作持续有效运行。') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (844, 'fill_source', 'rule') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (845, 'is_filled', 'false') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (846, 'is_filled', 'false') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (847, 'is_filled', 'false') ON CONFLICT (node_id, prop_key) DO NOTHING;
-
--- HAS_ELEMENT 关系
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 701, 1) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 702, 2) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 703, 3) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 704, 4) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 705, 5) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 706, 6) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 707, 7) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 708, 8) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 709, 9) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 710, 10) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 711, 11) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 712, 12) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 713, 13) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 714, 14) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 715, 15) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 716, 16) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 717, 17) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 718, 18) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 719, 19) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 720, 20) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 721, 21) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 722, 22) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 723, 23) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 724, 24) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 725, 25) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 726, 26) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 727, 27) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 728, 28) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 729, 29) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 730, 30) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 731, 31) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 732, 32) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 733, 33) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 734, 34) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 735, 35) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 736, 36) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 737, 37) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 738, 38) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 739, 39) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 740, 40) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 741, 41) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 742, 42) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 743, 43) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 744, 44) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 745, 45) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 746, 46) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ELEMENT', 10, 747, 47) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-
--- HAS_VALUE 关系
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 801) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 802) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 803) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 804) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 805) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 806) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 807) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 808) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 809) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 810) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 811) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 812) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 813) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 814) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 815) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 816) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 817) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 818) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 819) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 820) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 821) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 822) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 823) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 824) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 825) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 826) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 827) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 828) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 829) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 830) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 831) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 832) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 833) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 834) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 835) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 836) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 837) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 838) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 839) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 840) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 841) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 842) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 843) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 844) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 845) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 846) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_VALUE', 10, 847) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-
--- FOR_ELEMENT 关系
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 801, 701) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 802, 702) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 803, 703) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 804, 704) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 805, 705) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 806, 706) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 807, 707) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 808, 708) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 809, 709) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 810, 710) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 811, 711) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 812, 712) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 813, 713) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 814, 714) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 815, 715) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 816, 716) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 817, 717) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 818, 718) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 819, 719) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 820, 720) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 821, 721) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 822, 722) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 823, 723) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 824, 724) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 825, 725) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 826, 726) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 827, 727) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 828, 728) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 829, 729) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 830, 730) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 831, 731) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 832, 732) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 833, 733) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 834, 734) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 835, 735) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 836, 736) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 837, 737) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 838, 738) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 839, 739) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 840, 740) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 841, 741) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 842, 742) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 843, 743) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 844, 744) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 845, 745) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 846, 746) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('FOR_ELEMENT', 847, 747) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-
--- 附件节点
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (400, 'ATTACHMENT', 'ATT-001', '01-复审通知', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (401, 'ATTACHMENT', 'ATT-002', '02-评审报告原文', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (402, 'ATTACHMENT', 'ATT-003', '03-安全标准化达标证书', 1) ON CONFLICT (id) DO NOTHING;
-
--- 附件属性
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (400, 'file_name', '复审通知.docx') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (400, 'parse_status', 'completed') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_number) VALUES (400, 'file_size', 102400) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (401, 'file_name', '评审报告.pdf') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (401, 'parse_status', 'completed') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_number) VALUES (401, 'file_size', 512000) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (402, 'file_name', '达标证书.pdf') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (402, 'parse_status', 'completed') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_number) VALUES (402, 'file_size', 256000) ON CONFLICT (node_id, prop_key) DO NOTHING;
-
--- HAS_ATTACHMENT 关系
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ATTACHMENT', 10, 400, 1) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ATTACHMENT', 10, 401, 2) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id, sort_order) VALUES ('HAS_ATTACHMENT', 10, 402, 3) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-
--- 实体节点
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (500, 'ENTITY', 'ORG:成都院', '中国电建集团成都勘测设计研究院有限公司', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (501, 'ENTITY', 'ORG:成都院简称', '成都院', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (502, 'ENTITY', 'CODE:BZ-0092-2024', 'BZ-0092-2024', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (503, 'ENTITY', 'DATE:开始', '2024年7月13日', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (504, 'ENTITY', 'DATE:结束', '2024年10月17日', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (505, 'ENTITY', 'NUMBER:得分', '93.33', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (506, 'ENTITY', 'DATE:申请', '2024年7月8日', 1) ON CONFLICT (id) DO NOTHING;
-INSERT INTO nodes (id, node_type, node_key, name, created_by) VALUES (507, 'ENTITY', 'DATE:证书', '2019年12月9日', 1) ON CONFLICT (id) DO NOTHING;
-
--- 实体属性
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (500, 'entity_type', 'ORG') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (500, 'business_label', '评审对象') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_number) VALUES (500, 'confidence', 0.95) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (501, 'entity_type', 'ORG') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (501, 'business_label', '评审对象简称') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_number) VALUES (501, 'confidence', 0.95) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (502, 'entity_type', 'CODE') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (502, 'business_label', '项目编号') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_number) VALUES (502, 'confidence', 0.95) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (503, 'entity_type', 'DATE') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (503, 'business_label', '评审开始日期') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_number) VALUES (503, 'confidence', 0.95) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (504, 'entity_type', 'DATE') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (504, 'business_label', '评审结束日期') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_number) VALUES (504, 'confidence', 0.95) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (505, 'entity_type', 'NUMBER') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (505, 'business_label', '评审得分') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_number) VALUES (505, 'confidence', 0.95) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (506, 'entity_type', 'DATE') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (506, 'business_label', '申请日期') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_number) VALUES (506, 'confidence', 0.95) ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (507, 'entity_type', 'DATE') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_value) VALUES (507, 'business_label', '证书获取日期') ON CONFLICT (node_id, prop_key) DO NOTHING;
-INSERT INTO node_properties (node_id, prop_key, prop_number) VALUES (507, 'confidence', 0.95) ON CONFLICT (node_id, prop_key) DO NOTHING;
-
--- HAS_ENTITY 关系
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_ENTITY', 400, 500) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_ENTITY', 400, 501) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_ENTITY', 400, 502) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_ENTITY', 400, 503) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_ENTITY', 400, 504) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_ENTITY', 400, 505) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_ENTITY', 400, 506) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-INSERT INTO edges (edge_type, from_node_id, to_node_id) VALUES ('HAS_ENTITY', 400, 507) ON CONFLICT (edge_type, from_node_id, to_node_id) DO NOTHING;
-
--- 更新序列
-SELECT setval('nodes_id_seq', (SELECT COALESCE(MAX(id), 1) FROM nodes));
-SELECT setval('edges_id_seq', (SELECT COALESCE(MAX(id), 1) FROM edges));
-SELECT setval('node_properties_id_seq', (SELECT COALESCE(MAX(id), 1) FROM node_properties));
-
-SELECT '47个要素 Mock 数据导入完成' AS result;