From 2a9e624ba9eb3dd23704b1bbc0f6c94045e3a241 Mon Sep 17 00:00:00 2001 From: wangys <3401275564@qq.com> Date: Tue, 2 Dec 2025 14:59:34 +0800 Subject: [PATCH] =?UTF-8?q?sql=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/数据库优化方案总结.md | 357 +++++++++++ docs/数据库表结构速查.md | 14 +- .../.bin/database/postgres/sql/README_INIT.md | 225 +++++++ .../postgres/sql/createTableAgent.sql | 560 +++++++++--------- .../database/postgres/sql/createTableAll.sql | 53 -- .../sql/createTableCustomerService.sql | 2 +- .../database/postgres/sql/createTableFile.sql | 50 +- .../postgres/sql/createTableKnowledge.sql | 38 +- .../database/postgres/sql/createTableLog.sql | 2 + .../postgres/sql/createTableMessage.sql | 48 ++ .../postgres/sql/createTablePermission.sql | 2 + .../database/postgres/sql/createTableUser.sql | 4 +- .../.bin/database/postgres/sql/initAll.sql | 64 +- .../database/postgres/sql/initDataConfig.sql | 43 +- .../database/postgres/sql/initDataMessage.sql | 118 ++++ .../postgres/sql/initDataPermission.sql | 286 +++++++++ .../database/postgres/sql/initDataUser.sql | 64 ++ .../database/postgres/sql/optimizations.sql | 549 ----------------- 18 files changed, 1542 insertions(+), 937 deletions(-) create mode 100644 docs/数据库优化方案总结.md create mode 100644 urbanLifelineServ/.bin/database/postgres/sql/README_INIT.md create mode 100644 urbanLifelineServ/.bin/database/postgres/sql/initDataMessage.sql create mode 100644 urbanLifelineServ/.bin/database/postgres/sql/initDataPermission.sql create mode 100644 urbanLifelineServ/.bin/database/postgres/sql/initDataUser.sql delete mode 100644 urbanLifelineServ/.bin/database/postgres/sql/optimizations.sql diff --git a/docs/数据库优化方案总结.md b/docs/数据库优化方案总结.md new file mode 100644 index 0000000..84a520f --- /dev/null +++ b/docs/数据库优化方案总结.md @@ -0,0 +1,357 @@ +# 城市生命线数据库优化方案总结 + +> 更新日期:2025-12-02 + +## 一、核心优化内容 + +### 1. 知识库版本管理(简化方案) + +#### 设计原则 +- 不创建额外的历史表或快照表 +- 直接在现有表中添加版本字段 +- 使用乐观锁防止并发编辑冲突 + +#### 文档表(tb_knowledge_document)新增字段 + +| 字段名 | 类型 | 默认值 | 说明 | +|--------|------|--------|------| +| `version` | INTEGER | 1 | 版本号(整数递增) | +| `root_doc_id` | VARCHAR(50) | NULL | 根文档ID(版本组标识,首次上传时等于doc_id) | +| `is_current` | BOOLEAN | true | 是否当前使用的版本 | + +**索引:** +```sql +CREATE INDEX idx_doc_root_current +ON knowledge.tb_knowledge_document(root_doc_id, is_current) +WHERE deleted = false; +``` + +#### 分段表(tb_knowledge_chunk)新增字段 + +| 字段名 | 类型 | 默认值 | 说明 | +|--------|------|--------|------| +| `version` | INTEGER | 1 | 分段版本号(用于乐观锁,每次编辑+1) | + +#### 使用示例 + +**创建新版本:** +```sql +-- 1. 标记旧版本为非当前 +UPDATE knowledge.tb_knowledge_document +SET is_current = false +WHERE root_doc_id = 'root_xxx'; + +-- 2. 插入新版本 +INSERT INTO knowledge.tb_knowledge_document ( + doc_id, root_doc_id, version, is_current, ... +) VALUES ( + 'new_doc_id', 'root_xxx', 2, true, ... +); +``` + +**编辑分段(乐观锁):** +```sql +UPDATE knowledge.tb_knowledge_chunk +SET content = '新内容', version = version + 1 +WHERE chunk_id = 'xxx' AND version = 1; -- 版本检查 +``` + +**查询当前版本:** +```sql +SELECT * FROM knowledge.tb_knowledge_document +WHERE root_doc_id = 'root_xxx' + AND is_current = true + AND deleted = false; +``` + +--- + +## 二、多服务数据隔离方案 + +### 设计原则 +- 使用 `dept_path` 实现部门/租户隔离(已有字段) +- 添加 `service_type` 实现服务间隔离 +- **不使用 tenant_id**(dept_path 已足够) + +### 隔离层级 + +| 隔离级别 | 字段 | 用途 | 示例 | +|---------|------|------|------| +| **服务级** | service_type | 区分不同业务服务 | bidding / customer_service / internal | +| **部门级** | dept_path | 区分部门/租户 | /dept1/subdept1/ | + +### 已添加 service_type 的表 + +| 表名 | 位置 | 说明 | +|------|------|------| +| `knowledge.tb_knowledge_base` | createTableKnowledge.sql | 知识库 | +| `knowledge.tb_knowledge_document` | createTableKnowledge.sql | 知识文档 | +| `file.tb_sys_file` | createTableFile.sql | 文件 | +| `file.tb_file_relation` | createTableFile.sql | 文件关联 | +| `message.tb_message` | createTableMessage.sql | 消息 | +| `message.tb_message_template` | createTableMessage.sql | 消息模板 | +| `log.tb_sys_log` | createTableLog.sql | 系统日志 | + +### 查询示例 + +```java +// 招投标服务查询 +public List getBiddingDocuments(String deptPath) { + return documentMapper.selectList( + new QueryWrapper() + .eq("service_type", "bidding") // 服务隔离 + .likeRight("dept_path", deptPath) // 部门隔离 + .eq("is_current", true) // 当前版本 + .eq("deleted", false) + .orderByDesc("create_time") + ); +} +``` + +--- + +## 三、知识库字段重命名 + +### 变更内容 + +将所有 `kb_id` 改为 `knowledge_id`,提升语义清晰度。 + +| 表名 | 变更 | +|------|------| +| `knowledge.tb_knowledge_base` | 主键:kb_id → knowledge_id | +| `knowledge.tb_knowledge_document` | 外键:kb_id → knowledge_id | +| `knowledge.tb_knowledge_chunk` | 外键:kb_id → knowledge_id | +| `knowledge.tb_knowledge_access_log` | 引用:kb_id → knowledge_id | +| `customer_service.tb_faq` | 引用:kb_id → knowledge_id | + +### 影响范围 + +- ✅ 所有外键约束已更新 +- ✅ 所有索引已更新 +- ✅ 文档速查表已更新 + +--- + +## 四、智能体关联 + +### 知识库表新增字段 + +```sql +ALTER TABLE knowledge.tb_knowledge_base +ADD COLUMN agent_id VARCHAR(50); -- 关联智能体ID +``` + +### 说明 +- 一个知识库可以关联一个智能体 +- 智能体可以通过此字段快速查找其知识库 +- 智能体表(tb_agent)当前已注释(暂不启用) + +--- + +## 五、数据库初始化脚本 + +### initAll.sql(简化版) + +```sql +-- ============================= +-- 城市生命线AI数智化平台 - 数据库初始化脚本 +-- 按顺序执行各模块建表SQL +-- ============================= +\i createDB.sql + +-- 1. 系统基础模块 +\i createTablePermission.sql +\i createTableUser.sql + +-- 2. 文件管理模块 +\i createTableFile.sql + +-- 3. 消息通知模块 +\i createTableMessage.sql + +-- 4. 日志模块 +\i createTableLog.sql + +-- 5. 配置管理模块 +\i createTableConfig.sql + +-- 6. 知识库管理模块 +\i createTableKnowledge.sql + +-- 7. 招投标业务模块 +\i createTableBidding.sql + +-- 8. 智能客服业务模块 +\i createTableCustomerService.sql + +-- 9. 智能体模块(暂不启用) +-- \i createTableAgent.sql +``` + +### 使用方式 + +```bash +# 进入PostgreSQL +psql -U postgres + +# 执行初始化 +\i /path/to/initAll.sql +``` + +--- + +## 六、测试/生产环境隔离方案 + +### 推荐方案:分别部署 + +``` +测试环境: +├── 应用服务器:test-server:8080 +├── 数据库:urbanlifeline_test +└── 配置:application-test.yml + +生产环境: +├── 应用服务器:prod-server:8080 +├── 数据库:urbanlifeline_prod +└── 配置:application-prod.yml +``` + +### 配置文件 + +**application-test.yml** +```yaml +spring: + datasource: + url: jdbc:postgresql://localhost:5432/urbanlifeline_test + username: postgres + password: test123 +``` + +**application-prod.yml** +```yaml +spring: + datasource: + url: jdbc:postgresql://localhost:5432/urbanlifeline_prod + username: postgres + password: prod123 +``` + +### 部署命令 + +```bash +# 测试服务器 +java -jar urbanlifeline.jar --spring.profiles.active=test + +# 生产服务器 +java -jar urbanlifeline.jar --spring.profiles.active=prod +``` + +### 优势 + +✅ **简单清晰**:物理隔离,无需代码改动 +✅ **安全可靠**:测试数据不会污染生产环境 +✅ **易于维护**:独立部署,互不影响 +✅ **性能独立**:测试压力不影响生产性能 + +--- + +## 七、SQL语法修复 + +### 修复内容 + +| 文件 | 问题 | 修复 | +|------|------|------| +| `createTableLog.sql` | 注释语句末尾使用逗号 | 改为分号 | +| `createTableMessage.sql` | service_type字段缺少逗号 | 添加逗号 | + +--- + +## 八、数据库表结构总览 + +### 核心表关系 + +``` +knowledge.tb_knowledge_base (知识库) + ├── agent_id → agent.tb_agent (智能体) + └── knowledge_id ← knowledge.tb_knowledge_document (文档) + ├── root_doc_id (版本组) + ├── version (版本号) + ├── is_current (当前版本) + └── knowledge_id ← knowledge.tb_knowledge_chunk (分段) + └── version (乐观锁版本) +``` + +### 隔离字段应用 + +``` +所有业务表 + ├── service_type (服务隔离:bidding/customer_service/internal) + └── dept_path (部门隔离:/dept1/subdept1/) +``` + +--- + +## 九、最佳实践建议 + +### 1. 版本管理 + +✅ 每次上传新文档时设置 `root_doc_id = doc_id` +✅ 创建新版本前,标记旧版本 `is_current = false` +✅ 编辑分段时始终检查 `version` 字段(乐观锁) + +### 2. 数据隔离 + +✅ 查询时始终添加 `service_type` 过滤 +✅ 使用 MyBatis 拦截器自动注入隔离条件 +✅ 敏感操作添加 `dept_path` 权限检查 + +### 3. 环境管理 + +✅ 测试/生产分别部署,使用不同数据库 +✅ 配置文件使用 Spring Profile 管理 +✅ Controller/Service/Mapper 层无需修改 + +--- + +## 十、待办事项 + +- [ ] 创建数据库迁移脚本(旧表 → 新表) +- [ ] 编写单元测试验证版本管理功能 +- [ ] 配置 MyBatis 拦截器自动注入 service_type +- [ ] 准备生产环境部署文档 +- [ ] 知识库数据导入/导出工具开发 + +--- + +## 附录:完整字段对照表 + +### tb_knowledge_document 字段清单 + +| 字段名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| doc_id | VARCHAR(50) | ✅ | 文档ID(主键) | +| knowledge_id | VARCHAR(50) | ✅ | 知识库ID | +| title | VARCHAR(500) | ✅ | 文档标题 | +| **version** | **INTEGER** | ✅ | **版本号(新增)** | +| **root_doc_id** | **VARCHAR(50)** | - | **根文档ID(新增)** | +| **is_current** | **BOOLEAN** | ✅ | **是否当前版本(新增)** | +| **service_type** | **VARCHAR(50)** | - | **服务类型(新增)** | +| dept_path | VARCHAR(255) | - | 部门路径 | +| deleted | BOOLEAN | ✅ | 软删除标记 | + +### tb_knowledge_chunk 字段清单 + +| 字段名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| chunk_id | VARCHAR(50) | ✅ | 分段ID(主键) | +| doc_id | VARCHAR(50) | ✅ | 文档ID | +| knowledge_id | VARCHAR(50) | ✅ | 知识库ID | +| content | TEXT | ✅ | 分段内容 | +| **version** | **INTEGER** | ✅ | **版本号(乐观锁,新增)** | +| embedding | vector(1536) | - | 向量嵌入 | +| deleted | BOOLEAN | ✅ | 软删除标记 | + +--- + +**文档生成时间:** 2025-12-02 +**最后更新:** 知识库版本管理、多服务隔离、字段重命名 diff --git a/docs/数据库表结构速查.md b/docs/数据库表结构速查.md index 3572de8..6db9d4a 100644 --- a/docs/数据库表结构速查.md +++ b/docs/数据库表结构速查.md @@ -200,10 +200,10 @@ ORDER BY order_num; | 表名 | 说明 | 主键 | 核心字段 | |------|------|------|----------| -| `tb_knowledge_base` | 知识库表 | kb_id | name, kb_type, access_level, version | -| `tb_knowledge_document` | 知识文档表 | doc_id | kb_id, title, doc_type, category, embedding_status | -| `tb_knowledge_chunk` | 文档片段表 | chunk_id | doc_id, kb_id, content, embedding | -| `tb_knowledge_access_log` | 知识访问日志表 | log_id | kb_id, doc_id, user_id, access_type | +| `tb_knowledge_base` | 知识库表 | knowledge_id | name, kb_type, access_level, version | +| `tb_knowledge_document` | 知识文档表 | doc_id | knowledge_id, title, doc_type, category, embedding_status | +| `tb_knowledge_chunk` | 文档片段表 | chunk_id | doc_id, knowledge_id, content, embedding | +| `tb_knowledge_access_log` | 知识访问日志表 | log_id | knowledge_id, doc_id, user_id, access_type | ### 知识库类型 @@ -233,8 +233,8 @@ ORDER BY order_num; -- 查询知识库文档 SELECT d.*, kb.name AS kb_name FROM knowledge.tb_knowledge_document d -JOIN knowledge.tb_knowledge_base kb ON d.kb_id = kb.kb_id -WHERE d.kb_id = 'KB_ID' +JOIN knowledge.tb_knowledge_base kb ON d.knowledge_id = kb.knowledge_id +WHERE d.knowledge_id = 'knowledge_id' AND d.embedding_status = 'completed' AND d.deleted = false; @@ -242,7 +242,7 @@ WHERE d.kb_id = 'KB_ID' -- SELECT chunk_id, content, -- 1 - (embedding <=> '[查询向量]'::vector) AS similarity -- FROM knowledge.tb_knowledge_chunk --- WHERE kb_id = 'KB_ID' +-- WHERE knowledge_id = 'knowledge_id' -- ORDER BY embedding <=> '[查询向量]'::vector -- LIMIT 10; ``` diff --git a/urbanLifelineServ/.bin/database/postgres/sql/README_INIT.md b/urbanLifelineServ/.bin/database/postgres/sql/README_INIT.md new file mode 100644 index 0000000..307bfbb --- /dev/null +++ b/urbanLifelineServ/.bin/database/postgres/sql/README_INIT.md @@ -0,0 +1,225 @@ +# 数据库初始化说明 + +## 概述 + +本目录包含城市生命线AI数智化平台的数据库初始化脚本,用于创建表结构和插入基础数据。 + +## 文件说明 + +### 表结构创建脚本 + +| 文件名 | 说明 | +|--------|------| +| `createDB.sql` | 创建数据库 | +| `createTablePermission.sql` | 创建权限相关表(部门、角色、权限、视图、ACL等) | +| `createTableUser.sql` | 创建用户相关表(用户、用户信息、登录日志) | +| `createTableFile.sql` | 创建文件管理表 | +| `createTableMessage.sql` | 创建消息通知表 | +| `createTableLog.sql` | 创建日志表 | +| `createTableConfig.sql` | 创建配置管理表 | +| `createTableKnowledge.sql` | 创建知识库表 | +| `createTableBidding.sql` | 创建招投标业务表 | +| `createTableCustomerService.sql` | 创建智能客服表 | +| `createTableAgent.sql` | 创建智能体表(暂不启用) | + +### 数据初始化脚本 + +| 文件名 | 说明 | 是否必需 | +|--------|------|----------| +| `initDataPermission.sql` | 初始化权限基础数据(部门、角色、权限、视图、模块) | ✅ 必需 | +| `initDataUser.sql` | 初始化用户数据(管理员账户、演示用户) | ✅ 必需 | +| `initDataMessage.sql` | 初始化消息渠道配置和模板 | ✅ 必需 | +| `initDataConfig.sql` | 初始化系统配置参数 | ✅ 必需 | + +### 总入口脚本 + +- `initAll.sql` - 一键执行所有建表和初始化脚本 + +## 使用方法 + +### 方式一:使用总入口脚本(推荐) + +```bash +# 进入 PostgreSQL 命令行 +psql -U postgres + +# 执行总初始化脚本 +\i /path/to/urbanLifelineServ/.bin/database/postgres/sql/initAll.sql +``` + +### 方式二:分步执行 + +#### 第一步:创建表结构 + +```bash +# 创建数据库 +\i createDB.sql + +# 创建各模块表结构 +\i createTablePermission.sql +\i createTableUser.sql +\i createTableFile.sql +\i createTableMessage.sql +\i createTableLog.sql +\i createTableConfig.sql +\i createTableKnowledge.sql +\i createTableBidding.sql +\i createTableCustomerService.sql +``` + +#### 第二步:初始化基础数据 + +```bash +# 按顺序执行初始化脚本 +\i initDataPermission.sql +\i initDataUser.sql +\i initDataMessage.sql +\i initDataConfig.sql +``` + +## 初始化数据说明 + +### 1. 权限基础数据 (initDataPermission.sql) + +**初始化内容:** +- **根部门**:dept_root +- **全局角色**: + - 超级管理员 (role_super_admin) - 拥有所有权限 + - 系统管理员 (role_system_admin) - 拥有系统管理权限 + - 普通用户 (role_user) - 基础查看和操作权限 + - 访客 (role_guest) - 仅查看权限 + +- **系统模块**: + - 系统管理 (mod_system) + - 文件管理 (mod_file) + - 消息通知 (mod_message) + - 配置管理 (mod_config) + - 知识库 (mod_knowledge) + - 招投标 (mod_bidding) + - 智能客服 (mod_customer_service) + +- **系统权限**:30+ 个基础权限,涵盖用户、角色、部门、权限、文件、消息、配置管理 + +- **系统视图(菜单)**: + - 系统管理菜单及其子菜单 + - 业务管理菜单框架 + +### 2. 用户数据 (initDataUser.sql) + +**初始化账户:** + +| 用户 | 账号 | 默认密码 | 角色 | 说明 | +|------|------|----------|------|------| +| 系统管理员 | admin | admin123 | 超级管理员 | 拥有所有权限 | +| 演示用户 | demo | admin123 | 普通用户 | 用于演示和测试 | + +**⚠️ 安全提示:** +- 生产环境部署前,必须修改默认密码 +- 密码使用 bcrypt 加密存储 +- 建议删除演示用户账户 + +### 3. 消息渠道配置 (initDataMessage.sql) + +**初始化内容:** +- **消息渠道**(默认禁用,需配置后启用): + - 应用内消息 (app) - 默认启用 + - 短信通知 (sms) + - 邮件通知 (email) + - 微信公众号 (wechat_official_account) + - 微信小程序 (wechat_applet) + - 钉钉通知 (dingtalk) + +- **消息模板**: + - 用户注册欢迎 + - 密码重置通知 + - 系统维护通知 + - 工单创建通知 + - 招标公告发布 + +### 4. 系统配置 (initDataConfig.sql) + +**初始化配置分组:** +- **站点配置**:站点名称、Logo、ICP备案 +- **国际化**:默认语言、时区 +- **安全认证**:密码策略、JWT过期时间、会话超时、注册开关 +- **存储上传**:最大上传大小、存储后端、存储路径 +- **通知配置**:邮件SMTP、短信服务商 +- **日志审计**:日志级别、审计日志保留天数 +- **平台特性**:维护模式、ACL策略开关 + +## 注意事项 + +1. **执行顺序**:必须按照 `initAll.sql` 中的顺序执行,先创建表结构,再插入数据 +2. **依赖关系**:初始化数据脚本有依赖关系,必须按顺序执行 +3. **数据库权限**:执行脚本需要具有创建数据库、创建表、插入数据的权限 +4. **字符编码**:确保数据库使用 UTF-8 编码 +5. **时区设置**:建议数据库时区设置为 Asia/Shanghai 或 UTC + +## 验证初始化结果 + +执行以下 SQL 验证初始化是否成功: + +```sql +-- 检查表是否创建成功 +SELECT schemaname, tablename +FROM pg_tables +WHERE schemaname IN ('sys', 'file', 'message', 'config') +ORDER BY schemaname, tablename; + +-- 检查角色数量 +SELECT COUNT(*) as role_count FROM sys.tb_sys_role WHERE deleted = false; +-- 预期结果:4 + +-- 检查权限数量 +SELECT COUNT(*) as permission_count FROM sys.tb_sys_permission WHERE deleted = false; +-- 预期结果:30+ + +-- 检查用户数量 +SELECT COUNT(*) as user_count FROM sys.tb_sys_user WHERE deleted = false; +-- 预期结果:2 + +-- 检查消息渠道数量 +SELECT COUNT(*) as channel_count FROM message.tb_message_channel WHERE deleted = false; +-- 预期结果:6 + +-- 检查系统配置数量 +SELECT COUNT(*) as config_count FROM config.tb_sys_config WHERE deleted = false; +-- 预期结果:20+ +``` + +## 重置数据库 + +如需重新初始化数据库,可以执行以下操作: + +```sql +-- 删除所有 schema(谨慎操作!) +DROP SCHEMA IF EXISTS sys CASCADE; +DROP SCHEMA IF EXISTS file CASCADE; +DROP SCHEMA IF EXISTS message CASCADE; +DROP SCHEMA IF EXISTS config CASCADE; +DROP SCHEMA IF EXISTS knowledge CASCADE; +DROP SCHEMA IF EXISTS bidding CASCADE; +DROP SCHEMA IF EXISTS customer_service CASCADE; +DROP SCHEMA IF EXISTS log CASCADE; + +-- 然后重新执行 initAll.sql +\i initAll.sql +``` + +## 常见问题 + +### Q: 执行初始化脚本报错 "relation already exists" +A: 表已存在,可以选择删除对应的表或 schema 后重新执行 + +### Q: 如何修改管理员默认密码? +A: 修改 `initDataUser.sql` 中的 password 字段,使用 bcrypt 加密后的密码哈希 + +### Q: 如何自定义初始化数据? +A: 直接修改对应的 `initData*.sql` 文件,按照现有格式添加或修改数据 + +### Q: 业务表(知识库、招投标、客服)需要初始化数据吗? +A: 不需要,这些表的数据在系统运行时动态产生 + +## 联系支持 + +如有问题,请联系技术支持团队。 diff --git a/urbanLifelineServ/.bin/database/postgres/sql/createTableAgent.sql b/urbanLifelineServ/.bin/database/postgres/sql/createTableAgent.sql index 8d5100f..ac8897b 100644 --- a/urbanLifelineServ/.bin/database/postgres/sql/createTableAgent.sql +++ b/urbanLifelineServ/.bin/database/postgres/sql/createTableAgent.sql @@ -1,308 +1,306 @@ --- ============================= --- 智能体管理和平台基础设施模块 --- 支持:智能体广场、API集成管理、智能体运维监控 --- ============================= -CREATE SCHEMA IF NOT EXISTS agent; +-- -- ============================= +-- -- 智能体管理和平台基础设施模块 +-- -- 支持:智能体广场、API集成管理、智能体运维监控 +-- -- ============================= +-- CREATE SCHEMA IF NOT EXISTS agent; --- 智能体定义表 -DROP TABLE IF EXISTS agent.tb_agent CASCADE; -CREATE TABLE agent.tb_agent ( - optsn VARCHAR(50) NOT NULL, -- 流水号 - agent_id VARCHAR(50) NOT NULL, -- 智能体ID - agent_code VARCHAR(100) NOT NULL, -- 智能体编码(唯一标识) - agent_name VARCHAR(255) NOT NULL, -- 智能体名称 - agent_type VARCHAR(50) NOT NULL, -- 智能体类型:bidding-招投标/customer_service-客服/knowledge_assistant-知识助手/custom-自定义 - display_name VARCHAR(255) NOT NULL, -- 展示名称 - description TEXT, -- 智能体描述 - icon VARCHAR(500), -- 图标URL - banner VARCHAR(500), -- Banner图URL - version VARCHAR(20) DEFAULT '1.0.0', -- 版本号 - model_provider VARCHAR(50), -- 模型提供商:openai/anthropic/baidu/aliyun/custom - model_name VARCHAR(100), -- 模型名称 - model_config JSONB, -- 模型配置(温度、最大tokens等) - prompt_template TEXT, -- 提示词模板 - system_prompt TEXT, -- 系统提示词 - kb_ids VARCHAR(50)[], -- 关联知识库ID数组 - tool_ids VARCHAR(50)[], -- 关联工具ID数组 - capabilities TEXT[], -- 能力列表 - access_level VARCHAR(20) DEFAULT 'private', -- 访问级别:public-公开/private-私有/internal-内部 - is_published BOOLEAN DEFAULT false, -- 是否发布到智能体广场 - usage_count INTEGER DEFAULT 0, -- 使用次数 - rating DECIMAL(3,2) DEFAULT 0, -- 评分(0-5) - rating_count INTEGER DEFAULT 0, -- 评分人数 - tags TEXT[], -- 标签数组 - category VARCHAR(100), -- 分类 - dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 - owner_user_id VARCHAR(50), -- 所有者用户ID - status VARCHAR(20) DEFAULT 'active', -- 状态:active-激活/inactive-停用/under_maintenance-维护中 - creator VARCHAR(50) DEFAULT NULL, -- 创建者 - updater VARCHAR(50) DEFAULT NULL, -- 更新者 - create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 - update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 - delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 - deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 - PRIMARY KEY (agent_id), - UNIQUE (optsn), - UNIQUE (agent_code) -); +-- -- 智能体定义表 +-- DROP TABLE IF EXISTS agent.tb_agent CASCADE; +-- CREATE TABLE agent.tb_agent ( +-- optsn VARCHAR(50) NOT NULL, -- 流水号 +-- agent_id VARCHAR(50) NOT NULL, -- 智能体ID +-- agent_code VARCHAR(100) NOT NULL, -- 智能体编码(唯一标识) +-- agent_name VARCHAR(255) NOT NULL, -- 智能体名称 +-- agent_type VARCHAR(50) NOT NULL, -- 智能体类型:bidding-招投标/customer_service-客服/knowledge_assistant-知识助手/custom-自定义 +-- display_name VARCHAR(255) NOT NULL, -- 展示名称 +-- description TEXT, -- 智能体描述 +-- icon VARCHAR(500), -- 图标URL +-- banner VARCHAR(500), -- Banner图URL +-- version VARCHAR(20) DEFAULT '1.0.0', -- 版本号 +-- model_provider VARCHAR(50), -- 模型提供商:openai/anthropic/baidu/aliyun/custom +-- model_name VARCHAR(100), -- 模型名称 +-- model_config JSONB, -- 模型配置(温度、最大tokens等) +-- prompt_template TEXT, -- 提示词模板 +-- system_prompt TEXT, -- 系统提示词 +-- capabilities TEXT[], -- 能力列表 +-- access_level VARCHAR(20) DEFAULT 'private', -- 访问级别:public-公开/private-私有/internal-内部 +-- is_published BOOLEAN DEFAULT false, -- 是否发布到智能体广场 +-- usage_count INTEGER DEFAULT 0, -- 使用次数 +-- rating DECIMAL(3,2) DEFAULT 0, -- 评分(0-5) +-- rating_count INTEGER DEFAULT 0, -- 评分人数 +-- tags TEXT[], -- 标签数组 +-- category VARCHAR(100), -- 分类 +-- dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 +-- owner_user_id VARCHAR(50), -- 所有者用户ID +-- status VARCHAR(20) DEFAULT 'active', -- 状态:active-激活/inactive-停用/under_maintenance-维护中 +-- creator VARCHAR(50) DEFAULT NULL, -- 创建者 +-- updater VARCHAR(50) DEFAULT NULL, -- 更新者 +-- create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 +-- update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 +-- delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 +-- deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 +-- PRIMARY KEY (agent_id), +-- UNIQUE (optsn), +-- UNIQUE (agent_code) +-- ); -CREATE INDEX idx_agent_type ON agent.tb_agent(agent_type) WHERE deleted = false; -CREATE INDEX idx_agent_published ON agent.tb_agent(is_published) WHERE deleted = false AND is_published = true; -CREATE INDEX idx_agent_category ON agent.tb_agent(category) WHERE deleted = false; +-- CREATE INDEX idx_agent_type ON agent.tb_agent(agent_type) WHERE deleted = false; +-- CREATE INDEX idx_agent_published ON agent.tb_agent(is_published) WHERE deleted = false AND is_published = true; +-- CREATE INDEX idx_agent_category ON agent.tb_agent(category) WHERE deleted = false; -COMMENT ON TABLE agent.tb_agent IS '智能体定义表'; -COMMENT ON COLUMN agent.tb_agent.agent_type IS '智能体类型:bidding/customer_service/knowledge_assistant/custom'; +-- COMMENT ON TABLE agent.tb_agent IS '智能体定义表'; +-- COMMENT ON COLUMN agent.tb_agent.agent_type IS '智能体类型:bidding/customer_service/knowledge_assistant/custom'; --- 智能体会话表 -DROP TABLE IF EXISTS agent.tb_agent_session CASCADE; -CREATE TABLE agent.tb_agent_session ( - optsn VARCHAR(50) NOT NULL, -- 流水号 - session_id VARCHAR(50) NOT NULL, -- 会话ID - agent_id VARCHAR(50) NOT NULL, -- 智能体ID - user_id VARCHAR(50) NOT NULL, -- 用户ID - session_type VARCHAR(30) DEFAULT 'chat', -- 会话类型:chat-对话/task-任务/workflow-工作流 - session_name VARCHAR(255), -- 会话名称 - context JSONB, -- 会话上下文 - session_status VARCHAR(20) DEFAULT 'active', -- 会话状态:active-活跃/paused-暂停/ended-结束 - start_time TIMESTAMPTZ DEFAULT now(), -- 开始时间 - end_time TIMESTAMPTZ, -- 结束时间 - message_count INTEGER DEFAULT 0, -- 消息数量 - token_usage INTEGER DEFAULT 0, -- Token使用量 - cost DECIMAL(10,4) DEFAULT 0, -- 成本 - dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 - creator VARCHAR(50) DEFAULT NULL, -- 创建者 - create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 - update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 - deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 - PRIMARY KEY (session_id), - UNIQUE (optsn), - FOREIGN KEY (agent_id) REFERENCES agent.tb_agent(agent_id) -); +-- -- 智能体会话表 +-- DROP TABLE IF EXISTS agent.tb_agent_session CASCADE; +-- CREATE TABLE agent.tb_agent_session ( +-- optsn VARCHAR(50) NOT NULL, -- 流水号 +-- session_id VARCHAR(50) NOT NULL, -- 会话ID +-- agent_id VARCHAR(50) NOT NULL, -- 智能体ID +-- user_id VARCHAR(50) NOT NULL, -- 用户ID +-- session_type VARCHAR(30) DEFAULT 'chat', -- 会话类型:chat-对话/task-任务/workflow-工作流 +-- session_name VARCHAR(255), -- 会话名称 +-- context JSONB, -- 会话上下文 +-- session_status VARCHAR(20) DEFAULT 'active', -- 会话状态:active-活跃/paused-暂停/ended-结束 +-- start_time TIMESTAMPTZ DEFAULT now(), -- 开始时间 +-- end_time TIMESTAMPTZ, -- 结束时间 +-- message_count INTEGER DEFAULT 0, -- 消息数量 +-- token_usage INTEGER DEFAULT 0, -- Token使用量 +-- cost DECIMAL(10,4) DEFAULT 0, -- 成本 +-- dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 +-- creator VARCHAR(50) DEFAULT NULL, -- 创建者 +-- create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 +-- update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 +-- deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 +-- PRIMARY KEY (session_id), +-- UNIQUE (optsn), +-- FOREIGN KEY (agent_id) REFERENCES agent.tb_agent(agent_id) +-- ); -CREATE INDEX idx_session_agent ON agent.tb_agent_session(agent_id) WHERE deleted = false; -CREATE INDEX idx_session_user ON agent.tb_agent_session(user_id) WHERE deleted = false; +-- CREATE INDEX idx_session_agent ON agent.tb_agent_session(agent_id) WHERE deleted = false; +-- CREATE INDEX idx_session_user ON agent.tb_agent_session(user_id) WHERE deleted = false; -COMMENT ON TABLE agent.tb_agent_session IS '智能体会话表'; +-- COMMENT ON TABLE agent.tb_agent_session IS '智能体会话表'; --- 智能体消息表 -DROP TABLE IF EXISTS agent.tb_agent_message CASCADE; -CREATE TABLE agent.tb_agent_message ( - optsn VARCHAR(50) NOT NULL, -- 流水号 - message_id VARCHAR(50) NOT NULL, -- 消息ID - session_id VARCHAR(50) NOT NULL, -- 会话ID - agent_id VARCHAR(50) NOT NULL, -- 智能体ID - role VARCHAR(20) NOT NULL, -- 角色:user-用户/assistant-助手/system-系统/function-函数 - content TEXT, -- 消息内容 - content_type VARCHAR(30) DEFAULT 'text', -- 内容类型:text-文本/image-图片/file-文件/structured-结构化数据 - function_call JSONB, -- 函数调用(JSON格式) - function_response JSONB, -- 函数响应 - token_count INTEGER, -- Token数量 - model_name VARCHAR(100), -- 使用的模型 - kb_references JSONB, -- 知识库引用(JSON数组) - metadata JSONB, -- 消息元数据 - dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 - create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 - deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 - PRIMARY KEY (message_id), - UNIQUE (optsn), - FOREIGN KEY (session_id) REFERENCES agent.tb_agent_session(session_id), - FOREIGN KEY (agent_id) REFERENCES agent.tb_agent(agent_id) -); +-- -- 智能体消息表 +-- DROP TABLE IF EXISTS agent.tb_agent_message CASCADE; +-- CREATE TABLE agent.tb_agent_message ( +-- optsn VARCHAR(50) NOT NULL, -- 流水号 +-- message_id VARCHAR(50) NOT NULL, -- 消息ID +-- session_id VARCHAR(50) NOT NULL, -- 会话ID +-- agent_id VARCHAR(50) NOT NULL, -- 智能体ID +-- role VARCHAR(20) NOT NULL, -- 角色:user-用户/assistant-助手/system-系统/function-函数 +-- content TEXT, -- 消息内容 +-- content_type VARCHAR(30) DEFAULT 'text', -- 内容类型:text-文本/image-图片/file-文件/structured-结构化数据 +-- function_call JSONB, -- 函数调用(JSON格式) +-- function_response JSONB, -- 函数响应 +-- token_count INTEGER, -- Token数量 +-- model_name VARCHAR(100), -- 使用的模型 +-- kb_references JSONB, -- 知识库引用(JSON数组) +-- metadata JSONB, -- 消息元数据 +-- dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 +-- create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 +-- deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 +-- PRIMARY KEY (message_id), +-- UNIQUE (optsn), +-- FOREIGN KEY (session_id) REFERENCES agent.tb_agent_session(session_id), +-- FOREIGN KEY (agent_id) REFERENCES agent.tb_agent(agent_id) +-- ); -CREATE INDEX idx_msg_session ON agent.tb_agent_message(session_id, create_time) WHERE deleted = false; -CREATE INDEX idx_msg_agent ON agent.tb_agent_message(agent_id) WHERE deleted = false; +-- CREATE INDEX idx_msg_session ON agent.tb_agent_message(session_id, create_time) WHERE deleted = false; +-- CREATE INDEX idx_msg_agent ON agent.tb_agent_message(agent_id) WHERE deleted = false; -COMMENT ON TABLE agent.tb_agent_message IS '智能体消息表'; +-- COMMENT ON TABLE agent.tb_agent_message IS '智能体消息表'; --- 智能体工具表 -DROP TABLE IF EXISTS agent.tb_agent_tool CASCADE; -CREATE TABLE agent.tb_agent_tool ( - optsn VARCHAR(50) NOT NULL, -- 流水号 - tool_id VARCHAR(50) NOT NULL, -- 工具ID - tool_code VARCHAR(100) NOT NULL, -- 工具编码 - tool_name VARCHAR(255) NOT NULL, -- 工具名称 - tool_type VARCHAR(50) NOT NULL, -- 工具类型:api-API调用/function-函数/plugin-插件/integration-集成 - description TEXT, -- 工具描述 - function_schema JSONB, -- 函数Schema(OpenAI function calling格式) - api_endpoint VARCHAR(500), -- API端点 - api_method VARCHAR(10), -- API方法:GET/POST/PUT/DELETE - api_headers JSONB, -- API请求头 - auth_type VARCHAR(30), -- 认证类型:none/api_key/oauth2/bearer - auth_config JSONB, -- 认证配置(加密存储) - request_template TEXT, -- 请求模板 - response_template TEXT, -- 响应模板 - timeout_seconds INTEGER DEFAULT 30, -- 超时时间(秒) - retry_count INTEGER DEFAULT 3, -- 重试次数 - is_enabled BOOLEAN DEFAULT true, -- 是否启用 - usage_count INTEGER DEFAULT 0, -- 使用次数 - dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 - creator VARCHAR(50) DEFAULT NULL, -- 创建者 - updater VARCHAR(50) DEFAULT NULL, -- 更新者 - create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 - update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 - delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 - deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 - PRIMARY KEY (tool_id), - UNIQUE (optsn), - UNIQUE (tool_code) -); +-- -- 智能体工具表 +-- DROP TABLE IF EXISTS agent.tb_agent_tool CASCADE; +-- CREATE TABLE agent.tb_agent_tool ( +-- optsn VARCHAR(50) NOT NULL, -- 流水号 +-- tool_id VARCHAR(50) NOT NULL, -- 工具ID +-- tool_code VARCHAR(100) NOT NULL, -- 工具编码 +-- tool_name VARCHAR(255) NOT NULL, -- 工具名称 +-- tool_type VARCHAR(50) NOT NULL, -- 工具类型:api-API调用/function-函数/plugin-插件/integration-集成 +-- description TEXT, -- 工具描述 +-- function_schema JSONB, -- 函数Schema(OpenAI function calling格式) +-- api_endpoint VARCHAR(500), -- API端点 +-- api_method VARCHAR(10), -- API方法:GET/POST/PUT/DELETE +-- api_headers JSONB, -- API请求头 +-- auth_type VARCHAR(30), -- 认证类型:none/api_key/oauth2/bearer +-- auth_config JSONB, -- 认证配置(加密存储) +-- request_template TEXT, -- 请求模板 +-- response_template TEXT, -- 响应模板 +-- timeout_seconds INTEGER DEFAULT 30, -- 超时时间(秒) +-- retry_count INTEGER DEFAULT 3, -- 重试次数 +-- is_enabled BOOLEAN DEFAULT true, -- 是否启用 +-- usage_count INTEGER DEFAULT 0, -- 使用次数 +-- dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 +-- creator VARCHAR(50) DEFAULT NULL, -- 创建者 +-- updater VARCHAR(50) DEFAULT NULL, -- 更新者 +-- create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 +-- update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 +-- delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 +-- deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 +-- PRIMARY KEY (tool_id), +-- UNIQUE (optsn), +-- UNIQUE (tool_code) +-- ); -CREATE INDEX idx_tool_type ON agent.tb_agent_tool(tool_type) WHERE deleted = false; +-- CREATE INDEX idx_tool_type ON agent.tb_agent_tool(tool_type) WHERE deleted = false; -COMMENT ON TABLE agent.tb_agent_tool IS '智能体工具表'; +-- COMMENT ON TABLE agent.tb_agent_tool IS '智能体工具表'; --- API集成注册表 -DROP TABLE IF EXISTS agent.tb_api_integration CASCADE; -CREATE TABLE agent.tb_api_integration ( - optsn VARCHAR(50) NOT NULL, -- 流水号 - integration_id VARCHAR(50) NOT NULL, -- 集成ID - integration_name VARCHAR(255) NOT NULL, -- 集成名称 - integration_type VARCHAR(50) NOT NULL, -- 集成类型:rest_api/soap/graphql/webhook/mq - provider VARCHAR(100), -- 提供商 - base_url VARCHAR(500), -- 基础URL - version VARCHAR(20), -- API版本 - auth_type VARCHAR(30) DEFAULT 'none', -- 认证类型 - auth_config JSONB, -- 认证配置(加密存储) - endpoints JSONB, -- 端点列表(JSON数组) - rate_limit INTEGER, -- 速率限制(请求/秒) - timeout_seconds INTEGER DEFAULT 30, -- 超时时间 - retry_config JSONB, -- 重试配置 - health_check_url VARCHAR(500), -- 健康检查URL - health_status VARCHAR(20) DEFAULT 'unknown', -- 健康状态:healthy-健康/unhealthy-不健康/unknown-未知 - last_health_check TIMESTAMPTZ, -- 最后健康检查时间 - documentation_url VARCHAR(500), -- 文档URL - is_enabled BOOLEAN DEFAULT true, -- 是否启用 - dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 - creator VARCHAR(50) DEFAULT NULL, -- 创建者 - updater VARCHAR(50) DEFAULT NULL, -- 更新者 - create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 - update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 - delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 - deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 - PRIMARY KEY (integration_id), - UNIQUE (optsn) -); +-- -- API集成注册表 +-- DROP TABLE IF EXISTS agent.tb_api_integration CASCADE; +-- CREATE TABLE agent.tb_api_integration ( +-- optsn VARCHAR(50) NOT NULL, -- 流水号 +-- integration_id VARCHAR(50) NOT NULL, -- 集成ID +-- integration_name VARCHAR(255) NOT NULL, -- 集成名称 +-- integration_type VARCHAR(50) NOT NULL, -- 集成类型:rest_api/soap/graphql/webhook/mq +-- provider VARCHAR(100), -- 提供商 +-- base_url VARCHAR(500), -- 基础URL +-- version VARCHAR(20), -- API版本 +-- auth_type VARCHAR(30) DEFAULT 'none', -- 认证类型 +-- auth_config JSONB, -- 认证配置(加密存储) +-- endpoints JSONB, -- 端点列表(JSON数组) +-- rate_limit INTEGER, -- 速率限制(请求/秒) +-- timeout_seconds INTEGER DEFAULT 30, -- 超时时间 +-- retry_config JSONB, -- 重试配置 +-- health_check_url VARCHAR(500), -- 健康检查URL +-- health_status VARCHAR(20) DEFAULT 'unknown', -- 健康状态:healthy-健康/unhealthy-不健康/unknown-未知 +-- last_health_check TIMESTAMPTZ, -- 最后健康检查时间 +-- documentation_url VARCHAR(500), -- 文档URL +-- is_enabled BOOLEAN DEFAULT true, -- 是否启用 +-- dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 +-- creator VARCHAR(50) DEFAULT NULL, -- 创建者 +-- updater VARCHAR(50) DEFAULT NULL, -- 更新者 +-- create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 +-- update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 +-- delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 +-- deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 +-- PRIMARY KEY (integration_id), +-- UNIQUE (optsn) +-- ); -CREATE INDEX idx_integration_type ON agent.tb_api_integration(integration_type) WHERE deleted = false; -CREATE INDEX idx_integration_health ON agent.tb_api_integration(health_status) WHERE deleted = false; +-- CREATE INDEX idx_integration_type ON agent.tb_api_integration(integration_type) WHERE deleted = false; +-- CREATE INDEX idx_integration_health ON agent.tb_api_integration(health_status) WHERE deleted = false; -COMMENT ON TABLE agent.tb_api_integration IS 'API集成注册表'; +-- COMMENT ON TABLE agent.tb_api_integration IS 'API集成注册表'; --- API调用日志表 -DROP TABLE IF EXISTS agent.tb_api_call_log CASCADE; -CREATE TABLE agent.tb_api_call_log ( - optsn VARCHAR(50) NOT NULL, -- 流水号 - log_id VARCHAR(50) NOT NULL, -- 日志ID - integration_id VARCHAR(50), -- 集成ID - tool_id VARCHAR(50), -- 工具ID - agent_id VARCHAR(50), -- 智能体ID - session_id VARCHAR(50), -- 会话ID - user_id VARCHAR(50), -- 用户ID - endpoint VARCHAR(500) NOT NULL, -- 请求端点 - method VARCHAR(10) NOT NULL, -- 请求方法 - request_headers JSONB, -- 请求头 - request_body TEXT, -- 请求体 - response_status INTEGER, -- 响应状态码 - response_headers JSONB, -- 响应头 - response_body TEXT, -- 响应体 - duration_ms INTEGER, -- 请求耗时(毫秒) - is_success BOOLEAN, -- 是否成功 - error_message TEXT, -- 错误信息 - retry_count INTEGER DEFAULT 0, -- 重试次数 - ip_address VARCHAR(45), -- IP地址 - dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 - create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 - PRIMARY KEY (log_id), - UNIQUE (optsn) -); +-- -- API调用日志表 +-- DROP TABLE IF EXISTS agent.tb_api_call_log CASCADE; +-- CREATE TABLE agent.tb_api_call_log ( +-- optsn VARCHAR(50) NOT NULL, -- 流水号 +-- log_id VARCHAR(50) NOT NULL, -- 日志ID +-- integration_id VARCHAR(50), -- 集成ID +-- tool_id VARCHAR(50), -- 工具ID +-- agent_id VARCHAR(50), -- 智能体ID +-- session_id VARCHAR(50), -- 会话ID +-- user_id VARCHAR(50), -- 用户ID +-- endpoint VARCHAR(500) NOT NULL, -- 请求端点 +-- method VARCHAR(10) NOT NULL, -- 请求方法 +-- request_headers JSONB, -- 请求头 +-- request_body TEXT, -- 请求体 +-- response_status INTEGER, -- 响应状态码 +-- response_headers JSONB, -- 响应头 +-- response_body TEXT, -- 响应体 +-- duration_ms INTEGER, -- 请求耗时(毫秒) +-- is_success BOOLEAN, -- 是否成功 +-- error_message TEXT, -- 错误信息 +-- retry_count INTEGER DEFAULT 0, -- 重试次数 +-- ip_address VARCHAR(45), -- IP地址 +-- dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 +-- create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 +-- PRIMARY KEY (log_id), +-- UNIQUE (optsn) +-- ); -CREATE INDEX idx_api_log_integration ON agent.tb_api_call_log(integration_id, create_time DESC); -CREATE INDEX idx_api_log_agent ON agent.tb_api_call_log(agent_id, create_time DESC); -CREATE INDEX idx_api_log_status ON agent.tb_api_call_log(is_success, create_time DESC); +-- CREATE INDEX idx_api_log_integration ON agent.tb_api_call_log(integration_id, create_time DESC); +-- CREATE INDEX idx_api_log_agent ON agent.tb_api_call_log(agent_id, create_time DESC); +-- CREATE INDEX idx_api_log_status ON agent.tb_api_call_log(is_success, create_time DESC); -COMMENT ON TABLE agent.tb_api_call_log IS 'API调用日志表'; +-- COMMENT ON TABLE agent.tb_api_call_log IS 'API调用日志表'; --- 智能体监控指标表 -DROP TABLE IF EXISTS agent.tb_agent_metrics CASCADE; -CREATE TABLE agent.tb_agent_metrics ( - optsn VARCHAR(50) NOT NULL, -- 流水号 - metric_id VARCHAR(50) NOT NULL, -- 指标ID - agent_id VARCHAR(50) NOT NULL, -- 智能体ID - metric_date DATE NOT NULL, -- 指标日期 - metric_hour INTEGER, -- 指标小时(0-23) - total_sessions INTEGER DEFAULT 0, -- 总会话数 - active_sessions INTEGER DEFAULT 0, -- 活跃会话数 - total_messages INTEGER DEFAULT 0, -- 总消息数 - total_tokens BIGINT DEFAULT 0, -- 总Token数 - total_cost DECIMAL(10,4) DEFAULT 0, -- 总成本 - avg_response_time INTEGER, -- 平均响应时间(毫秒) - success_rate DECIMAL(5,4), -- 成功率 - error_count INTEGER DEFAULT 0, -- 错误次数 - api_call_count INTEGER DEFAULT 0, -- API调用次数 - avg_rating DECIMAL(3,2), -- 平均评分 - rating_count INTEGER DEFAULT 0, -- 评分数量 - dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 - create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 - update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 - PRIMARY KEY (metric_id), - UNIQUE (optsn), - UNIQUE (agent_id, metric_date, metric_hour), - FOREIGN KEY (agent_id) REFERENCES agent.tb_agent(agent_id) -); +-- -- 智能体监控指标表 +-- DROP TABLE IF EXISTS agent.tb_agent_metrics CASCADE; +-- CREATE TABLE agent.tb_agent_metrics ( +-- optsn VARCHAR(50) NOT NULL, -- 流水号 +-- metric_id VARCHAR(50) NOT NULL, -- 指标ID +-- agent_id VARCHAR(50) NOT NULL, -- 智能体ID +-- metric_date DATE NOT NULL, -- 指标日期 +-- metric_hour INTEGER, -- 指标小时(0-23) +-- total_sessions INTEGER DEFAULT 0, -- 总会话数 +-- active_sessions INTEGER DEFAULT 0, -- 活跃会话数 +-- total_messages INTEGER DEFAULT 0, -- 总消息数 +-- total_tokens BIGINT DEFAULT 0, -- 总Token数 +-- total_cost DECIMAL(10,4) DEFAULT 0, -- 总成本 +-- avg_response_time INTEGER, -- 平均响应时间(毫秒) +-- success_rate DECIMAL(5,4), -- 成功率 +-- error_count INTEGER DEFAULT 0, -- 错误次数 +-- api_call_count INTEGER DEFAULT 0, -- API调用次数 +-- avg_rating DECIMAL(3,2), -- 平均评分 +-- rating_count INTEGER DEFAULT 0, -- 评分数量 +-- dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 +-- create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 +-- update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 +-- PRIMARY KEY (metric_id), +-- UNIQUE (optsn), +-- UNIQUE (agent_id, metric_date, metric_hour), +-- FOREIGN KEY (agent_id) REFERENCES agent.tb_agent(agent_id) +-- ); -CREATE INDEX idx_metrics_agent_date ON agent.tb_agent_metrics(agent_id, metric_date DESC); +-- CREATE INDEX idx_metrics_agent_date ON agent.tb_agent_metrics(agent_id, metric_date DESC); -COMMENT ON TABLE agent.tb_agent_metrics IS '智能体监控指标表'; +-- COMMENT ON TABLE agent.tb_agent_metrics IS '智能体监控指标表'; --- 智能体异常日志表 -DROP TABLE IF EXISTS agent.tb_agent_error_log CASCADE; -CREATE TABLE agent.tb_agent_error_log ( - optsn VARCHAR(50) NOT NULL, -- 流水号 - log_id VARCHAR(50) NOT NULL, -- 日志ID - agent_id VARCHAR(50) NOT NULL, -- 智能体ID - session_id VARCHAR(50), -- 会话ID - error_type VARCHAR(50) NOT NULL, -- 错误类型:model_error-模型错误/api_error-API错误/timeout-超时/rate_limit-限流/other-其他 - error_code VARCHAR(50), -- 错误代码 - error_message TEXT NOT NULL, -- 错误信息 - stack_trace TEXT, -- 堆栈跟踪 - request_context JSONB, -- 请求上下文 - severity VARCHAR(20) DEFAULT 'error', -- 严重级别:critical-致命/error-错误/warning-警告 - is_resolved BOOLEAN DEFAULT false, -- 是否已解决 - resolution_notes TEXT, -- 解决方案备注 - dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 - create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 - resolve_time TIMESTAMPTZ, -- 解决时间 - PRIMARY KEY (log_id), - UNIQUE (optsn), - FOREIGN KEY (agent_id) REFERENCES agent.tb_agent(agent_id) -); +-- -- 智能体异常日志表 +-- DROP TABLE IF EXISTS agent.tb_agent_error_log CASCADE; +-- CREATE TABLE agent.tb_agent_error_log ( +-- optsn VARCHAR(50) NOT NULL, -- 流水号 +-- log_id VARCHAR(50) NOT NULL, -- 日志ID +-- agent_id VARCHAR(50) NOT NULL, -- 智能体ID +-- session_id VARCHAR(50), -- 会话ID +-- error_type VARCHAR(50) NOT NULL, -- 错误类型:model_error-模型错误/api_error-API错误/timeout-超时/rate_limit-限流/other-其他 +-- error_code VARCHAR(50), -- 错误代码 +-- error_message TEXT NOT NULL, -- 错误信息 +-- stack_trace TEXT, -- 堆栈跟踪 +-- request_context JSONB, -- 请求上下文 +-- severity VARCHAR(20) DEFAULT 'error', -- 严重级别:critical-致命/error-错误/warning-警告 +-- is_resolved BOOLEAN DEFAULT false, -- 是否已解决 +-- resolution_notes TEXT, -- 解决方案备注 +-- dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 +-- create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 +-- resolve_time TIMESTAMPTZ, -- 解决时间 +-- PRIMARY KEY (log_id), +-- UNIQUE (optsn), +-- FOREIGN KEY (agent_id) REFERENCES agent.tb_agent(agent_id) +-- ); -CREATE INDEX idx_error_agent ON agent.tb_agent_error_log(agent_id, create_time DESC); -CREATE INDEX idx_error_severity ON agent.tb_agent_error_log(severity) WHERE is_resolved = false; +-- CREATE INDEX idx_error_agent ON agent.tb_agent_error_log(agent_id, create_time DESC); +-- CREATE INDEX idx_error_severity ON agent.tb_agent_error_log(severity) WHERE is_resolved = false; -COMMENT ON TABLE agent.tb_agent_error_log IS '智能体异常日志表'; +-- COMMENT ON TABLE agent.tb_agent_error_log IS '智能体异常日志表'; --- 智能体评价表 -DROP TABLE IF EXISTS agent.tb_agent_rating CASCADE; -CREATE TABLE agent.tb_agent_rating ( - optsn VARCHAR(50) NOT NULL, -- 流水号 - rating_id VARCHAR(50) NOT NULL, -- 评价ID - agent_id VARCHAR(50) NOT NULL, -- 智能体ID - session_id VARCHAR(50), -- 会话ID - user_id VARCHAR(50) NOT NULL, -- 用户ID - rating INTEGER NOT NULL, -- 评分(1-5星) - dimensions JSONB, -- 分维度评分(准确性、速度、友好度等) - feedback TEXT, -- 评价反馈 - tags TEXT[], -- 标签 - is_anonymous BOOLEAN DEFAULT false, -- 是否匿名 - dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 - create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 - deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 - PRIMARY KEY (rating_id), - UNIQUE (optsn), - FOREIGN KEY (agent_id) REFERENCES agent.tb_agent(agent_id) -); +-- -- 智能体评价表 +-- DROP TABLE IF EXISTS agent.tb_agent_rating CASCADE; +-- CREATE TABLE agent.tb_agent_rating ( +-- optsn VARCHAR(50) NOT NULL, -- 流水号 +-- rating_id VARCHAR(50) NOT NULL, -- 评价ID +-- agent_id VARCHAR(50) NOT NULL, -- 智能体ID +-- session_id VARCHAR(50), -- 会话ID +-- user_id VARCHAR(50) NOT NULL, -- 用户ID +-- rating INTEGER NOT NULL, -- 评分(1-5星) +-- dimensions JSONB, -- 分维度评分(准确性、速度、友好度等) +-- feedback TEXT, -- 评价反馈 +-- tags TEXT[], -- 标签 +-- is_anonymous BOOLEAN DEFAULT false, -- 是否匿名 +-- dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 +-- create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 +-- deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 +-- PRIMARY KEY (rating_id), +-- UNIQUE (optsn), +-- FOREIGN KEY (agent_id) REFERENCES agent.tb_agent(agent_id) +-- ); -CREATE INDEX idx_rating_agent ON agent.tb_agent_rating(agent_id) WHERE deleted = false; +-- CREATE INDEX idx_rating_agent ON agent.tb_agent_rating(agent_id) WHERE deleted = false; -COMMENT ON TABLE agent.tb_agent_rating IS '智能体评价表'; +-- COMMENT ON TABLE agent.tb_agent_rating IS '智能体评价表'; diff --git a/urbanLifelineServ/.bin/database/postgres/sql/createTableAll.sql b/urbanLifelineServ/.bin/database/postgres/sql/createTableAll.sql index f935c55..62abb2b 100644 --- a/urbanLifelineServ/.bin/database/postgres/sql/createTableAll.sql +++ b/urbanLifelineServ/.bin/database/postgres/sql/createTableAll.sql @@ -55,59 +55,6 @@ CREATE EXTENSION IF NOT EXISTS "btree_gin"; -- GIN索引支持 -- ============================= \i createTableAgent.sql --- ============================= --- 创建通用触发器函数 --- ============================= - --- 自动更新update_time的触发器函数 -CREATE OR REPLACE FUNCTION public.update_modified_column() -RETURNS TRIGGER AS $$ -BEGIN - NEW.update_time = now(); - RETURN NEW; -END; -$$ LANGUAGE plpgsql; - --- 为所有表添加update_time触发器的辅助函数 -CREATE OR REPLACE FUNCTION public.create_update_triggers() -RETURNS void AS $$ -DECLARE - r RECORD; -BEGIN - FOR r IN - SELECT schemaname, tablename - FROM pg_tables - WHERE schemaname IN ('sys', 'file', 'message', 'log', 'config', 'knowledge', 'bidding', 'customer_service', 'agent') - AND tablename LIKE 'tb_%' - LOOP - -- 检查表是否有update_time列 - IF EXISTS ( - SELECT 1 - FROM information_schema.columns - WHERE table_schema = r.schemaname - AND table_name = r.tablename - AND column_name = 'update_time' - ) THEN - -- 删除已存在的触发器 - EXECUTE format('DROP TRIGGER IF EXISTS trg_%s_update_time ON %I.%I', - r.tablename, r.schemaname, r.tablename); - - -- 创建新触发器 - EXECUTE format('CREATE TRIGGER trg_%s_update_time - BEFORE UPDATE ON %I.%I - FOR EACH ROW - EXECUTE FUNCTION public.update_modified_column()', - r.tablename, r.schemaname, r.tablename); - - RAISE NOTICE 'Created trigger for %.%', r.schemaname, r.tablename; - END IF; - END LOOP; -END; -$$ LANGUAGE plpgsql; - --- 执行触发器创建 -SELECT public.create_update_triggers(); - -- ============================= -- 创建视图 -- ============================= diff --git a/urbanLifelineServ/.bin/database/postgres/sql/createTableCustomerService.sql b/urbanLifelineServ/.bin/database/postgres/sql/createTableCustomerService.sql index 80ee316..ce8d082 100644 --- a/urbanLifelineServ/.bin/database/postgres/sql/createTableCustomerService.sql +++ b/urbanLifelineServ/.bin/database/postgres/sql/createTableCustomerService.sql @@ -207,7 +207,7 @@ DROP TABLE IF EXISTS customer_service.tb_faq CASCADE; CREATE TABLE customer_service.tb_faq ( optsn VARCHAR(50) NOT NULL, -- 流水号 faq_id VARCHAR(50) NOT NULL, -- FAQ ID - kb_id VARCHAR(50), -- 关联知识库ID + knowledge_id VARCHAR(50), -- 关联知识库ID category VARCHAR(100) NOT NULL, -- 分类 question TEXT NOT NULL, -- 问题 answer TEXT NOT NULL, -- 答案 diff --git a/urbanLifelineServ/.bin/database/postgres/sql/createTableFile.sql b/urbanLifelineServ/.bin/database/postgres/sql/createTableFile.sql index a0c62ab..9644395 100644 --- a/urbanLifelineServ/.bin/database/postgres/sql/createTableFile.sql +++ b/urbanLifelineServ/.bin/database/postgres/sql/createTableFile.sql @@ -12,6 +12,7 @@ CREATE TABLE file.tb_sys_file ( mime_type VARCHAR(255) NOT NULL, -- 文件MIME类型 url VARCHAR(255) NOT NULL, -- 文件URL status VARCHAR(50) NOT NULL, -- 文件状态 + service_type VARCHAR(50), -- 服务类型(bidding/customer_service/internal等) dept_path VARCHAR(255) NOT NULL, -- 当前部门路径 creator VARCHAR(50) DEFAULT NULL, -- 创建者 updater VARCHAR(50) DEFAULT NULL, -- 更新者 @@ -22,7 +23,10 @@ CREATE TABLE file.tb_sys_file ( PRIMARY KEY (file_id), UNIQUE (optsn) ); +CREATE INDEX idx_file_service ON file.tb_sys_file(service_type) WHERE deleted = false; + COMMENT ON TABLE file.tb_sys_file IS '文件表'; +COMMENT ON COLUMN file.tb_sys_file.service_type IS '服务类型(用于服务间数据隔离)'; COMMENT ON COLUMN file.tb_sys_file.optsn IS '流水号'; COMMENT ON COLUMN file.tb_sys_file.file_id IS '文件ID'; COMMENT ON COLUMN file.tb_sys_file.name IS '文件名'; @@ -39,4 +43,48 @@ COMMENT ON COLUMN file.tb_sys_file.updater IS '更新者'; COMMENT ON COLUMN file.tb_sys_file.create_time IS '创建时间'; COMMENT ON COLUMN file.tb_sys_file.update_time IS '更新时间'; COMMENT ON COLUMN file.tb_sys_file.delete_time IS '删除时间'; -COMMENT ON COLUMN file.tb_sys_file.deleted IS '是否删除'; \ No newline at end of file +COMMENT ON COLUMN file.tb_sys_file.deleted IS '是否删除'; + +-- ============================= +-- 文件关联表 +-- ============================= +DROP TABLE IF EXISTS file.tb_file_relation CASCADE; +CREATE TABLE file.tb_file_relation ( + optsn VARCHAR(50) NOT NULL, + relation_id VARCHAR(50) NOT NULL, + file_id VARCHAR(50) NOT NULL, + object_type VARCHAR(50) NOT NULL, -- 对象类型:bidding_project/ticket/document等 + object_id VARCHAR(50) NOT NULL, -- 对象ID + relation_type VARCHAR(30) DEFAULT 'attachment', -- 关联类型:attachment-附件/avatar-头像/banner-横幅 + order_num INTEGER DEFAULT 0, -- 排序号 + service_type VARCHAR(50), -- 服务类型(继承自object_type) + creator VARCHAR(50) DEFAULT NULL, -- 创建者 + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (relation_id), + UNIQUE (optsn), + FOREIGN KEY (file_id) REFERENCES file.tb_sys_file(file_id) +); + +COMMENT ON TABLE file.tb_file_relation IS '文件关联表'; +COMMENT ON COLUMN file.tb_file_relation.optsn IS '流水号'; +COMMENT ON COLUMN file.tb_file_relation.relation_id IS '关联ID'; +COMMENT ON COLUMN file.tb_file_relation.file_id IS '文件ID'; +COMMENT ON COLUMN file.tb_file_relation.object_type IS '对象类型:bidding_project/ticket/document等'; +COMMENT ON COLUMN file.tb_file_relation.object_id IS '对象ID'; +COMMENT ON COLUMN file.tb_file_relation.relation_type IS '关联类型:attachment-附件/avatar-头像/banner-横幅'; +COMMENT ON COLUMN file.tb_file_relation.order_num IS '排序号'; +COMMENT ON COLUMN file.tb_file_relation.service_type IS '服务类型(继承自object_type)'; +COMMENT ON COLUMN file.tb_file_relation.creator IS '创建者'; +COMMENT ON COLUMN file.tb_file_relation.updater IS '更新者'; +COMMENT ON COLUMN file.tb_file_relation.create_time IS '创建时间'; +COMMENT ON COLUMN file.tb_file_relation.update_time IS '更新时间'; +COMMENT ON COLUMN file.tb_file_relation.delete_time IS '删除时间'; +COMMENT ON COLUMN file.tb_file_relation.deleted IS '是否删除'; + +CREATE INDEX idx_file_relation_object ON file.tb_file_relation(object_type, object_id) WHERE deleted = false; +CREATE INDEX idx_file_relation_file ON file.tb_file_relation(file_id) WHERE deleted = false; +CREATE INDEX idx_file_relation_service ON file.tb_file_relation(service_type) WHERE deleted = false; \ No newline at end of file diff --git a/urbanLifelineServ/.bin/database/postgres/sql/createTableKnowledge.sql b/urbanLifelineServ/.bin/database/postgres/sql/createTableKnowledge.sql index 6dcf624..df5b614 100644 --- a/urbanLifelineServ/.bin/database/postgres/sql/createTableKnowledge.sql +++ b/urbanLifelineServ/.bin/database/postgres/sql/createTableKnowledge.sql @@ -8,7 +8,8 @@ CREATE SCHEMA IF NOT EXISTS knowledge; DROP TABLE IF EXISTS knowledge.tb_knowledge_base CASCADE; CREATE TABLE knowledge.tb_knowledge_base ( optsn VARCHAR(50) NOT NULL, -- 流水号 - kb_id VARCHAR(50) NOT NULL, -- 知识库ID + agent_id VARCHAR(50) NOT NULL, -- 智能体id + knowledge_id VARCHAR(50) NOT NULL, -- 知识库ID name VARCHAR(255) NOT NULL, -- 知识库名称 kb_type VARCHAR(50) NOT NULL, -- 知识库类型:bidding-招投标/customer_service-客服/internal-内部协同 access_level VARCHAR(20) NOT NULL DEFAULT 'private', -- 访问级别:public-公开/private-私有/internal-内部 @@ -16,6 +17,7 @@ CREATE TABLE knowledge.tb_knowledge_base ( storage_path VARCHAR(500), -- 存储路径 version VARCHAR(20) DEFAULT '1.0', -- 当前版本号 config JSONB DEFAULT NULL, -- 知识库配置(JSON格式:索引配置、检索参数等) + service_type VARCHAR(50), -- 服务类型(bidding/customer_service/internal,冗余kb_type便于查询) dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 status VARCHAR(20) NOT NULL DEFAULT 'active', -- 状态:active-激活/inactive-停用/archived-归档 creator VARCHAR(50) DEFAULT NULL, -- 创建者 @@ -24,15 +26,17 @@ CREATE TABLE knowledge.tb_knowledge_base ( update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 - PRIMARY KEY (kb_id), + PRIMARY KEY (knowledge_id), UNIQUE (optsn) ); CREATE INDEX idx_kb_type ON knowledge.tb_knowledge_base(kb_type) WHERE deleted = false; +CREATE INDEX idx_kb_service ON knowledge.tb_knowledge_base(service_type) WHERE deleted = false; CREATE INDEX idx_kb_dept_path ON knowledge.tb_knowledge_base(dept_path) WHERE deleted = false; COMMENT ON TABLE knowledge.tb_knowledge_base IS '知识库表'; COMMENT ON COLUMN knowledge.tb_knowledge_base.kb_type IS '知识库类型:bidding-招投标/customer_service-客服/internal-内部协同'; +COMMENT ON COLUMN knowledge.tb_knowledge_base.service_type IS '服务类型(冗余存储便于快速过滤,与kb_type保持一致)'; COMMENT ON COLUMN knowledge.tb_knowledge_base.access_level IS '访问级别:public-公开/private-私有/internal-内部'; -- 知识文档表 @@ -40,7 +44,7 @@ DROP TABLE IF EXISTS knowledge.tb_knowledge_document CASCADE; CREATE TABLE knowledge.tb_knowledge_document ( optsn VARCHAR(50) NOT NULL, -- 流水号 doc_id VARCHAR(50) NOT NULL, -- 文档ID - kb_id VARCHAR(50) NOT NULL, -- 所属知识库ID + knowledge_id VARCHAR(50) NOT NULL, -- 所属知识库ID title VARCHAR(500) NOT NULL, -- 文档标题 doc_type VARCHAR(50) NOT NULL, -- 文档类型:text-文本/pdf/word/excel/image/video category VARCHAR(100), -- 文档分类(自动或手动分类) @@ -50,8 +54,9 @@ CREATE TABLE knowledge.tb_knowledge_document ( file_path VARCHAR(500), -- 文件路径 file_size BIGINT, -- 文件大小(字节) mime_type VARCHAR(100), -- MIME类型 - version VARCHAR(20) DEFAULT '1.0', -- 文档版本号 - parent_doc_id VARCHAR(50), -- 父文档ID(用于版本管理) + version INTEGER DEFAULT 1, -- 版本号(自动递增) + root_doc_id VARCHAR(50), -- 根文档ID(版本组标识) + is_current BOOLEAN DEFAULT true, -- 是否当前使用的版本 tags TEXT[], -- 文档标签数组 keywords TEXT[], -- 关键词数组(AI提取) embedding_status VARCHAR(20) DEFAULT 'pending', -- 向量化状态:pending-待处理/processing-处理中/completed-完成/failed-失败 @@ -59,6 +64,7 @@ CREATE TABLE knowledge.tb_knowledge_document ( chunk_count INTEGER DEFAULT 0, -- 切片数量 metadata JSONB DEFAULT NULL, -- 文档元数据(JSON格式) source_url VARCHAR(500), -- 来源URL + service_type VARCHAR(50), -- 服务类型(继承自知识库) dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 status VARCHAR(20) NOT NULL DEFAULT 'active', -- 状态:active-激活/inactive-停用/archived-归档 creator VARCHAR(50) DEFAULT NULL, -- 创建者 @@ -69,15 +75,21 @@ CREATE TABLE knowledge.tb_knowledge_document ( deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 PRIMARY KEY (doc_id), UNIQUE (optsn), - FOREIGN KEY (kb_id) REFERENCES knowledge.tb_knowledge_base(kb_id) + FOREIGN KEY (knowledge_id) REFERENCES knowledge.tb_knowledge_base(knowledge_id) ); -CREATE INDEX idx_doc_kb ON knowledge.tb_knowledge_document(kb_id) WHERE deleted = false; +CREATE INDEX idx_doc_kb ON knowledge.tb_knowledge_document(knowledge_id) WHERE deleted = false; +CREATE INDEX idx_doc_service ON knowledge.tb_knowledge_document(service_type) WHERE deleted = false; CREATE INDEX idx_doc_category ON knowledge.tb_knowledge_document(category) WHERE deleted = false; CREATE INDEX idx_doc_embedding_status ON knowledge.tb_knowledge_document(embedding_status) WHERE deleted = false; CREATE INDEX idx_doc_tags ON knowledge.tb_knowledge_document USING GIN(tags) WHERE deleted = false; +CREATE INDEX idx_doc_root_current ON knowledge.tb_knowledge_document(root_doc_id, is_current) WHERE deleted = false; COMMENT ON TABLE knowledge.tb_knowledge_document IS '知识文档表'; +COMMENT ON COLUMN knowledge.tb_knowledge_document.service_type IS '服务类型(从知识库继承,用于服务间隔离)'; +COMMENT ON COLUMN knowledge.tb_knowledge_document.version IS '版本号(整数,每次创建新版本自动+1)'; +COMMENT ON COLUMN knowledge.tb_knowledge_document.root_doc_id IS '根文档ID(同一文档的所有版本共享此ID,首次上传时等于doc_id)'; +COMMENT ON COLUMN knowledge.tb_knowledge_document.is_current IS '是否当前使用的版本(每个root_doc_id只有一个is_current=true)'; COMMENT ON COLUMN knowledge.tb_knowledge_document.embedding_status IS '向量化状态:pending/processing/completed/failed'; -- 知识文档片段表(用于RAG检索) @@ -86,12 +98,13 @@ CREATE TABLE knowledge.tb_knowledge_chunk ( optsn VARCHAR(50) NOT NULL, -- 流水号 chunk_id VARCHAR(50) NOT NULL, -- 片段ID doc_id VARCHAR(50) NOT NULL, -- 所属文档ID - kb_id VARCHAR(50) NOT NULL, -- 所属知识库ID + knowledge_id VARCHAR(50) NOT NULL, -- 所属知识库ID chunk_index INTEGER NOT NULL, -- 片段索引(在文档中的顺序) content TEXT NOT NULL, -- 片段内容 content_length INTEGER, -- 内容长度 embedding vector(1536), -- 向量嵌入(假设使用OpenAI 1536维) chunk_type VARCHAR(20) DEFAULT 'text', -- 片段类型:text-文本/table-表格/image-图片 + version INTEGER DEFAULT 1, -- 分段版本号(用于乐观锁,每次编辑+1) position_info JSONB, -- 位置信息(页码、坐标等) metadata JSONB, -- 片段元数据 dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 @@ -102,15 +115,16 @@ CREATE TABLE knowledge.tb_knowledge_chunk ( PRIMARY KEY (chunk_id), UNIQUE (optsn), FOREIGN KEY (doc_id) REFERENCES knowledge.tb_knowledge_document(doc_id), - FOREIGN KEY (kb_id) REFERENCES knowledge.tb_knowledge_base(kb_id) + FOREIGN KEY (knowledge_id) REFERENCES knowledge.tb_knowledge_base(knowledge_id) ); CREATE INDEX idx_chunk_doc ON knowledge.tb_knowledge_chunk(doc_id) WHERE deleted = false; -CREATE INDEX idx_chunk_kb ON knowledge.tb_knowledge_chunk(kb_id) WHERE deleted = false; +CREATE INDEX idx_chunk_kb ON knowledge.tb_knowledge_chunk(knowledge_id) WHERE deleted = false; -- 向量检索索引(需要安装pgvector扩展) -- CREATE INDEX idx_chunk_embedding ON knowledge.tb_knowledge_chunk USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100); COMMENT ON TABLE knowledge.tb_knowledge_chunk IS '知识文档片段表(RAG检索)'; +COMMENT ON COLUMN knowledge.tb_knowledge_chunk.version IS '分段版本号(用于乐观锁,防止并发编辑冲突)'; COMMENT ON COLUMN knowledge.tb_knowledge_chunk.embedding IS '向量嵌入(需要pgvector扩展)'; -- 知识访问日志表 @@ -118,7 +132,7 @@ DROP TABLE IF EXISTS knowledge.tb_knowledge_access_log CASCADE; CREATE TABLE knowledge.tb_knowledge_access_log ( optsn VARCHAR(50) NOT NULL, -- 流水号 log_id VARCHAR(50) NOT NULL, -- 日志ID - kb_id VARCHAR(50), -- 知识库ID + knowledge_id VARCHAR(50), -- 知识库ID doc_id VARCHAR(50), -- 文档ID user_id VARCHAR(50) NOT NULL, -- 用户ID access_type VARCHAR(20) NOT NULL, -- 访问类型:view-查看/download-下载/search-搜索/edit-编辑 @@ -133,6 +147,6 @@ CREATE TABLE knowledge.tb_knowledge_access_log ( ); CREATE INDEX idx_access_log_user ON knowledge.tb_knowledge_access_log(user_id, create_time DESC); -CREATE INDEX idx_access_log_kb ON knowledge.tb_knowledge_access_log(kb_id, create_time DESC); +CREATE INDEX idx_access_log_kb ON knowledge.tb_knowledge_access_log(knowledge_id, create_time DESC); COMMENT ON TABLE knowledge.tb_knowledge_access_log IS '知识访问日志表'; diff --git a/urbanLifelineServ/.bin/database/postgres/sql/createTableLog.sql b/urbanLifelineServ/.bin/database/postgres/sql/createTableLog.sql index 156c076..a09c917 100644 --- a/urbanLifelineServ/.bin/database/postgres/sql/createTableLog.sql +++ b/urbanLifelineServ/.bin/database/postgres/sql/createTableLog.sql @@ -13,6 +13,7 @@ CREATE TABLE log.tb_sys_log ( message VARCHAR(255) NOT NULL, -- 日志消息 data JSONB DEFAULT NULL, -- 日志数据 creator VARCHAR(50) DEFAULT NULL, -- 创建者 + service_type VARCHAR(50) NOT NULL, -- 服务类型 dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 updater VARCHAR(50) DEFAULT NULL, -- 更新者 create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 日志创建时间 @@ -31,6 +32,7 @@ COMMENT ON COLUMN log.tb_sys_log.module IS '日志模块'; COMMENT ON COLUMN log.tb_sys_log.message IS '日志消息'; COMMENT ON COLUMN log.tb_sys_log.data IS '日志数据'; COMMENT ON COLUMN log.tb_sys_log.creator IS '创建者'; +COMMENT ON COLUMN log.tb_sys_log.service_type IS '服务类型'; COMMENT ON COLUMN log.tb_sys_log.dept_path IS '部门全路径'; COMMENT ON COLUMN log.tb_sys_log.updater IS '更新者'; COMMENT ON COLUMN log.tb_sys_log.create_time IS '日志创建时间'; diff --git a/urbanLifelineServ/.bin/database/postgres/sql/createTableMessage.sql b/urbanLifelineServ/.bin/database/postgres/sql/createTableMessage.sql index 74b0a9f..123e427 100644 --- a/urbanLifelineServ/.bin/database/postgres/sql/createTableMessage.sql +++ b/urbanLifelineServ/.bin/database/postgres/sql/createTableMessage.sql @@ -8,6 +8,7 @@ CREATE TABLE message.tb_message ( content VARCHAR(255) NOT NULL, -- 消息内容 type VARCHAR(50) NOT NULL, -- 消息类型 status VARCHAR(50) NOT NULL, -- 消息状态 + service_type VARCHAR(50) NOT NULL, -- 服务类型 dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径(隔离) creator VARCHAR(50) NOT NULL DEFAULT 'system',-- 创建者 updater VARCHAR(50) DEFAULT NULL, -- 更新者 @@ -26,6 +27,7 @@ COMMENT ON COLUMN message.tb_message.title IS '消息标题'; COMMENT ON COLUMN message.tb_message.content IS '消息内容'; COMMENT ON COLUMN message.tb_message.type IS '消息类型'; COMMENT ON COLUMN message.tb_message.status IS '消息状态'; +COMMENT ON COLUMN message.tb_message.service_type IS '服务类型'; COMMENT ON COLUMN message.tb_message.dept_path IS '部门全路径'; COMMENT ON COLUMN message.tb_message.creator IS '创建者'; COMMENT ON COLUMN message.tb_message.updater IS '更新者'; @@ -150,3 +152,49 @@ COMMENT ON COLUMN message.tb_message_channel.create_time IS '创建时间'; COMMENT ON COLUMN message.tb_message_channel.update_time IS '更新时间'; COMMENT ON COLUMN message.tb_message_channel.delete_time IS '删除时间'; COMMENT ON COLUMN message.tb_message_channel.deleted IS '是否删除'; + +-- ============================= +-- 消息模板表 +-- ============================= +DROP TABLE IF EXISTS message.tb_message_template CASCADE; +CREATE TABLE message.tb_message_template ( + optsn VARCHAR(50) NOT NULL, + template_id VARCHAR(50) NOT NULL, + template_code VARCHAR(100) NOT NULL, -- 模板编码 + template_name VARCHAR(255) NOT NULL, -- 模板名称 + template_type VARCHAR(30) NOT NULL, -- 模板类型:system-系统/business-业务 + title_template TEXT, -- 标题模板(支持变量) + content_template TEXT NOT NULL, -- 内容模板(支持变量) + variables JSONB, -- 模板变量定义 + service_type VARCHAR(50) NOT NULL, -- 服务类型 + dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 + creator VARCHAR(50) DEFAULT NULL, -- 创建者 + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (template_id), + UNIQUE (optsn), + UNIQUE (template_code) +); + +COMMENT ON TABLE message.tb_message_template IS '消息模板表'; +COMMENT ON COLUMN message.tb_message_template.optsn IS '流水号'; +COMMENT ON COLUMN message.tb_message_template.template_id IS '模板ID'; +COMMENT ON COLUMN message.tb_message_template.template_code IS '模板编码'; +COMMENT ON COLUMN message.tb_message_template.template_name IS '模板名称'; +COMMENT ON COLUMN message.tb_message_template.template_type IS '模板类型:system-系统/business-业务'; +COMMENT ON COLUMN message.tb_message_template.title_template IS '标题模板(支持变量)'; +COMMENT ON COLUMN message.tb_message_template.content_template IS '内容模板(支持变量)'; +COMMENT ON COLUMN message.tb_message_template.variables IS '模板变量定义'; +COMMENT ON COLUMN message.tb_message_template.service_type IS '服务类型'; +COMMENT ON COLUMN message.tb_message_template.dept_path IS '部门全路径'; +COMMENT ON COLUMN message.tb_message_template.creator IS '创建者'; +COMMENT ON COLUMN message.tb_message_template.updater IS '更新者'; +COMMENT ON COLUMN message.tb_message_template.create_time IS '创建时间'; +COMMENT ON COLUMN message.tb_message_template.update_time IS '更新时间'; +COMMENT ON COLUMN message.tb_message_template.delete_time IS '删除时间'; +COMMENT ON COLUMN message.tb_message_template.deleted IS '是否删除'; + +CREATE INDEX idx_template_type ON message.tb_message_template(template_type) WHERE deleted = false; diff --git a/urbanLifelineServ/.bin/database/postgres/sql/createTablePermission.sql b/urbanLifelineServ/.bin/database/postgres/sql/createTablePermission.sql index a7e802f..d319fb3 100644 --- a/urbanLifelineServ/.bin/database/postgres/sql/createTablePermission.sql +++ b/urbanLifelineServ/.bin/database/postgres/sql/createTablePermission.sql @@ -124,6 +124,7 @@ CREATE TABLE sys.tb_sys_user_role ( optsn VARCHAR(50) NOT NULL, -- 流水号 user_id VARCHAR(50) NOT NULL, -- 用户ID role_id VARCHAR(50) NOT NULL, -- 角色ID + dept_id VARCHAR(50) NOT NULL, -- 部门ID dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 creator VARCHAR(50) DEFAULT NULL, -- 创建者 updater VARCHAR(50) DEFAULT NULL, -- 更新者 @@ -138,6 +139,7 @@ COMMENT ON TABLE sys.tb_sys_user_role IS '用户角色关联表'; COMMENT ON COLUMN sys.tb_sys_user_role.optsn IS '流水号'; COMMENT ON COLUMN sys.tb_sys_user_role.user_id IS '用户ID'; COMMENT ON COLUMN sys.tb_sys_user_role.role_id IS '角色ID'; +COMMENT ON COLUMN sys.tb_sys_user_role.dept_id IS '部门ID'; COMMENT ON COLUMN sys.tb_sys_user_role.dept_path IS '部门全路径'; COMMENT ON COLUMN sys.tb_sys_user_role.creator IS '创建者'; COMMENT ON COLUMN sys.tb_sys_user_role.updater IS '更新者'; diff --git a/urbanLifelineServ/.bin/database/postgres/sql/createTableUser.sql b/urbanLifelineServ/.bin/database/postgres/sql/createTableUser.sql index de1ddd4..32f5c2c 100644 --- a/urbanLifelineServ/.bin/database/postgres/sql/createTableUser.sql +++ b/urbanLifelineServ/.bin/database/postgres/sql/createTableUser.sql @@ -54,11 +54,11 @@ CREATE TABLE sys.tb_sys_user_info ( user_id VARCHAR(50) NOT NULL, -- 用户ID avatar VARCHAR(255), -- 头像 gender INTEGER DEFAULT 0, -- 性别 - username VARCHAR(100) NOT NULL -- 用户名 + username VARCHAR(100) NOT NULL, -- 用户名 level INTEGER DEFAULT 1, -- 等级 id_card VARCHAR(50), -- 身份证号 address VARCHAR(255), -- 地址 - remark VARCHAR(500) DEFAULT NULL -- 备注 + remark VARCHAR(500) DEFAULT NULL, -- 备注 create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间(触发器维护) delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 diff --git a/urbanLifelineServ/.bin/database/postgres/sql/initAll.sql b/urbanLifelineServ/.bin/database/postgres/sql/initAll.sql index 83873ab..4ba996b 100644 --- a/urbanLifelineServ/.bin/database/postgres/sql/initAll.sql +++ b/urbanLifelineServ/.bin/database/postgres/sql/initAll.sql @@ -1,11 +1,55 @@ --- 按顺序执行初始化 -\i createDB.sql -- 创建数据库和基础扩展 -\i createTableUser.sql -- 用户表相关(核心表) -\i createTablePermission.sql -- 权限相关(核心表) -\i createTableFile.sql -- 文件管理 -\i createTableMessage.sql -- 消息管理 -\i createTableConfig.sql -- 配置管理 -\i createTableLog.sql -- 日志管理 +-- ============================= +-- 城市生命线AI数智化平台 - 数据库初始化脚本 +-- 按顺序执行各模块建表SQL及数据初始化 +-- ============================= --- 初始化基础数据(如果有) --- \i initBaseData.sql -- 取消注释如果需要初始化基础数据 \ No newline at end of file +-- ============================= +-- 第一阶段:创建数据库和表结构 +-- ============================= +\i createDB.sql + +-- 1. 系统基础模块 +\i createTablePermission.sql +\i createTableUser.sql + +-- 2. 文件管理模块 +\i createTableFile.sql + +-- 3. 消息通知模块 +\i createTableMessage.sql + +-- 4. 日志模块 +\i createTableLog.sql + +-- 5. 配置管理模块 +\i createTableConfig.sql + +-- 6. 知识库管理模块 +\i createTableKnowledge.sql + +-- 7. 招投标业务模块 +\i createTableBidding.sql + +-- 8. 智能客服业务模块 +\i createTableCustomerService.sql + +-- 9. 智能体模块(暂不启用) +-- \i createTableAgent.sql + +-- ============================= +-- 第二阶段:初始化基础数据 +-- ============================= + +-- 1. 初始化权限相关基础数据(部门、角色、权限、视图、模块) +\i initDataPermission.sql + +-- 2. 初始化用户数据(管理员账户) +\i initDataUser.sql + +-- 3. 初始化消息渠道配置 +\i initDataMessage.sql + +-- 4. 初始化系统配置 +\i initDataConfig.sql + +-- 注意:文件、日志、知识库、招投标、客服等业务表无需初始化数据 \ No newline at end of file diff --git a/urbanLifelineServ/.bin/database/postgres/sql/initDataConfig.sql b/urbanLifelineServ/.bin/database/postgres/sql/initDataConfig.sql index 28eecd0..e02f276 100644 --- a/urbanLifelineServ/.bin/database/postgres/sql/initDataConfig.sql +++ b/urbanLifelineServ/.bin/database/postgres/sql/initDataConfig.sql @@ -2,42 +2,43 @@ -- 仅插入常用示例,可按需调整 value/remark INSERT INTO config.tb_sys_config ( - optsn, config_id, key, value, type, description, "group", "order", status, remark, + optsn, config_id, key, name, value, config_type, render_type, description, + re, options, "group", module_id, order_num, status, remark, creator, dept_path, updater, create_time, update_time, delete_time, deleted ) VALUES -- 站点与品牌 -('CFG-0001', 'cfg_site_name', 'site.name', 'urban-lifeline 平台', 'string', '站点名称', 'site', 10, 'enabled', '展示在标题/登录/页脚', 'system', NULL, NULL, now(), NULL, NULL, false), -('CFG-0002', 'cfg_site_logo', 'site.logo', '/static/logo.png', 'string', '站点Logo地址', 'site', 20, 'enabled', '相对或绝对URL', 'system', NULL, NULL, now(), NULL, NULL, false), -('CFG-0003', 'cfg_site_icp', 'site.icp', '', 'string', 'ICP备案号', 'site', 30, 'enabled', '页脚展示', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0001', 'cfg_site_name', 'site.name', '站点名称', 'urban-lifeline 平台', 'String', 'input', '站点名称', NULL, NULL, 'site', 'mod_system', 10, 0, '展示在标题/登录/页脚', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0002', 'cfg_site_logo', 'site.logo', '站点Logo', '/static/logo.png', 'String', 'input', '站点Logo地址', NULL, NULL, 'site', 'mod_system', 20, 0, '相对或绝对URL', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0003', 'cfg_site_icp', 'site.icp', 'ICP备案号', '', 'String', 'input', 'ICP备案号', NULL, NULL, 'site', 'mod_system', 30, 0, '页脚展示', 'system', NULL, NULL, now(), NULL, NULL, false), -- 国际化与时区 -('CFG-0101', 'cfg_i18n_locale', 'i18n.defaultLocale', 'zh-CN', 'string', '默认语言', 'i18n', 10, 'enabled', '如 zh-CN/en-US', 'system', NULL, NULL, now(), NULL, NULL, false), -('CFG-0102', 'cfg_timezone', 'system.timezone', 'Asia/Shanghai', 'string', '系统默认时区', 'i18n', 20, 'enabled', 'IANA时区名', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0101', 'cfg_i18n_locale', 'i18n.defaultLocale', '默认语言', 'zh-CN', 'String', 'select', '默认语言', NULL, '["zh-CN", "en-US"]'::json, 'i18n', 'mod_system', 10, 0, '如 zh-CN/en-US', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0102', 'cfg_timezone', 'system.timezone', '系统时区', 'Asia/Shanghai', 'String', 'input', '系统默认时区', NULL, NULL, 'i18n', 'mod_system', 20, 0, 'IANA时区名', 'system', NULL, NULL, now(), NULL, NULL, false), -- 安全与认证 -('CFG-0201', 'cfg_pwd_policy', 'security.passwordPolicy','{"minLen":8,"upper":1,"lower":1,"digit":1,"special":0}', 'json', '密码策略', 'security', 10, 'enabled', 'JSON结构', 'system', NULL, NULL, now(), NULL, NULL, false), -('CFG-0202', 'cfg_jwt_exp', 'security.jwt.expireSeconds','86400', 'number', 'JWT过期秒数', 'security', 20, 'enabled', '默认24小时', 'system', NULL, NULL, now(), NULL, NULL, false), -('CFG-0203', 'cfg_session_timeout', 'security.session.timeoutMinutes','30', 'number', '会话超时(分钟)', 'security', 30, 'enabled', '空闲登出', 'system', NULL, NULL, now(), NULL, NULL, false), -('CFG-0204', 'cfg_signup_enabled', 'security.signup.enabled','false', 'bool', '是否开放注册', 'security', 40, 'enabled', '生产建议关闭', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0201', 'cfg_pwd_policy', 'security.passwordPolicy','密码策略', '{"minLen":8,"upper":1,"lower":1,"digit":1,"special":0}', 'String', 'textarea', '密码策略', NULL, NULL, 'security', 'mod_system', 10, 0, 'JSON结构', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0202', 'cfg_jwt_exp', 'security.jwt.expireSeconds','JWT过期时间', '86400', 'INTEGER', 'input', 'JWT过期秒数', NULL, NULL, 'security', 'mod_system', 20, 0, '默认24小时', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0203', 'cfg_session_timeout', 'security.session.timeoutMinutes','会话超时', '30', 'INTEGER', 'input', '会话超时(分钟)', NULL, NULL, 'security', 'mod_system', 30, 0, '空闲登出', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0204', 'cfg_signup_enabled', 'security.signup.enabled','开放注册', 'false', 'BOOLEAN', 'switch', '是否开放注册', NULL, NULL, 'security', 'mod_system', 40, 0, '生产建议关闭', 'system', NULL, NULL, now(), NULL, NULL, false), -- 存储与上传 -('CFG-0301', 'cfg_upload_max', 'upload.maxSizeMB', '50', 'number', '单文件最大上传(MB)', 'storage', 10, 'enabled', '前后端需一致校验', 'system', NULL, NULL, now(), NULL, NULL, false), -('CFG-0302', 'cfg_storage_backend', 'storage.backend', 'local', 'string', '存储后端(local/minio/s3)', 'storage', 20, 'enabled', '本地/MinIO/S3等', 'system', NULL, NULL, now(), NULL, NULL, false), -('CFG-0303', 'cfg_storage_base', 'storage.basePath', '/data/urban-lifeline', 'string', '本地存储基路径', 'storage', 30, 'enabled', '当 backend=local', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0301', 'cfg_upload_max', 'upload.maxSizeMB', '最大上传大小', '50', 'INTEGER', 'input', '单文件最大上传(MB)', NULL, NULL, 'storage', 'mod_file', 10, 0, '前后端需一致校验', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0302', 'cfg_storage_backend', 'storage.backend', '存储后端', 'local', 'String', 'select', '存储后端类型', NULL, '["local", "minio", "s3"]'::json, 'storage', 'mod_file', 20, 0, '本地/MinIO/S3等', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0303', 'cfg_storage_base', 'storage.basePath', '存储路径', '/data/urban-lifeline', 'String', 'input', '本地存储基路径', NULL, NULL, 'storage', 'mod_file', 30, 0, '当 backend=local', 'system', NULL, NULL, now(), NULL, NULL, false), -- 通知(邮件/SMS) -('CFG-0401', 'cfg_mail_host', 'mail.smtp.host', '', 'string', 'SMTP主机', 'notify', 10, 'disabled','留空为未配置', 'system', NULL, NULL, now(), NULL, NULL, false), -('CFG-0402', 'cfg_mail_port', 'mail.smtp.port', '465', 'number', 'SMTP端口', 'notify', 20, 'disabled','SSL常用465', 'system', NULL, NULL, now(), NULL, NULL, false), -('CFG-0403', 'cfg_mail_from', 'mail.from', '', 'string', '发件人邮箱', 'notify', 30, 'disabled','如 no-reply@x.com', 'system', NULL, NULL, now(), NULL, NULL, false), -('CFG-0411', 'cfg_sms_provider', 'sms.provider', '', 'string', '短信服务商', 'notify', 40, 'disabled','如 aliyun/tencent', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0401', 'cfg_mail_host', 'mail.smtp.host', 'SMTP主机', '', 'String', 'input', 'SMTP主机', NULL, NULL, 'notify', 'mod_message', 10, 1, '留空为未配置', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0402', 'cfg_mail_port', 'mail.smtp.port', 'SMTP端口', '465', 'INTEGER', 'input', 'SMTP端口', NULL, NULL, 'notify', 'mod_message', 20, 1, 'SSL常用465', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0403', 'cfg_mail_from', 'mail.from', '发件人邮箱', '', 'String', 'input', '发件人邮箱', NULL, NULL, 'notify', 'mod_message', 30, 1, '如 no-reply@x.com', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0411', 'cfg_sms_provider', 'sms.provider', '短信服务商', '', 'String', 'select', '短信服务商', NULL, '["aliyun", "tencent"]'::json, 'notify', 'mod_message', 40, 1, '如 aliyun/tencent', 'system', NULL, NULL, now(), NULL, NULL, false), -- 日志与审计 -('CFG-0501', 'cfg_log_level', 'log.level', 'INFO', 'string', '系统日志级别', 'log', 10, 'enabled', 'DEBUG/INFO/WARN/ERROR', 'system', NULL, NULL, now(), NULL, NULL, false), -('CFG-0502', 'cfg_audit_retention', 'audit.retentionDays', '90', 'number', '审计日志保留天数', 'log', 20, 'enabled', '合规按需调整', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0501', 'cfg_log_level', 'log.level', '日志级别', 'INFO', 'String', 'select', '系统日志级别', NULL, '["DEBUG", "INFO", "WARN", "ERROR"]'::json, 'log', 'mod_system', 10, 0, 'DEBUG/INFO/WARN/ERROR', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0502', 'cfg_audit_retention', 'audit.retentionDays', '审计日志保留', '90', 'INTEGER', 'input', '审计日志保留天数', NULL, NULL, 'log', 'mod_system', 20, 0, '合规按需调整', 'system', NULL, NULL, now(), NULL, NULL, false), -- 平台特性 -('CFG-0601', 'cfg_maintenance', 'platform.maintenance', 'false', 'bool', '维护模式开关', 'platform', 10, 'enabled', 'true时仅管理员可用', 'system', NULL, NULL, now(), NULL, NULL, false), -('CFG-0602', 'cfg_feature_acl_policy', 'feature.acl.policy', 'enabled', 'string', 'ACL策略开关', 'platform', 20, 'enabled', 'enabled/disabled', 'system', NULL, NULL, now(), NULL, NULL, false); +('CFG-0601', 'cfg_maintenance', 'platform.maintenance', '维护模式', 'false', 'BOOLEAN', 'switch', '维护模式开关', NULL, NULL, 'platform', 'mod_system', 10, 0, 'true时仅管理员可用', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0602', 'cfg_feature_acl_policy','feature.acl.policy', 'ACL策略', 'enabled', 'String', 'select', 'ACL策略开关', NULL, '["enabled", "disabled"]'::json, 'platform', 'mod_system', 20, 0, 'enabled/disabled', 'system', NULL, NULL, now(), NULL, NULL, false); diff --git a/urbanLifelineServ/.bin/database/postgres/sql/initDataMessage.sql b/urbanLifelineServ/.bin/database/postgres/sql/initDataMessage.sql new file mode 100644 index 0000000..61260fe --- /dev/null +++ b/urbanLifelineServ/.bin/database/postgres/sql/initDataMessage.sql @@ -0,0 +1,118 @@ +-- 初始化消息渠道配置(与 message schema 对应) +-- 配置常用消息发送渠道 + +-- ============================= +-- 1. 初始化消息渠道 +-- ============================= +INSERT INTO message.tb_message_channel ( + optsn, channel_id, channel_code, channel_name, channel_desc, + config, status, priority, creator, create_time, deleted +) VALUES +-- 应用内消息(默认渠道,优先级最高) +('CH-0001', 'channel_app', 'app', '应用内消息', '系统内部消息通知', + '{"enabled": true, "realtime": true}'::json, + 'enabled', 100, 'system', now(), false), + +-- 短信通知 +('CH-0002', 'channel_sms', 'sms', '短信通知', '短信发送服务', + '{ + "enabled": false, + "provider": "", + "apiKey": "", + "apiSecret": "", + "signName": "", + "templateCode": "" + }'::json, + 'disabled', 80, 'system', now(), false), + +-- 邮件通知 +('CH-0003', 'channel_email', 'email', '邮件通知', '电子邮件发送服务', + '{ + "enabled": false, + "smtpHost": "", + "smtpPort": 465, + "username": "", + "password": "", + "fromAddress": "", + "useSsl": true + }'::json, + 'disabled', 70, 'system', now(), false), + +-- 微信公众号 +('CH-0004', 'channel_wechat_mp', 'wechat_official_account', '微信公众号', '微信公众号模板消息', + '{ + "enabled": false, + "appId": "", + "appSecret": "", + "templateId": "" + }'::json, + 'disabled', 60, 'system', now(), false), + +-- 微信小程序 +('CH-0005', 'channel_wechat_mini', 'wechat_applet', '微信小程序', '微信小程序订阅消息', + '{ + "enabled": false, + "appId": "", + "appSecret": "", + "templateId": "" + }'::json, + 'disabled', 50, 'system', now(), false), + +-- 钉钉通知 +('CH-0006', 'channel_dingtalk', 'dingtalk', '钉钉通知', '钉钉工作通知', + '{ + "enabled": false, + "agentId": "", + "appKey": "", + "appSecret": "", + "robotToken": "" + }'::json, + 'disabled', 40, 'system', now(), false); + +-- ============================= +-- 2. 初始化消息模板(系统通用模板) +-- ============================= +INSERT INTO message.tb_message_template ( + optsn, template_id, template_code, template_name, template_type, + title_template, content_template, variables, service_type, + creator, create_time, deleted +) VALUES +-- 用户注册欢迎消息 +('TPL-0001', 'tpl_user_welcome', 'USER_WELCOME', '用户注册欢迎', 'system', + '欢迎加入 {{platformName}}', + '您好,{{username}}!\n\n欢迎加入 {{platformName}} 平台。您的账号已成功创建。\n\n账号信息:\n- 用户名:{{usercode}}\n- 邮箱:{{email}}\n- 注册时间:{{registerTime}}\n\n祝您使用愉快!', + '["platformName", "username", "usercode", "email", "registerTime"]'::jsonb, + 'system', + 'system', now(), false), + +-- 密码重置通知 +('TPL-0002', 'tpl_password_reset', 'PASSWORD_RESET', '密码重置通知', 'system', + '密码重置验证码', + '您好,{{username}}!\n\n您正在重置密码,验证码为:{{code}}\n\n验证码有效期为 {{expireMinutes}} 分钟,请尽快完成操作。\n\n如非本人操作,请忽略此消息。', + '["username", "code", "expireMinutes"]'::jsonb, + 'system', + 'system', now(), false), + +-- 系统维护通知 +('TPL-0003', 'tpl_system_maintenance', 'SYSTEM_MAINTENANCE', '系统维护通知', 'system', + '系统维护通知', + '尊敬的用户:\n\n系统将于 {{startTime}} 至 {{endTime}} 进行维护升级。\n\n维护内容:{{content}}\n\n维护期间系统将暂停服务,请您提前做好相关安排。\n\n给您带来不便,敬请谅解!', + '["startTime", "endTime", "content"]'::jsonb, + 'system', + 'system', now(), false), + +-- 工单创建通知 +('TPL-0101', 'tpl_ticket_created', 'TICKET_CREATED', '工单创建通知', 'business', + '新工单通知', + '您好,{{username}}!\n\n您有一条新的工单需要处理:\n\n工单编号:{{ticketNo}}\n工单标题:{{title}}\n优先级:{{priority}}\n创建时间:{{createTime}}\n\n请及时登录系统查看处理。', + '["username", "ticketNo", "title", "priority", "createTime"]'::jsonb, + 'customer_service', + 'system', now(), false), + +-- 招标公告发布通知 +('TPL-0201', 'tpl_bidding_published', 'BIDDING_PUBLISHED', '招标公告发布', 'business', + '招标公告发布通知', + '您好!\n\n新的招标项目已发布:\n\n项目名称:{{projectName}}\n项目编号:{{projectNo}}\n发布时间:{{publishTime}}\n截止时间:{{deadlineTime}}\n\n详情请登录系统查看。', + '["projectName", "projectNo", "publishTime", "deadlineTime"]'::jsonb, + 'bidding', + 'system', now(), false); diff --git a/urbanLifelineServ/.bin/database/postgres/sql/initDataPermission.sql b/urbanLifelineServ/.bin/database/postgres/sql/initDataPermission.sql new file mode 100644 index 0000000..3fc279f --- /dev/null +++ b/urbanLifelineServ/.bin/database/postgres/sql/initDataPermission.sql @@ -0,0 +1,286 @@ +-- 初始化权限相关基础数据(与 sys schema 对应) +-- 包含:部门、角色、模块、权限、视图及其关联关系 + +-- ============================= +-- 1. 初始化根部门 +-- ============================= +INSERT INTO sys.tb_sys_dept ( + optsn, dept_id, name, parent_id, dept_path, description, + creator, create_time, deleted +) VALUES +('DEPT-0001', 'dept_root', '根部门', NULL, '/dept_root/', '系统根部门', + 'system', now(), false); + +-- ============================= +-- 2. 初始化全局角色 +-- ============================= +INSERT INTO sys.tb_sys_role ( + optsn, role_id, name, description, scope, owner_dept_id, + status, creator, dept_path, create_time, deleted +) VALUES +-- 超级管理员(全局) +('ROLE-0001', 'role_super_admin', '超级管理员', '拥有系统所有权限的最高管理员', + 'global', NULL, true, 'system', NULL, now(), false), + +-- 系统管理员(全局) +('ROLE-0002', 'role_system_admin', '系统管理员', '负责系统配置和用户管理', + 'global', NULL, true, 'system', NULL, now(), false), + +-- 普通用户(全局) +('ROLE-0003', 'role_user', '普通用户', '系统普通用户角色', + 'global', NULL, true, 'system', NULL, now(), false), + +-- 访客(全局) +('ROLE-0004', 'role_guest', '访客', '系统访客角色,仅限查看基础信息', + 'global', NULL, true, 'system', NULL, now(), false); + +-- ============================= +-- 3. 初始化系统模块 +-- ============================= +INSERT INTO sys.tb_sys_module ( + optsn, module_id, name, description, + creator, dept_path, create_time, deleted +) VALUES +('MODULE-0001', 'module_system', '系统管理', '用户、角色、权限、部门管理', + 'system', NULL, now(), false), + +('MODULE-0002', 'module_file', '文件管理', '文件上传、下载、关联管理', + 'system', NULL, now(), false), + +('MODULE-0003', 'module_message', '消息通知', '消息发送、接收、模板管理', + 'system', NULL, now(), false), + +('MODULE-0004', 'module_config', '配置管理', '系统配置参数管理', + 'system', NULL, now(), false), + +('MODULE-0005', 'module_knowledge', '知识库', '知识文档管理', + 'system', NULL, now(), false), + +('MODULE-0006', 'module_bidding', '招投标', '招投标业务管理', + 'system', NULL, now(), false), + +('MODULE-0007', 'module_customer_service', '智能客服', '客服工单管理', + 'system', NULL, now(), false); + +-- ============================= +-- 4. 初始化系统权限 +-- ============================= +INSERT INTO sys.tb_sys_permission ( + optsn, permission_id, name, code, description, module_id, + status, creator, dept_path, create_time, deleted +) VALUES +-- 系统管理模块权限 +('PERM-0001', 'perm_user_view', '用户查看', 'system:user:view', '查看用户列表和详情', 'module_system', + true, 'system', NULL, now(), false), +('PERM-0002', 'perm_user_create', '用户创建', 'system:user:create', '创建新用户', 'module_system', + true, 'system', NULL, now(), false), +('PERM-0003', 'perm_user_edit', '用户编辑', 'system:user:edit', '编辑用户信息', 'module_system', + true, 'system', NULL, now(), false), +('PERM-0004', 'perm_user_delete', '用户删除', 'system:user:delete', '删除用户', 'module_system', + true, 'system', NULL, now(), false), + +('PERM-0011', 'perm_role_view', '角色查看', 'system:role:view', '查看角色列表和详情', 'module_system', + true, 'system', NULL, now(), false), +('PERM-0012', 'perm_role_create', '角色创建', 'system:role:create', '创建新角色', 'module_system', + true, 'system', NULL, now(), false), +('PERM-0013', 'perm_role_edit', '角色编辑', 'system:role:edit', '编辑角色信息', 'module_system', + true, 'system', NULL, now(), false), +('PERM-0014', 'perm_role_delete', '角色删除', 'system:role:delete', '删除角色', 'module_system', + true, 'system', NULL, now(), false), + +('PERM-0021', 'perm_dept_view', '部门查看', 'system:dept:view', '查看部门列表和详情', 'module_system', + true, 'system', NULL, now(), false), +('PERM-0022', 'perm_dept_create', '部门创建', 'system:dept:create', '创建新部门', 'module_system', + true, 'system', NULL, now(), false), +('PERM-0023', 'perm_dept_edit', '部门编辑', 'system:dept:edit', '编辑部门信息', 'module_system', + true, 'system', NULL, now(), false), +('PERM-0024', 'perm_dept_delete', '部门删除', 'system:dept:delete', '删除部门', 'module_system', + true, 'system', NULL, now(), false), + +('PERM-0031', 'perm_permission_view', '权限查看', 'system:permission:view', '查看权限列表', 'module_system', + true, 'system', NULL, now(), false), +('PERM-0032', 'perm_permission_manage', '权限管理', 'system:permission:manage', '管理权限配置', 'module_system', + true, 'system', NULL, now(), false), + +-- 系统管理模块导出权限 +('PERM-0041', 'perm_user_export', '用户导出', 'system:user:export', '导出用户数据', 'module_system', + true, 'system', NULL, now(), false), +('PERM-0042', 'perm_role_export', '角色导出', 'system:role:export', '导出角色数据', 'module_system', + true, 'system', NULL, now(), false), +('PERM-0043', 'perm_dept_export', '部门导出', 'system:dept:export', '导出部门数据', 'module_system', + true, 'system', NULL, now(), false), + +-- 文件管理模块权限 +('PERM-0101', 'perm_file_view', '文件查看', 'file:file:view', '查看文件列表', 'module_file', + true, 'system', NULL, now(), false), +('PERM-0102', 'perm_file_upload', '文件上传', 'file:file:upload', '上传文件', 'module_file', + true, 'system', NULL, now(), false), +('PERM-0103', 'perm_file_download', '文件下载', 'file:file:download', '下载文件', 'module_file', + true, 'system', NULL, now(), false), +('PERM-0104', 'perm_file_delete', '文件删除', 'file:file:delete', '删除文件', 'module_file', + true, 'system', NULL, now(), false), +('PERM-0105', 'perm_file_export', '文件导出', 'file:file:export', '导出文件列表数据', 'module_file', + true, 'system', NULL, now(), false), + +-- 消息通知模块权限 +('PERM-0201', 'perm_message_view', '消息查看', 'message:message:view', '查看消息列表', 'module_message', + true, 'system', NULL, now(), false), +('PERM-0202', 'perm_message_send', '消息发送', 'message:message:send', '发送消息通知', 'module_message', + true, 'system', NULL, now(), false), +('PERM-0203', 'perm_message_manage', '消息管理', 'message:message:manage', '管理消息模板和配置', 'module_message', + true, 'system', NULL, now(), false), +('PERM-0204', 'perm_message_export', '消息导出', 'message:message:export', '导出消息数据', 'module_message', + true, 'system', NULL, now(), false), + +-- 配置管理模块权限 +('PERM-0301', 'perm_config_view', '配置查看', 'config:config:view', '查看系统配置', 'module_config', + true, 'system', NULL, now(), false), +('PERM-0302', 'perm_config_edit', '配置编辑', 'config:config:edit', '修改系统配置', 'module_config', + true, 'system', NULL, now(), false), +('PERM-0303', 'perm_config_export', '配置导出', 'config:config:export', '导出系统配置数据', 'module_config', + true, 'system', NULL, now(), false), + +-- 日志模块权限 +('PERM-0401', 'perm_log_view', '日志查看', 'log:log:view', '查看系统日志', 'module_system', + true, 'system', NULL, now(), false), +('PERM-0402', 'perm_log_export', '日志导出', 'log:log:export', '导出系统日志数据', 'module_system', + true, 'system', NULL, now(), false); + +-- ============================= +-- 5. 初始化视图(菜单) +-- ============================= +INSERT INTO sys.tb_sys_view ( + optsn, view_id, name, parent_id, url, component, icon, type, + layout, order_num, description, creator, create_time, deleted +) VALUES +-- 一级菜单 +('VIEW-0001', 'view_system', '系统管理', NULL, '/system', NULL, 'Settings', 0, + 'MainLayout', 100, '系统管理菜单', 'system', now(), false), + +('VIEW-0002', 'view_business', '业务管理', NULL, '/business', NULL, 'Briefcase', 0, + 'MainLayout', 200, '业务管理菜单', 'system', now(), false), + +-- 系统管理子菜单 +('VIEW-0101', 'view_user', '用户管理', 'view_system', '/system/user', 'system/UserList', 'Users', 1, + 'MainLayout', 10, '用户管理页面', 'system', now(), false), + +('VIEW-0102', 'view_role', '角色管理', 'view_system', '/system/role', 'system/RoleList', 'Shield', 1, + 'MainLayout', 20, '角色管理页面', 'system', now(), false), + +('VIEW-0103', 'view_dept', '部门管理', 'view_system', '/system/dept', 'system/DeptList', 'Building', 1, + 'MainLayout', 30, '部门管理页面', 'system', now(), false), + +('VIEW-0104', 'view_permission', '权限管理', 'view_system', '/system/permission', 'system/PermissionList', 'Lock', 1, + 'MainLayout', 40, '权限管理页面', 'system', now(), false), + +('VIEW-0105', 'view_config', '配置管理', 'view_system', '/system/config', 'system/ConfigList', 'Settings', 1, + 'MainLayout', 50, '配置管理页面', 'system', now(), false), + +('VIEW-0106', 'view_file', '文件管理', 'view_system', '/system/file', 'system/FileList', 'FileText', 1, + 'MainLayout', 60, '文件管理页面', 'system', now(), false), + +('VIEW-0107', 'view_message', '消息管理', 'view_system', '/system/message', 'system/MessageList', 'Mail', 1, + 'MainLayout', 70, '消息管理页面', 'system', now(), false); + +-- ============================= +-- 6. 角色权限关联(超级管理员拥有所有权限) +-- ============================= +INSERT INTO sys.tb_sys_role_permission ( + optsn, role_id, permission_id, creator, dept_path, create_time, deleted +) +SELECT + 'RP-' || LPAD(ROW_NUMBER() OVER (ORDER BY permission_id)::TEXT, 4, '0'), + 'role_super_admin', + permission_id, + 'system', + NULL, + now(), + false +FROM sys.tb_sys_permission +WHERE deleted = false; + +-- 系统管理员权限(除了用户删除外的系统管理权限) +INSERT INTO sys.tb_sys_role_permission ( + optsn, role_id, permission_id, creator, dept_path, create_time, deleted +) +SELECT + 'RP-SA-' || LPAD(ROW_NUMBER() OVER (ORDER BY permission_id)::TEXT, 4, '0'), + 'role_system_admin', + permission_id, + 'system', + NULL, + now(), + false +FROM sys.tb_sys_permission +WHERE deleted = false + AND code NOT IN ('system:user:delete', 'system:role:delete', 'system:dept:delete') + AND module_id IN ('module_system', 'module_file', 'module_message', 'module_config'); + +-- 普通用户权限(基础查看和文件操作) +INSERT INTO sys.tb_sys_role_permission ( + optsn, role_id, permission_id, creator, dept_path, create_time, deleted +) VALUES +('RP-U-0001', 'role_user', 'perm_user_view', 'system', NULL, now(), false), +('RP-U-0002', 'role_user', 'perm_file_view', 'system', NULL, now(), false), +('RP-U-0003', 'role_user', 'perm_file_upload', 'system', NULL, now(), false), +('RP-U-0004', 'role_user', 'perm_file_download', 'system', NULL, now(), false), +('RP-U-0005', 'role_user', 'perm_message_view', 'system', NULL, now(), false), +('RP-U-0006', 'role_user', 'perm_config_view', 'system', NULL, now(), false); + +-- 访客权限(仅查看) +INSERT INTO sys.tb_sys_role_permission ( + optsn, role_id, permission_id, creator, dept_path, create_time, deleted +) VALUES +('RP-G-0001', 'role_guest', 'perm_user_view', 'system', NULL, now(), false), +('RP-G-0002', 'role_guest', 'perm_file_view', 'system', NULL, now(), false), +('RP-G-0003', 'role_guest', 'perm_message_view', 'system', NULL, now(), false); + +-- ============================= +-- 7. 视图权限关联 +-- ============================= +-- 将视图与对应模块的权限关联 +INSERT INTO sys.tb_sys_view_permission ( + optsn, view_id, permission_id, creator, dept_path, create_time, deleted +) VALUES +-- 用户管理视图关联用户权限 +('VP-0001', 'view_user', 'perm_user_view', 'system', NULL, now(), false), +('VP-0002', 'view_user', 'perm_user_create', 'system', NULL, now(), false), +('VP-0003', 'view_user', 'perm_user_edit', 'system', NULL, now(), false), +('VP-0004', 'view_user', 'perm_user_delete', 'system', NULL, now(), false), +('VP-0005', 'view_user', 'perm_user_export', 'system', NULL, now(), false), + +-- 角色管理视图关联角色权限 +('VP-0011', 'view_role', 'perm_role_view', 'system', NULL, now(), false), +('VP-0012', 'view_role', 'perm_role_create', 'system', NULL, now(), false), +('VP-0013', 'view_role', 'perm_role_edit', 'system', NULL, now(), false), +('VP-0014', 'view_role', 'perm_role_delete', 'system', NULL, now(), false), +('VP-0015', 'view_role', 'perm_role_export', 'system', NULL, now(), false), + +-- 部门管理视图关联部门权限 +('VP-0021', 'view_dept', 'perm_dept_view', 'system', NULL, now(), false), +('VP-0022', 'view_dept', 'perm_dept_create', 'system', NULL, now(), false), +('VP-0023', 'view_dept', 'perm_dept_edit', 'system', NULL, now(), false), +('VP-0024', 'view_dept', 'perm_dept_delete', 'system', NULL, now(), false), +('VP-0025', 'view_dept', 'perm_dept_export', 'system', NULL, now(), false), + +-- 权限管理视图关联权限管理权限 +('VP-0031', 'view_permission', 'perm_permission_view', 'system', NULL, now(), false), +('VP-0032', 'view_permission', 'perm_permission_manage', 'system', NULL, now(), false), + +-- 配置管理视图关联配置权限 +('VP-0041', 'view_config', 'perm_config_view', 'system', NULL, now(), false), +('VP-0042', 'view_config', 'perm_config_edit', 'system', NULL, now(), false), +('VP-0043', 'view_config', 'perm_config_export', 'system', NULL, now(), false), + +-- 文件管理视图关联文件权限 +('VP-0051', 'view_file', 'perm_file_view', 'system', NULL, now(), false), +('VP-0052', 'view_file', 'perm_file_upload', 'system', NULL, now(), false), +('VP-0053', 'view_file', 'perm_file_download', 'system', NULL, now(), false), +('VP-0054', 'view_file', 'perm_file_delete', 'system', NULL, now(), false), +('VP-0055', 'view_file', 'perm_file_export', 'system', NULL, now(), false), + +-- 消息管理视图关联消息权限 +('VP-0061', 'view_message', 'perm_message_view', 'system', NULL, now(), false), +('VP-0062', 'view_message', 'perm_message_send', 'system', NULL, now(), false), +('VP-0063', 'view_message', 'perm_message_manage', 'system', NULL, now(), false), +('VP-0064', 'view_message', 'perm_message_export', 'system', NULL, now(), false); diff --git a/urbanLifelineServ/.bin/database/postgres/sql/initDataUser.sql b/urbanLifelineServ/.bin/database/postgres/sql/initDataUser.sql new file mode 100644 index 0000000..543dbeb --- /dev/null +++ b/urbanLifelineServ/.bin/database/postgres/sql/initDataUser.sql @@ -0,0 +1,64 @@ +-- 初始化用户数据(与 sys schema 对应) +-- 创建系统管理员账户和示例用户 + +-- ============================= +-- 1. 创建超级管理员用户 +-- ============================= +-- 注意:密码需要使用 bcrypt 加密,这里使用的是 'admin123' 的 bcrypt hash +-- 实际部署时应该修改为安全的密码 +INSERT INTO sys.tb_sys_user ( + optsn, user_id, usercode, password, email, phone, + create_time, status, deleted +) VALUES +('USER-0001', 'user_admin', 'admin', + '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7q0TP/Hza', -- admin123 + 'admin@urbanlifeline.com', '13800138000', + now(), 1, false); + +-- 超级管理员用户信息 +INSERT INTO sys.tb_sys_user_info ( + optsn, user_id, username, avatar, gender, level, remark, + create_time, deleted +) VALUES +('UINFO-0001', 'user_admin', '系统管理员', + '/static/avatar/admin.png', 1, 10, '系统超级管理员账户', + now(), false); + +-- ============================= +-- 2. 关联超级管理员角色 +-- ============================= +INSERT INTO sys.tb_sys_user_role ( + optsn, user_id, role_id, dept_id, dept_path, + creator, create_time, deleted +) VALUES +('UR-0001', 'user_admin', 'role_super_admin', 'dept_root', '/dept_root/', + 'system', now(), false); + +-- ============================= +-- 3. 创建示例普通用户(可选) +-- ============================= +INSERT INTO sys.tb_sys_user ( + optsn, user_id, usercode, password, email, phone, + create_time, status, deleted +) VALUES +('USER-0002', 'user_demo', 'demo', + '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7q0TP/Hza', -- admin123 + 'demo@urbanlifeline.com', '13800138001', + now(), 1, false); + +-- 示例用户信息 +INSERT INTO sys.tb_sys_user_info ( + optsn, user_id, username, avatar, gender, level, remark, + create_time, deleted +) VALUES +('UINFO-0002', 'user_demo', '演示用户', + '/static/avatar/demo.png', 0, 1, '系统演示账户', + now(), false); + +-- 关联普通用户角色 +INSERT INTO sys.tb_sys_user_role ( + optsn, user_id, role_id, dept_id, dept_path, + creator, create_time, deleted +) VALUES +('UR-0002', 'user_demo', 'role_user', 'dept_root', '/dept_root/', + 'system', now(), false); diff --git a/urbanLifelineServ/.bin/database/postgres/sql/optimizations.sql b/urbanLifelineServ/.bin/database/postgres/sql/optimizations.sql deleted file mode 100644 index 246213e..0000000 --- a/urbanLifelineServ/.bin/database/postgres/sql/optimizations.sql +++ /dev/null @@ -1,549 +0,0 @@ --- ============================= --- 数据库优化补丁脚本 --- 基于现有表结构的增强和修改 --- ============================= - --- ============================= --- 1. 用户模块优化 --- ============================= - --- 1.1 移除登录日志表中的敏感密码字段 -DO $$ -BEGIN - IF EXISTS ( - SELECT 1 FROM information_schema.columns - WHERE table_schema = 'sys' - AND table_name = 'tb_sys_login_log' - AND column_name = 'password' - ) THEN - ALTER TABLE sys.tb_sys_login_log DROP COLUMN password; - RAISE NOTICE '已移除登录日志表的密码字段'; - END IF; -END $$; - --- 1.2 创建用户部门关联表 -CREATE TABLE IF NOT EXISTS sys.tb_sys_user_dept ( - optsn VARCHAR(50) NOT NULL, - user_id VARCHAR(50) NOT NULL, - dept_id VARCHAR(50) NOT NULL, - is_primary BOOLEAN DEFAULT false, - position VARCHAR(100), - creator VARCHAR(50) DEFAULT NULL, - updater VARCHAR(50) DEFAULT NULL, - create_time TIMESTAMPTZ NOT NULL DEFAULT now(), - update_time TIMESTAMPTZ DEFAULT NULL, - delete_time TIMESTAMPTZ DEFAULT NULL, - deleted BOOLEAN NOT NULL DEFAULT false, - PRIMARY KEY (user_id, dept_id), - UNIQUE (optsn), - FOREIGN KEY (user_id) REFERENCES sys.tb_sys_user(user_id), - FOREIGN KEY (dept_id) REFERENCES sys.tb_sys_dept(dept_id) -); - -COMMENT ON TABLE sys.tb_sys_user_dept IS '用户部门关联表'; -COMMENT ON COLUMN sys.tb_sys_user_dept.is_primary IS '是否主部门'; -COMMENT ON COLUMN sys.tb_sys_user_dept.position IS '职位'; - -CREATE INDEX IF NOT EXISTS idx_user_dept_user ON sys.tb_sys_user_dept(user_id) WHERE deleted = false; -CREATE INDEX IF NOT EXISTS idx_user_dept_dept ON sys.tb_sys_user_dept(dept_id) WHERE deleted = false; - --- 1.3 用户表添加主部门字段 -DO $$ -BEGIN - IF NOT EXISTS ( - SELECT 1 FROM information_schema.columns - WHERE table_schema = 'sys' - AND table_name = 'tb_sys_user' - AND column_name = 'primary_dept_id' - ) THEN - ALTER TABLE sys.tb_sys_user ADD COLUMN primary_dept_id VARCHAR(50); - COMMENT ON COLUMN sys.tb_sys_user.primary_dept_id IS '主部门ID'; - END IF; -END $$; - --- ============================= --- 2. 权限模块优化 --- ============================= - --- 2.1 角色表添加排序字段 -DO $$ -BEGIN - IF NOT EXISTS ( - SELECT 1 FROM information_schema.columns - WHERE table_schema = 'sys' - AND table_name = 'tb_sys_role' - AND column_name = 'order_num' - ) THEN - ALTER TABLE sys.tb_sys_role ADD COLUMN order_num INTEGER DEFAULT 0; - COMMENT ON COLUMN sys.tb_sys_role.order_num IS '排序号'; - END IF; -END $$; - --- 2.2 权限表添加权限类型字段 -DO $$ -BEGIN - IF NOT EXISTS ( - SELECT 1 FROM information_schema.columns - WHERE table_schema = 'sys' - AND table_name = 'tb_sys_permission' - AND column_name = 'permission_type' - ) THEN - ALTER TABLE sys.tb_sys_permission ADD COLUMN permission_type VARCHAR(20) DEFAULT 'action'; - COMMENT ON COLUMN sys.tb_sys_permission.permission_type IS '权限类型:action-操作权限/data-数据权限/menu-菜单权限'; - END IF; -END $$; - --- ============================= --- 3. 文件模块扩展 --- ============================= - --- 3.1 文件表添加版本管理字段 -DO $$ -BEGIN - IF NOT EXISTS ( - SELECT 1 FROM information_schema.columns - WHERE table_schema = 'file' - AND table_name = 'tb_sys_file' - AND column_name = 'version' - ) THEN - ALTER TABLE file.tb_sys_file - ADD COLUMN version VARCHAR(20) DEFAULT '1.0', - ADD COLUMN parent_file_id VARCHAR(50), - ADD COLUMN is_latest BOOLEAN DEFAULT true; - - COMMENT ON COLUMN file.tb_sys_file.version IS '文件版本号'; - COMMENT ON COLUMN file.tb_sys_file.parent_file_id IS '父文件ID(版本链)'; - COMMENT ON COLUMN file.tb_sys_file.is_latest IS '是否最新版本'; - END IF; -END $$; - --- 3.2 文件表添加分类和标签 -DO $$ -BEGIN - IF NOT EXISTS ( - SELECT 1 FROM information_schema.columns - WHERE table_schema = 'file' - AND table_name = 'tb_sys_file' - AND column_name = 'category' - ) THEN - ALTER TABLE file.tb_sys_file - ADD COLUMN category VARCHAR(100), - ADD COLUMN tags TEXT[], - ADD COLUMN metadata JSONB; - - COMMENT ON COLUMN file.tb_sys_file.category IS '文件分类'; - COMMENT ON COLUMN file.tb_sys_file.tags IS '文件标签数组'; - COMMENT ON COLUMN file.tb_sys_file.metadata IS '文件元数据'; - END IF; -END $$; - --- 3.3 创建文件关联表 -CREATE TABLE IF NOT EXISTS file.tb_file_relation ( - optsn VARCHAR(50) NOT NULL, - relation_id VARCHAR(50) NOT NULL, - file_id VARCHAR(50) NOT NULL, - object_type VARCHAR(50) NOT NULL, - object_id VARCHAR(50) NOT NULL, - relation_type VARCHAR(30) DEFAULT 'attachment', - order_num INTEGER DEFAULT 0, - creator VARCHAR(50) DEFAULT NULL, - updater VARCHAR(50) DEFAULT NULL, - create_time TIMESTAMPTZ NOT NULL DEFAULT now(), - update_time TIMESTAMPTZ DEFAULT NULL, - delete_time TIMESTAMPTZ DEFAULT NULL, - deleted BOOLEAN NOT NULL DEFAULT false, - PRIMARY KEY (relation_id), - UNIQUE (optsn), - FOREIGN KEY (file_id) REFERENCES file.tb_sys_file(file_id) -); - -COMMENT ON TABLE file.tb_file_relation IS '文件关联表'; -COMMENT ON COLUMN file.tb_file_relation.object_type IS '对象类型:bidding_project/ticket/document等'; -COMMENT ON COLUMN file.tb_file_relation.object_id IS '对象ID'; -COMMENT ON COLUMN file.tb_file_relation.relation_type IS '关联类型:attachment-附件/avatar-头像/banner-横幅'; - -CREATE INDEX IF NOT EXISTS idx_file_relation_object -ON file.tb_file_relation(object_type, object_id) WHERE deleted = false; -CREATE INDEX IF NOT EXISTS idx_file_relation_file -ON file.tb_file_relation(file_id) WHERE deleted = false; - --- ============================= --- 4. 消息模块增强 --- ============================= - --- 4.1 创建消息模板表 -CREATE TABLE IF NOT EXISTS message.tb_message_template ( - optsn VARCHAR(50) NOT NULL, - template_id VARCHAR(50) NOT NULL, - template_code VARCHAR(100) NOT NULL, - template_name VARCHAR(255) NOT NULL, - template_type VARCHAR(30) NOT NULL, - title_template TEXT, - content_template TEXT NOT NULL, - variables JSONB, - dept_path VARCHAR(255) DEFAULT NULL, - creator VARCHAR(50) DEFAULT NULL, - updater VARCHAR(50) DEFAULT NULL, - create_time TIMESTAMPTZ NOT NULL DEFAULT now(), - update_time TIMESTAMPTZ DEFAULT NULL, - delete_time TIMESTAMPTZ DEFAULT NULL, - deleted BOOLEAN NOT NULL DEFAULT false, - PRIMARY KEY (template_id), - UNIQUE (optsn), - UNIQUE (template_code) -); - -COMMENT ON TABLE message.tb_message_template IS '消息模板表'; -COMMENT ON COLUMN message.tb_message_template.template_type IS '模板类型:system-系统/business-业务'; -COMMENT ON COLUMN message.tb_message_template.variables IS '模板变量定义'; - -CREATE INDEX IF NOT EXISTS idx_template_type -ON message.tb_message_template(template_type) WHERE deleted = false; - --- ============================= --- 5. 日志模块优化 --- ============================= - --- 5.1 日志表添加trace_id用于链路追踪 -DO $$ -BEGIN - IF NOT EXISTS ( - SELECT 1 FROM information_schema.columns - WHERE table_schema = 'log' - AND table_name = 'tb_sys_log' - AND column_name = 'trace_id' - ) THEN - ALTER TABLE log.tb_sys_log - ADD COLUMN trace_id VARCHAR(50), - ADD COLUMN span_id VARCHAR(50), - ADD COLUMN parent_span_id VARCHAR(50); - - COMMENT ON COLUMN log.tb_sys_log.trace_id IS '追踪ID(用于分布式追踪)'; - COMMENT ON COLUMN log.tb_sys_log.span_id IS '跨度ID'; - COMMENT ON COLUMN log.tb_sys_log.parent_span_id IS '父跨度ID'; - - CREATE INDEX idx_log_trace ON log.tb_sys_log(trace_id) WHERE trace_id IS NOT NULL; - END IF; -END $$; - --- ============================= --- 6. 全文搜索索引 --- ============================= - --- 6.1 为知识文档标题创建全文搜索索引 -CREATE INDEX IF NOT EXISTS idx_knowledge_doc_title_trgm -ON knowledge.tb_knowledge_document USING gin(title gin_trgm_ops) -WHERE deleted = false; - --- 6.2 为招标项目名称创建全文搜索索引 -CREATE INDEX IF NOT EXISTS idx_project_name_trgm -ON bidding.tb_bidding_project USING gin(project_name gin_trgm_ops) -WHERE deleted = false; - --- 6.3 为客户姓名创建全文搜索索引 -CREATE INDEX IF NOT EXISTS idx_customer_name_trgm -ON customer_service.tb_customer USING gin(customer_name gin_trgm_ops) -WHERE deleted = false; - --- ============================= --- 7. JSONB字段优化索引 --- ============================= - --- 7.1 智能体配置JSONB索引 -CREATE INDEX IF NOT EXISTS idx_agent_model_config_gin -ON agent.tb_agent USING gin(model_config) -WHERE deleted = false; - --- 7.2 工单元数据JSONB索引 -CREATE INDEX IF NOT EXISTS idx_ticket_metadata_gin -ON customer_service.tb_ticket USING gin(metadata) -WHERE deleted = false; - --- ============================= --- 8. 性能优化视图 --- ============================= - --- 8.1 用户完整权限视图(包含ACL) -CREATE OR REPLACE VIEW sys.v_user_full_permissions AS -WITH user_roles AS ( - -- 用户直接拥有的角色权限 - SELECT DISTINCT - ur.user_id, - p.permission_id, - p.code AS permission_code, - p.name AS permission_name, - 'role' AS source_type, - r.role_id AS source_id - FROM sys.tb_sys_user_role ur - JOIN sys.tb_sys_role r ON ur.role_id = r.role_id - JOIN sys.tb_sys_role_permission rp ON r.role_id = rp.role_id - JOIN sys.tb_sys_permission p ON rp.permission_id = p.permission_id - WHERE ur.deleted = false - AND r.deleted = false - AND rp.deleted = false - AND p.deleted = false -), -user_acls AS ( - -- 用户的ACL权限 - SELECT DISTINCT - principal_id AS user_id, - object_type || ':' || object_id AS permission_id, - object_type || '_' || - CASE - WHEN (permission & 1) = 1 THEN 'read' - WHEN (permission & 2) = 2 THEN 'write' - WHEN (permission & 4) = 4 THEN 'exec' - END AS permission_code, - 'ACL permission on ' || object_type AS permission_name, - 'acl' AS source_type, - acl_id AS source_id - FROM sys.tb_sys_acl - WHERE principal_type = 'user' - AND allow = true - AND deleted = false -) -SELECT * FROM user_roles -UNION ALL -SELECT * FROM user_acls; - -COMMENT ON VIEW sys.v_user_full_permissions IS '用户完整权限视图(包含角色权限和ACL权限)'; - --- 8.2 智能体实时状态视图 -CREATE OR REPLACE VIEW agent.v_agent_realtime_status AS -SELECT - a.agent_id, - a.agent_name, - a.agent_type, - a.status, - COUNT(DISTINCT s.session_id) FILTER (WHERE s.session_status = 'active') AS active_sessions, - COUNT(DISTINCT s.user_id) FILTER (WHERE s.start_time > now() - interval '24 hours') AS daily_users, - COALESCE(SUM(s.message_count) FILTER (WHERE s.start_time > now() - interval '1 hour'), 0) AS hourly_messages, - COALESCE(AVG(r.rating) FILTER (WHERE r.create_time > now() - interval '7 days'), 0) AS weekly_avg_rating -FROM agent.tb_agent a -LEFT JOIN agent.tb_agent_session s ON a.agent_id = s.agent_id AND s.deleted = false -LEFT JOIN agent.tb_agent_rating r ON a.agent_id = r.agent_id AND r.deleted = false -WHERE a.deleted = false -GROUP BY a.agent_id, a.agent_name, a.agent_type, a.status; - -COMMENT ON VIEW agent.v_agent_realtime_status IS '智能体实时状态视图'; - --- 8.3 工单处理效率视图 -CREATE OR REPLACE VIEW customer_service.v_ticket_efficiency AS -SELECT - DATE(t.create_time) AS stat_date, - t.ticket_type, - t.priority, - COUNT(*) AS total_tickets, - COUNT(*) FILTER (WHERE t.ticket_status = 'resolved') AS resolved_tickets, - COUNT(*) FILTER (WHERE t.is_overdue) AS overdue_tickets, - AVG(EXTRACT(EPOCH FROM (t.response_time - t.create_time))/60) AS avg_response_minutes, - AVG(EXTRACT(EPOCH FROM (t.resolution_time - t.create_time))/3600) FILTER (WHERE t.resolution_time IS NOT NULL) AS avg_resolution_hours, - AVG(t.customer_rating) FILTER (WHERE t.customer_rating IS NOT NULL) AS avg_rating -FROM customer_service.tb_ticket t -WHERE t.deleted = false - AND t.create_time > now() - interval '90 days' -GROUP BY DATE(t.create_time), t.ticket_type, t.priority; - -COMMENT ON VIEW customer_service.v_ticket_efficiency IS '工单处理效率统计视图'; - --- ============================= --- 9. 审计触发器增强 --- ============================= - --- 9.1 创建审计日志函数 -CREATE OR REPLACE FUNCTION public.audit_trigger_func() -RETURNS TRIGGER AS $$ -DECLARE - audit_data JSONB; -BEGIN - IF (TG_OP = 'DELETE') THEN - audit_data := jsonb_build_object( - 'operation', 'DELETE', - 'table', TG_TABLE_SCHEMA || '.' || TG_TABLE_NAME, - 'old_data', row_to_json(OLD) - ); - - INSERT INTO log.tb_sys_log ( - optsn, log_id, type, level, module, message, data, creator - ) VALUES ( - 'AUDIT_' || gen_random_uuid()::text, - gen_random_uuid()::text, - 'audit', - 'info', - TG_TABLE_SCHEMA || '.' || TG_TABLE_NAME, - 'Record deleted', - audit_data, - COALESCE(current_setting('app.current_user_id', true), 'system') - ); - RETURN OLD; - - ELSIF (TG_OP = 'UPDATE') THEN - audit_data := jsonb_build_object( - 'operation', 'UPDATE', - 'table', TG_TABLE_SCHEMA || '.' || TG_TABLE_NAME, - 'old_data', row_to_json(OLD), - 'new_data', row_to_json(NEW) - ); - - INSERT INTO log.tb_sys_log ( - optsn, log_id, type, level, module, message, data, creator - ) VALUES ( - 'AUDIT_' || gen_random_uuid()::text, - gen_random_uuid()::text, - 'audit', - 'info', - TG_TABLE_SCHEMA || '.' || TG_TABLE_NAME, - 'Record updated', - audit_data, - COALESCE(current_setting('app.current_user_id', true), 'system') - ); - RETURN NEW; - - ELSIF (TG_OP = 'INSERT') THEN - audit_data := jsonb_build_object( - 'operation', 'INSERT', - 'table', TG_TABLE_SCHEMA || '.' || TG_TABLE_NAME, - 'new_data', row_to_json(NEW) - ); - - INSERT INTO log.tb_sys_log ( - optsn, log_id, type, level, module, message, data, creator - ) VALUES ( - 'AUDIT_' || gen_random_uuid()::text, - gen_random_uuid()::text, - 'audit', - 'info', - TG_TABLE_SCHEMA || '.' || TG_TABLE_NAME, - 'Record created', - audit_data, - COALESCE(current_setting('app.current_user_id', true), 'system') - ); - RETURN NEW; - END IF; -END; -$$ LANGUAGE plpgsql; - -COMMENT ON FUNCTION public.audit_trigger_func() IS '审计日志触发器函数'; - --- ============================= --- 10. 数据归档函数 --- ============================= - --- 10.1 创建日志归档函数 -CREATE OR REPLACE FUNCTION public.archive_old_logs( - p_months_to_keep INTEGER DEFAULT 6 -) -RETURNS TABLE( - archived_count INTEGER, - deleted_count INTEGER -) AS $$ -DECLARE - v_cutoff_date TIMESTAMPTZ; - v_archived INTEGER := 0; - v_deleted INTEGER := 0; -BEGIN - v_cutoff_date := now() - (p_months_to_keep || ' months')::INTERVAL; - - -- 归档系统日志 - CREATE TABLE IF NOT EXISTS log.tb_sys_log_archived (LIKE log.tb_sys_log INCLUDING ALL); - - WITH moved_rows AS ( - INSERT INTO log.tb_sys_log_archived - SELECT * FROM log.tb_sys_log - WHERE create_time < v_cutoff_date - RETURNING * - ) - SELECT COUNT(*) INTO v_archived FROM moved_rows; - - DELETE FROM log.tb_sys_log - WHERE create_time < v_cutoff_date; - - GET DIAGNOSTICS v_deleted = ROW_COUNT; - - RETURN QUERY SELECT v_archived, v_deleted; -END; -$$ LANGUAGE plpgsql; - -COMMENT ON FUNCTION public.archive_old_logs IS '归档旧日志数据'; - --- 10.2 创建API调用日志归档函数 -CREATE OR REPLACE FUNCTION agent.archive_api_logs( - p_months_to_keep INTEGER DEFAULT 3 -) -RETURNS INTEGER AS $$ -DECLARE - v_cutoff_date TIMESTAMPTZ; - v_archived INTEGER; -BEGIN - v_cutoff_date := now() - (p_months_to_keep || ' months')::INTERVAL; - - CREATE TABLE IF NOT EXISTS agent.tb_api_call_log_archived (LIKE agent.tb_api_call_log INCLUDING ALL); - - WITH moved_rows AS ( - INSERT INTO agent.tb_api_call_log_archived - SELECT * FROM agent.tb_api_call_log - WHERE create_time < v_cutoff_date - RETURNING * - ) - SELECT COUNT(*) INTO v_archived FROM moved_rows; - - DELETE FROM agent.tb_api_call_log - WHERE create_time < v_cutoff_date; - - RETURN v_archived; -END; -$$ LANGUAGE plpgsql; - -COMMENT ON FUNCTION agent.archive_api_logs IS '归档旧API调用日志'; - --- ============================= --- 11. 性能监控函数 --- ============================= - --- 11.1 表膨胀检查函数 -CREATE OR REPLACE FUNCTION public.check_table_bloat() -RETURNS TABLE( - schemaname TEXT, - tablename TEXT, - table_size_mb NUMERIC, - bloat_size_mb NUMERIC, - bloat_ratio NUMERIC -) AS $$ -BEGIN - RETURN QUERY - SELECT - s.schemaname::TEXT, - s.tablename::TEXT, - ROUND(pg_total_relation_size(s.schemaname || '.' || s.tablename)::NUMERIC / 1024 / 1024, 2) AS table_size_mb, - ROUND((pg_total_relation_size(s.schemaname || '.' || s.tablename) - pg_relation_size(s.schemaname || '.' || s.tablename))::NUMERIC / 1024 / 1024, 2) AS bloat_size_mb, - ROUND(((pg_total_relation_size(s.schemaname || '.' || s.tablename) - pg_relation_size(s.schemaname || '.' || s.tablename))::NUMERIC / NULLIF(pg_total_relation_size(s.schemaname || '.' || s.tablename), 0) * 100), 2) AS bloat_ratio - FROM pg_tables s - WHERE s.schemaname IN ('sys', 'file', 'message', 'log', 'config', 'knowledge', 'bidding', 'customer_service', 'agent') - ORDER BY pg_total_relation_size(s.schemaname || '.' || s.tablename) DESC; -END; -$$ LANGUAGE plpgsql; - -COMMENT ON FUNCTION public.check_table_bloat IS '检查表膨胀情况'; - --- ============================= --- 执行完成提示 --- ============================= -DO $$ -BEGIN - RAISE NOTICE '=============================='; - RAISE NOTICE '数据库优化补丁执行完成!'; - RAISE NOTICE '=============================='; - RAISE NOTICE '已完成以下优化:'; - RAISE NOTICE '1. 用户模块:移除敏感字段、添加部门关联'; - RAISE NOTICE '2. 权限模块:添加排序和类型字段'; - RAISE NOTICE '3. 文件模块:版本管理、分类标签、关联表'; - RAISE NOTICE '4. 消息模块:消息模板表'; - RAISE NOTICE '5. 日志模块:链路追踪支持'; - RAISE NOTICE '6. 全文搜索:添加GIN索引'; - RAISE NOTICE '7. JSONB优化:添加GIN索引'; - RAISE NOTICE '8. 性能视图:用户权限、智能体状态、工单效率'; - RAISE NOTICE '9. 审计增强:完整审计触发器'; - RAISE NOTICE '10. 数据归档:日志和API调用归档函数'; - RAISE NOTICE '11. 监控工具:表膨胀检查函数'; - RAISE NOTICE '=============================='; -END $$;