sql更新

This commit is contained in:
2025-12-02 14:59:34 +08:00
parent 94718edd6b
commit 2a9e624ba9
18 changed files with 1542 additions and 937 deletions

View File

@@ -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<Document> getBiddingDocuments(String deptPath) {
return documentMapper.selectList(
new QueryWrapper<Document>()
.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
**最后更新:** 知识库版本管理、多服务隔离、字段重命名

View File

@@ -200,10 +200,10 @@ ORDER BY order_num;
| 表名 | 说明 | 主键 | 核心字段 | | 表名 | 说明 | 主键 | 核心字段 |
|------|------|------|----------| |------|------|------|----------|
| `tb_knowledge_base` | 知识库表 | kb_id | name, kb_type, access_level, version | | `tb_knowledge_base` | 知识库表 | knowledge_id | name, kb_type, access_level, version |
| `tb_knowledge_document` | 知识文档表 | doc_id | kb_id, title, doc_type, category, embedding_status | | `tb_knowledge_document` | 知识文档表 | doc_id | knowledge_id, title, doc_type, category, embedding_status |
| `tb_knowledge_chunk` | 文档片段表 | chunk_id | doc_id, kb_id, content, embedding | | `tb_knowledge_chunk` | 文档片段表 | chunk_id | doc_id, knowledge_id, content, embedding |
| `tb_knowledge_access_log` | 知识访问日志表 | log_id | kb_id, doc_id, user_id, access_type | | `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 SELECT d.*, kb.name AS kb_name
FROM knowledge.tb_knowledge_document d FROM knowledge.tb_knowledge_document d
JOIN knowledge.tb_knowledge_base kb ON d.kb_id = kb.kb_id JOIN knowledge.tb_knowledge_base kb ON d.knowledge_id = kb.knowledge_id
WHERE d.kb_id = 'KB_ID' WHERE d.knowledge_id = 'knowledge_id'
AND d.embedding_status = 'completed' AND d.embedding_status = 'completed'
AND d.deleted = false; AND d.deleted = false;
@@ -242,7 +242,7 @@ WHERE d.kb_id = 'KB_ID'
-- SELECT chunk_id, content, -- SELECT chunk_id, content,
-- 1 - (embedding <=> '[查询向量]'::vector) AS similarity -- 1 - (embedding <=> '[查询向量]'::vector) AS similarity
-- FROM knowledge.tb_knowledge_chunk -- FROM knowledge.tb_knowledge_chunk
-- WHERE kb_id = 'KB_ID' -- WHERE knowledge_id = 'knowledge_id'
-- ORDER BY embedding <=> '[查询向量]'::vector -- ORDER BY embedding <=> '[查询向量]'::vector
-- LIMIT 10; -- LIMIT 10;
``` ```

View File

@@ -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: 不需要,这些表的数据在系统运行时动态产生
## 联系支持
如有问题,请联系技术支持团队。

View File

@@ -1,308 +1,306 @@
-- ============================= -- -- =============================
-- 智能体管理和平台基础设施模块 -- -- 智能体管理和平台基础设施模块
-- 支持智能体广场、API集成管理、智能体运维监控 -- -- 支持智能体广场、API集成管理、智能体运维监控
-- ============================= -- -- =============================
CREATE SCHEMA IF NOT EXISTS agent; -- CREATE SCHEMA IF NOT EXISTS agent;
-- 智能体定义表 -- -- 智能体定义表
DROP TABLE IF EXISTS agent.tb_agent CASCADE; -- DROP TABLE IF EXISTS agent.tb_agent CASCADE;
CREATE TABLE agent.tb_agent ( -- CREATE TABLE agent.tb_agent (
optsn VARCHAR(50) NOT NULL, -- 流水号 -- optsn VARCHAR(50) NOT NULL, -- 流水号
agent_id VARCHAR(50) NOT NULL, -- 智能体ID -- agent_id VARCHAR(50) NOT NULL, -- 智能体ID
agent_code VARCHAR(100) NOT NULL, -- 智能体编码(唯一标识) -- agent_code VARCHAR(100) NOT NULL, -- 智能体编码(唯一标识)
agent_name VARCHAR(255) NOT NULL, -- 智能体名称 -- agent_name VARCHAR(255) NOT NULL, -- 智能体名称
agent_type VARCHAR(50) NOT NULL, -- 智能体类型bidding-招投标/customer_service-客服/knowledge_assistant-知识助手/custom-自定义 -- agent_type VARCHAR(50) NOT NULL, -- 智能体类型bidding-招投标/customer_service-客服/knowledge_assistant-知识助手/custom-自定义
display_name VARCHAR(255) NOT NULL, -- 展示名称 -- display_name VARCHAR(255) NOT NULL, -- 展示名称
description TEXT, -- 智能体描述 -- description TEXT, -- 智能体描述
icon VARCHAR(500), -- 图标URL -- icon VARCHAR(500), -- 图标URL
banner VARCHAR(500), -- Banner图URL -- banner VARCHAR(500), -- Banner图URL
version VARCHAR(20) DEFAULT '1.0.0', -- 版本号 -- version VARCHAR(20) DEFAULT '1.0.0', -- 版本号
model_provider VARCHAR(50), -- 模型提供商openai/anthropic/baidu/aliyun/custom -- model_provider VARCHAR(50), -- 模型提供商openai/anthropic/baidu/aliyun/custom
model_name VARCHAR(100), -- 模型名称 -- model_name VARCHAR(100), -- 模型名称
model_config JSONB, -- 模型配置温度、最大tokens等 -- model_config JSONB, -- 模型配置温度、最大tokens等
prompt_template TEXT, -- 提示词模板 -- prompt_template TEXT, -- 提示词模板
system_prompt TEXT, -- 系统提示词 -- system_prompt TEXT, -- 系统提示词
kb_ids VARCHAR(50)[], -- 关联知识库ID数组 -- capabilities TEXT[], -- 能力列表
tool_ids VARCHAR(50)[], -- 关联工具ID数组 -- access_level VARCHAR(20) DEFAULT 'private', -- 访问级别public-公开/private-私有/internal-内部
capabilities TEXT[], -- 能力列表 -- is_published BOOLEAN DEFAULT false, -- 是否发布到智能体广场
access_level VARCHAR(20) DEFAULT 'private', -- 访问级别public-公开/private-私有/internal-内部 -- usage_count INTEGER DEFAULT 0, -- 使用次数
is_published BOOLEAN DEFAULT false, -- 是否发布到智能体广场 -- rating DECIMAL(3,2) DEFAULT 0, -- 评分0-5
usage_count INTEGER DEFAULT 0, -- 使用次 -- rating_count INTEGER DEFAULT 0, -- 评分人
rating DECIMAL(3,2) DEFAULT 0, -- 评分0-5 -- tags TEXT[], -- 标签数组
rating_count INTEGER DEFAULT 0, -- 评分人数 -- category VARCHAR(100), -- 分类
tags TEXT[], -- 标签数组 -- dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
category VARCHAR(100), -- 分类 -- owner_user_id VARCHAR(50), -- 所有者用户ID
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 -- status VARCHAR(20) DEFAULT 'active', -- 状态active-激活/inactive-停用/under_maintenance-维护中
owner_user_id VARCHAR(50), -- 所有者用户ID -- creator VARCHAR(50) DEFAULT NULL, -- 创建者
status VARCHAR(20) DEFAULT 'active', -- 状态active-激活/inactive-停用/under_maintenance-维护中 -- updater VARCHAR(50) DEFAULT NULL, -- 更新者
creator VARCHAR(50) DEFAULT NULL, -- 创建 -- create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
updater VARCHAR(50) DEFAULT NULL, -- 更新 -- update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间
create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 -- delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间
update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 -- deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除
delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 -- PRIMARY KEY (agent_id),
deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 -- UNIQUE (optsn),
PRIMARY KEY (agent_id), -- UNIQUE (agent_code)
UNIQUE (optsn), -- );
UNIQUE (agent_code)
);
CREATE INDEX idx_agent_type ON agent.tb_agent(agent_type) 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_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_category ON agent.tb_agent(category) WHERE deleted = false;
COMMENT ON TABLE agent.tb_agent IS '智能体定义表'; -- COMMENT ON TABLE agent.tb_agent IS '智能体定义表';
COMMENT ON COLUMN agent.tb_agent.agent_type IS '智能体类型bidding/customer_service/knowledge_assistant/custom'; -- COMMENT ON COLUMN agent.tb_agent.agent_type IS '智能体类型bidding/customer_service/knowledge_assistant/custom';
-- 智能体会话表 -- -- 智能体会话表
DROP TABLE IF EXISTS agent.tb_agent_session CASCADE; -- DROP TABLE IF EXISTS agent.tb_agent_session CASCADE;
CREATE TABLE agent.tb_agent_session ( -- CREATE TABLE agent.tb_agent_session (
optsn VARCHAR(50) NOT NULL, -- 流水号 -- optsn VARCHAR(50) NOT NULL, -- 流水号
session_id VARCHAR(50) NOT NULL, -- 会话ID -- session_id VARCHAR(50) NOT NULL, -- 会话ID
agent_id VARCHAR(50) NOT NULL, -- 智能体ID -- agent_id VARCHAR(50) NOT NULL, -- 智能体ID
user_id VARCHAR(50) NOT NULL, -- 用户ID -- user_id VARCHAR(50) NOT NULL, -- 用户ID
session_type VARCHAR(30) DEFAULT 'chat', -- 会话类型chat-对话/task-任务/workflow-工作流 -- session_type VARCHAR(30) DEFAULT 'chat', -- 会话类型chat-对话/task-任务/workflow-工作流
session_name VARCHAR(255), -- 会话名称 -- session_name VARCHAR(255), -- 会话名称
context JSONB, -- 会话上下文 -- context JSONB, -- 会话上下文
session_status VARCHAR(20) DEFAULT 'active', -- 会话状态active-活跃/paused-暂停/ended-结束 -- session_status VARCHAR(20) DEFAULT 'active', -- 会话状态active-活跃/paused-暂停/ended-结束
start_time TIMESTAMPTZ DEFAULT now(), -- 开始时间 -- start_time TIMESTAMPTZ DEFAULT now(), -- 开始时间
end_time TIMESTAMPTZ, -- 结束时间 -- end_time TIMESTAMPTZ, -- 结束时间
message_count INTEGER DEFAULT 0, -- 消息数量 -- message_count INTEGER DEFAULT 0, -- 消息数量
token_usage INTEGER DEFAULT 0, -- Token使用量 -- token_usage INTEGER DEFAULT 0, -- Token使用量
cost DECIMAL(10,4) DEFAULT 0, -- 成本 -- cost DECIMAL(10,4) DEFAULT 0, -- 成本
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 -- dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
creator VARCHAR(50) DEFAULT NULL, -- 创建者 -- creator VARCHAR(50) DEFAULT NULL, -- 创建者
create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 -- create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 -- update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间
deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 -- deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除
PRIMARY KEY (session_id), -- PRIMARY KEY (session_id),
UNIQUE (optsn), -- UNIQUE (optsn),
FOREIGN KEY (agent_id) REFERENCES agent.tb_agent(agent_id) -- 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_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_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; -- DROP TABLE IF EXISTS agent.tb_agent_message CASCADE;
CREATE TABLE agent.tb_agent_message ( -- CREATE TABLE agent.tb_agent_message (
optsn VARCHAR(50) NOT NULL, -- 流水号 -- optsn VARCHAR(50) NOT NULL, -- 流水号
message_id VARCHAR(50) NOT NULL, -- 消息ID -- message_id VARCHAR(50) NOT NULL, -- 消息ID
session_id VARCHAR(50) NOT NULL, -- 会话ID -- session_id VARCHAR(50) NOT NULL, -- 会话ID
agent_id VARCHAR(50) NOT NULL, -- 智能体ID -- agent_id VARCHAR(50) NOT NULL, -- 智能体ID
role VARCHAR(20) NOT NULL, -- 角色user-用户/assistant-助手/system-系统/function-函数 -- role VARCHAR(20) NOT NULL, -- 角色user-用户/assistant-助手/system-系统/function-函数
content TEXT, -- 消息内容 -- content TEXT, -- 消息内容
content_type VARCHAR(30) DEFAULT 'text', -- 内容类型text-文本/image-图片/file-文件/structured-结构化数据 -- content_type VARCHAR(30) DEFAULT 'text', -- 内容类型text-文本/image-图片/file-文件/structured-结构化数据
function_call JSONB, -- 函数调用JSON格式 -- function_call JSONB, -- 函数调用JSON格式
function_response JSONB, -- 函数响应 -- function_response JSONB, -- 函数响应
token_count INTEGER, -- Token数量 -- token_count INTEGER, -- Token数量
model_name VARCHAR(100), -- 使用的模型 -- model_name VARCHAR(100), -- 使用的模型
kb_references JSONB, -- 知识库引用JSON数组 -- kb_references JSONB, -- 知识库引用JSON数组
metadata JSONB, -- 消息元数据 -- metadata JSONB, -- 消息元数据
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 -- dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 -- create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 -- deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除
PRIMARY KEY (message_id), -- PRIMARY KEY (message_id),
UNIQUE (optsn), -- UNIQUE (optsn),
FOREIGN KEY (session_id) REFERENCES agent.tb_agent_session(session_id), -- FOREIGN KEY (session_id) REFERENCES agent.tb_agent_session(session_id),
FOREIGN KEY (agent_id) REFERENCES agent.tb_agent(agent_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_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_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; -- DROP TABLE IF EXISTS agent.tb_agent_tool CASCADE;
CREATE TABLE agent.tb_agent_tool ( -- CREATE TABLE agent.tb_agent_tool (
optsn VARCHAR(50) NOT NULL, -- 流水号 -- optsn VARCHAR(50) NOT NULL, -- 流水号
tool_id VARCHAR(50) NOT NULL, -- 工具ID -- tool_id VARCHAR(50) NOT NULL, -- 工具ID
tool_code VARCHAR(100) NOT NULL, -- 工具编码 -- tool_code VARCHAR(100) NOT NULL, -- 工具编码
tool_name VARCHAR(255) NOT NULL, -- 工具名称 -- tool_name VARCHAR(255) NOT NULL, -- 工具名称
tool_type VARCHAR(50) NOT NULL, -- 工具类型api-API调用/function-函数/plugin-插件/integration-集成 -- tool_type VARCHAR(50) NOT NULL, -- 工具类型api-API调用/function-函数/plugin-插件/integration-集成
description TEXT, -- 工具描述 -- description TEXT, -- 工具描述
function_schema JSONB, -- 函数SchemaOpenAI function calling格式 -- function_schema JSONB, -- 函数SchemaOpenAI function calling格式
api_endpoint VARCHAR(500), -- API端点 -- api_endpoint VARCHAR(500), -- API端点
api_method VARCHAR(10), -- API方法GET/POST/PUT/DELETE -- api_method VARCHAR(10), -- API方法GET/POST/PUT/DELETE
api_headers JSONB, -- API请求头 -- api_headers JSONB, -- API请求头
auth_type VARCHAR(30), -- 认证类型none/api_key/oauth2/bearer -- auth_type VARCHAR(30), -- 认证类型none/api_key/oauth2/bearer
auth_config JSONB, -- 认证配置(加密存储) -- auth_config JSONB, -- 认证配置(加密存储)
request_template TEXT, -- 请求模板 -- request_template TEXT, -- 请求模板
response_template TEXT, -- 响应模板 -- response_template TEXT, -- 响应模板
timeout_seconds INTEGER DEFAULT 30, -- 超时时间(秒) -- timeout_seconds INTEGER DEFAULT 30, -- 超时时间(秒)
retry_count INTEGER DEFAULT 3, -- 重试次数 -- retry_count INTEGER DEFAULT 3, -- 重试次数
is_enabled BOOLEAN DEFAULT true, -- 是否启用 -- is_enabled BOOLEAN DEFAULT true, -- 是否启用
usage_count INTEGER DEFAULT 0, -- 使用次数 -- usage_count INTEGER DEFAULT 0, -- 使用次数
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 -- dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
creator VARCHAR(50) DEFAULT NULL, -- 创建者 -- creator VARCHAR(50) DEFAULT NULL, -- 创建者
updater VARCHAR(50) DEFAULT NULL, -- 更新者 -- updater VARCHAR(50) DEFAULT NULL, -- 更新者
create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 -- create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 -- update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间
delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 -- delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间
deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 -- deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除
PRIMARY KEY (tool_id), -- PRIMARY KEY (tool_id),
UNIQUE (optsn), -- UNIQUE (optsn),
UNIQUE (tool_code) -- 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集成注册表 -- -- API集成注册表
DROP TABLE IF EXISTS agent.tb_api_integration CASCADE; -- DROP TABLE IF EXISTS agent.tb_api_integration CASCADE;
CREATE TABLE agent.tb_api_integration ( -- CREATE TABLE agent.tb_api_integration (
optsn VARCHAR(50) NOT NULL, -- 流水号 -- optsn VARCHAR(50) NOT NULL, -- 流水号
integration_id VARCHAR(50) NOT NULL, -- 集成ID -- integration_id VARCHAR(50) NOT NULL, -- 集成ID
integration_name VARCHAR(255) NOT NULL, -- 集成名称 -- integration_name VARCHAR(255) NOT NULL, -- 集成名称
integration_type VARCHAR(50) NOT NULL, -- 集成类型rest_api/soap/graphql/webhook/mq -- integration_type VARCHAR(50) NOT NULL, -- 集成类型rest_api/soap/graphql/webhook/mq
provider VARCHAR(100), -- 提供商 -- provider VARCHAR(100), -- 提供商
base_url VARCHAR(500), -- 基础URL -- base_url VARCHAR(500), -- 基础URL
version VARCHAR(20), -- API版本 -- version VARCHAR(20), -- API版本
auth_type VARCHAR(30) DEFAULT 'none', -- 认证类型 -- auth_type VARCHAR(30) DEFAULT 'none', -- 认证类型
auth_config JSONB, -- 认证配置(加密存储) -- auth_config JSONB, -- 认证配置(加密存储)
endpoints JSONB, -- 端点列表JSON数组 -- endpoints JSONB, -- 端点列表JSON数组
rate_limit INTEGER, -- 速率限制(请求/秒) -- rate_limit INTEGER, -- 速率限制(请求/秒)
timeout_seconds INTEGER DEFAULT 30, -- 超时时间 -- timeout_seconds INTEGER DEFAULT 30, -- 超时时间
retry_config JSONB, -- 重试配置 -- retry_config JSONB, -- 重试配置
health_check_url VARCHAR(500), -- 健康检查URL -- health_check_url VARCHAR(500), -- 健康检查URL
health_status VARCHAR(20) DEFAULT 'unknown', -- 健康状态healthy-健康/unhealthy-不健康/unknown-未知 -- health_status VARCHAR(20) DEFAULT 'unknown', -- 健康状态healthy-健康/unhealthy-不健康/unknown-未知
last_health_check TIMESTAMPTZ, -- 最后健康检查时间 -- last_health_check TIMESTAMPTZ, -- 最后健康检查时间
documentation_url VARCHAR(500), -- 文档URL -- documentation_url VARCHAR(500), -- 文档URL
is_enabled BOOLEAN DEFAULT true, -- 是否启用 -- is_enabled BOOLEAN DEFAULT true, -- 是否启用
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 -- dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
creator VARCHAR(50) DEFAULT NULL, -- 创建者 -- creator VARCHAR(50) DEFAULT NULL, -- 创建者
updater VARCHAR(50) DEFAULT NULL, -- 更新者 -- updater VARCHAR(50) DEFAULT NULL, -- 更新者
create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 -- create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 -- update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间
delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 -- delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间
deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 -- deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除
PRIMARY KEY (integration_id), -- PRIMARY KEY (integration_id),
UNIQUE (optsn) -- UNIQUE (optsn)
); -- );
CREATE INDEX idx_integration_type ON agent.tb_api_integration(integration_type) 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; -- 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调用日志表 -- -- API调用日志表
DROP TABLE IF EXISTS agent.tb_api_call_log CASCADE; -- DROP TABLE IF EXISTS agent.tb_api_call_log CASCADE;
CREATE TABLE agent.tb_api_call_log ( -- CREATE TABLE agent.tb_api_call_log (
optsn VARCHAR(50) NOT NULL, -- 流水号 -- optsn VARCHAR(50) NOT NULL, -- 流水号
log_id VARCHAR(50) NOT NULL, -- 日志ID -- log_id VARCHAR(50) NOT NULL, -- 日志ID
integration_id VARCHAR(50), -- 集成ID -- integration_id VARCHAR(50), -- 集成ID
tool_id VARCHAR(50), -- 工具ID -- tool_id VARCHAR(50), -- 工具ID
agent_id VARCHAR(50), -- 智能体ID -- agent_id VARCHAR(50), -- 智能体ID
session_id VARCHAR(50), -- 会话ID -- session_id VARCHAR(50), -- 会话ID
user_id VARCHAR(50), -- 用户ID -- user_id VARCHAR(50), -- 用户ID
endpoint VARCHAR(500) NOT NULL, -- 请求端点 -- endpoint VARCHAR(500) NOT NULL, -- 请求端点
method VARCHAR(10) NOT NULL, -- 请求方法 -- method VARCHAR(10) NOT NULL, -- 请求方法
request_headers JSONB, -- 请求头 -- request_headers JSONB, -- 请求头
request_body TEXT, -- 请求体 -- request_body TEXT, -- 请求体
response_status INTEGER, -- 响应状态码 -- response_status INTEGER, -- 响应状态码
response_headers JSONB, -- 响应头 -- response_headers JSONB, -- 响应头
response_body TEXT, -- 响应体 -- response_body TEXT, -- 响应体
duration_ms INTEGER, -- 请求耗时(毫秒) -- duration_ms INTEGER, -- 请求耗时(毫秒)
is_success BOOLEAN, -- 是否成功 -- is_success BOOLEAN, -- 是否成功
error_message TEXT, -- 错误信息 -- error_message TEXT, -- 错误信息
retry_count INTEGER DEFAULT 0, -- 重试次数 -- retry_count INTEGER DEFAULT 0, -- 重试次数
ip_address VARCHAR(45), -- IP地址 -- ip_address VARCHAR(45), -- IP地址
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 -- dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 -- create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
PRIMARY KEY (log_id), -- PRIMARY KEY (log_id),
UNIQUE (optsn) -- UNIQUE (optsn)
); -- );
CREATE INDEX idx_api_log_integration ON agent.tb_api_call_log(integration_id, 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_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_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; -- DROP TABLE IF EXISTS agent.tb_agent_metrics CASCADE;
CREATE TABLE agent.tb_agent_metrics ( -- CREATE TABLE agent.tb_agent_metrics (
optsn VARCHAR(50) NOT NULL, -- 流水号 -- optsn VARCHAR(50) NOT NULL, -- 流水号
metric_id VARCHAR(50) NOT NULL, -- 指标ID -- metric_id VARCHAR(50) NOT NULL, -- 指标ID
agent_id VARCHAR(50) NOT NULL, -- 智能体ID -- agent_id VARCHAR(50) NOT NULL, -- 智能体ID
metric_date DATE NOT NULL, -- 指标日期 -- metric_date DATE NOT NULL, -- 指标日期
metric_hour INTEGER, -- 指标小时0-23 -- metric_hour INTEGER, -- 指标小时0-23
total_sessions INTEGER DEFAULT 0, -- 总会话数 -- total_sessions INTEGER DEFAULT 0, -- 总会话数
active_sessions INTEGER DEFAULT 0, -- 活跃会话数 -- active_sessions INTEGER DEFAULT 0, -- 活跃会话数
total_messages INTEGER DEFAULT 0, -- 总消息数 -- total_messages INTEGER DEFAULT 0, -- 总消息数
total_tokens BIGINT DEFAULT 0, -- 总Token数 -- total_tokens BIGINT DEFAULT 0, -- 总Token数
total_cost DECIMAL(10,4) DEFAULT 0, -- 总成本 -- total_cost DECIMAL(10,4) DEFAULT 0, -- 总成本
avg_response_time INTEGER, -- 平均响应时间(毫秒) -- avg_response_time INTEGER, -- 平均响应时间(毫秒)
success_rate DECIMAL(5,4), -- 成功率 -- success_rate DECIMAL(5,4), -- 成功率
error_count INTEGER DEFAULT 0, -- 错误次数 -- error_count INTEGER DEFAULT 0, -- 错误次数
api_call_count INTEGER DEFAULT 0, -- API调用次数 -- api_call_count INTEGER DEFAULT 0, -- API调用次数
avg_rating DECIMAL(3,2), -- 平均评分 -- avg_rating DECIMAL(3,2), -- 平均评分
rating_count INTEGER DEFAULT 0, -- 评分数量 -- rating_count INTEGER DEFAULT 0, -- 评分数量
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 -- dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 -- create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 -- update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间
PRIMARY KEY (metric_id), -- PRIMARY KEY (metric_id),
UNIQUE (optsn), -- UNIQUE (optsn),
UNIQUE (agent_id, metric_date, metric_hour), -- UNIQUE (agent_id, metric_date, metric_hour),
FOREIGN KEY (agent_id) REFERENCES agent.tb_agent(agent_id) -- 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; -- DROP TABLE IF EXISTS agent.tb_agent_error_log CASCADE;
CREATE TABLE agent.tb_agent_error_log ( -- CREATE TABLE agent.tb_agent_error_log (
optsn VARCHAR(50) NOT NULL, -- 流水号 -- optsn VARCHAR(50) NOT NULL, -- 流水号
log_id VARCHAR(50) NOT NULL, -- 日志ID -- log_id VARCHAR(50) NOT NULL, -- 日志ID
agent_id VARCHAR(50) NOT NULL, -- 智能体ID -- agent_id VARCHAR(50) NOT NULL, -- 智能体ID
session_id VARCHAR(50), -- 会话ID -- session_id VARCHAR(50), -- 会话ID
error_type VARCHAR(50) NOT NULL, -- 错误类型model_error-模型错误/api_error-API错误/timeout-超时/rate_limit-限流/other-其他 -- error_type VARCHAR(50) NOT NULL, -- 错误类型model_error-模型错误/api_error-API错误/timeout-超时/rate_limit-限流/other-其他
error_code VARCHAR(50), -- 错误代码 -- error_code VARCHAR(50), -- 错误代码
error_message TEXT NOT NULL, -- 错误信息 -- error_message TEXT NOT NULL, -- 错误信息
stack_trace TEXT, -- 堆栈跟踪 -- stack_trace TEXT, -- 堆栈跟踪
request_context JSONB, -- 请求上下文 -- request_context JSONB, -- 请求上下文
severity VARCHAR(20) DEFAULT 'error', -- 严重级别critical-致命/error-错误/warning-警告 -- severity VARCHAR(20) DEFAULT 'error', -- 严重级别critical-致命/error-错误/warning-警告
is_resolved BOOLEAN DEFAULT false, -- 是否已解决 -- is_resolved BOOLEAN DEFAULT false, -- 是否已解决
resolution_notes TEXT, -- 解决方案备注 -- resolution_notes TEXT, -- 解决方案备注
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 -- dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 -- create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
resolve_time TIMESTAMPTZ, -- 解决时间 -- resolve_time TIMESTAMPTZ, -- 解决时间
PRIMARY KEY (log_id), -- PRIMARY KEY (log_id),
UNIQUE (optsn), -- UNIQUE (optsn),
FOREIGN KEY (agent_id) REFERENCES agent.tb_agent(agent_id) -- 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_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_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; -- DROP TABLE IF EXISTS agent.tb_agent_rating CASCADE;
CREATE TABLE agent.tb_agent_rating ( -- CREATE TABLE agent.tb_agent_rating (
optsn VARCHAR(50) NOT NULL, -- 流水号 -- optsn VARCHAR(50) NOT NULL, -- 流水号
rating_id VARCHAR(50) NOT NULL, -- 评价ID -- rating_id VARCHAR(50) NOT NULL, -- 评价ID
agent_id VARCHAR(50) NOT NULL, -- 智能体ID -- agent_id VARCHAR(50) NOT NULL, -- 智能体ID
session_id VARCHAR(50), -- 会话ID -- session_id VARCHAR(50), -- 会话ID
user_id VARCHAR(50) NOT NULL, -- 用户ID -- user_id VARCHAR(50) NOT NULL, -- 用户ID
rating INTEGER NOT NULL, -- 评分1-5星 -- rating INTEGER NOT NULL, -- 评分1-5星
dimensions JSONB, -- 分维度评分(准确性、速度、友好度等) -- dimensions JSONB, -- 分维度评分(准确性、速度、友好度等)
feedback TEXT, -- 评价反馈 -- feedback TEXT, -- 评价反馈
tags TEXT[], -- 标签 -- tags TEXT[], -- 标签
is_anonymous BOOLEAN DEFAULT false, -- 是否匿名 -- is_anonymous BOOLEAN DEFAULT false, -- 是否匿名
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 -- dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 -- create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 -- deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除
PRIMARY KEY (rating_id), -- PRIMARY KEY (rating_id),
UNIQUE (optsn), -- UNIQUE (optsn),
FOREIGN KEY (agent_id) REFERENCES agent.tb_agent(agent_id) -- 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 '智能体评价表';

View File

@@ -55,59 +55,6 @@ CREATE EXTENSION IF NOT EXISTS "btree_gin"; -- GIN索引支持
-- ============================= -- =============================
\i createTableAgent.sql \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();
-- ============================= -- =============================
-- 创建视图 -- 创建视图
-- ============================= -- =============================

View File

@@ -207,7 +207,7 @@ DROP TABLE IF EXISTS customer_service.tb_faq CASCADE;
CREATE TABLE customer_service.tb_faq ( CREATE TABLE customer_service.tb_faq (
optsn VARCHAR(50) NOT NULL, -- 流水号 optsn VARCHAR(50) NOT NULL, -- 流水号
faq_id VARCHAR(50) NOT NULL, -- FAQ ID faq_id VARCHAR(50) NOT NULL, -- FAQ ID
kb_id VARCHAR(50), -- 关联知识库ID knowledge_id VARCHAR(50), -- 关联知识库ID
category VARCHAR(100) NOT NULL, -- 分类 category VARCHAR(100) NOT NULL, -- 分类
question TEXT NOT NULL, -- 问题 question TEXT NOT NULL, -- 问题
answer TEXT NOT NULL, -- 答案 answer TEXT NOT NULL, -- 答案

View File

@@ -12,6 +12,7 @@ CREATE TABLE file.tb_sys_file (
mime_type VARCHAR(255) NOT NULL, -- 文件MIME类型 mime_type VARCHAR(255) NOT NULL, -- 文件MIME类型
url VARCHAR(255) NOT NULL, -- 文件URL url VARCHAR(255) NOT NULL, -- 文件URL
status VARCHAR(50) NOT NULL, -- 文件状态 status VARCHAR(50) NOT NULL, -- 文件状态
service_type VARCHAR(50), -- 服务类型bidding/customer_service/internal等
dept_path VARCHAR(255) NOT NULL, -- 当前部门路径 dept_path VARCHAR(255) NOT NULL, -- 当前部门路径
creator VARCHAR(50) DEFAULT NULL, -- 创建者 creator VARCHAR(50) DEFAULT NULL, -- 创建者
updater VARCHAR(50) DEFAULT NULL, -- 更新者 updater VARCHAR(50) DEFAULT NULL, -- 更新者
@@ -22,7 +23,10 @@ CREATE TABLE file.tb_sys_file (
PRIMARY KEY (file_id), PRIMARY KEY (file_id),
UNIQUE (optsn) 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 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.optsn IS '流水号';
COMMENT ON COLUMN file.tb_sys_file.file_id IS '文件ID'; COMMENT ON COLUMN file.tb_sys_file.file_id IS '文件ID';
COMMENT ON COLUMN file.tb_sys_file.name IS '文件名'; 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.create_time IS '创建时间';
COMMENT ON COLUMN file.tb_sys_file.update_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.delete_time IS '删除时间';
COMMENT ON COLUMN file.tb_sys_file.deleted IS '是否删除'; 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;

View File

@@ -8,7 +8,8 @@ CREATE SCHEMA IF NOT EXISTS knowledge;
DROP TABLE IF EXISTS knowledge.tb_knowledge_base CASCADE; DROP TABLE IF EXISTS knowledge.tb_knowledge_base CASCADE;
CREATE TABLE knowledge.tb_knowledge_base ( CREATE TABLE knowledge.tb_knowledge_base (
optsn VARCHAR(50) NOT NULL, -- 流水号 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, -- 知识库名称 name VARCHAR(255) NOT NULL, -- 知识库名称
kb_type VARCHAR(50) NOT NULL, -- 知识库类型bidding-招投标/customer_service-客服/internal-内部协同 kb_type VARCHAR(50) NOT NULL, -- 知识库类型bidding-招投标/customer_service-客服/internal-内部协同
access_level VARCHAR(20) NOT NULL DEFAULT 'private', -- 访问级别public-公开/private-私有/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), -- 存储路径 storage_path VARCHAR(500), -- 存储路径
version VARCHAR(20) DEFAULT '1.0', -- 当前版本号 version VARCHAR(20) DEFAULT '1.0', -- 当前版本号
config JSONB DEFAULT NULL, -- 知识库配置JSON格式索引配置、检索参数等 config JSONB DEFAULT NULL, -- 知识库配置JSON格式索引配置、检索参数等
service_type VARCHAR(50), -- 服务类型bidding/customer_service/internal冗余kb_type便于查询
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
status VARCHAR(20) NOT NULL DEFAULT 'active', -- 状态active-激活/inactive-停用/archived-归档 status VARCHAR(20) NOT NULL DEFAULT 'active', -- 状态active-激活/inactive-停用/archived-归档
creator VARCHAR(50) DEFAULT NULL, -- 创建者 creator VARCHAR(50) DEFAULT NULL, -- 创建者
@@ -24,15 +26,17 @@ CREATE TABLE knowledge.tb_knowledge_base (
update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间
delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间
deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除
PRIMARY KEY (kb_id), PRIMARY KEY (knowledge_id),
UNIQUE (optsn) UNIQUE (optsn)
); );
CREATE INDEX idx_kb_type ON knowledge.tb_knowledge_base(kb_type) WHERE deleted = false; 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; 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 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.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-内部'; 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 ( CREATE TABLE knowledge.tb_knowledge_document (
optsn VARCHAR(50) NOT NULL, -- 流水号 optsn VARCHAR(50) NOT NULL, -- 流水号
doc_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
title VARCHAR(500) NOT NULL, -- 文档标题 title VARCHAR(500) NOT NULL, -- 文档标题
doc_type VARCHAR(50) NOT NULL, -- 文档类型text-文本/pdf/word/excel/image/video doc_type VARCHAR(50) NOT NULL, -- 文档类型text-文本/pdf/word/excel/image/video
category VARCHAR(100), -- 文档分类(自动或手动分类) category VARCHAR(100), -- 文档分类(自动或手动分类)
@@ -50,8 +54,9 @@ CREATE TABLE knowledge.tb_knowledge_document (
file_path VARCHAR(500), -- 文件路径 file_path VARCHAR(500), -- 文件路径
file_size BIGINT, -- 文件大小(字节) file_size BIGINT, -- 文件大小(字节)
mime_type VARCHAR(100), -- MIME类型 mime_type VARCHAR(100), -- MIME类型
version VARCHAR(20) DEFAULT '1.0', -- 文档版本号 version INTEGER DEFAULT 1, -- 版本号(自动递增)
parent_doc_id VARCHAR(50), -- 文档ID用于版本管理 root_doc_id VARCHAR(50), -- 文档ID版本组标识
is_current BOOLEAN DEFAULT true, -- 是否当前使用的版本
tags TEXT[], -- 文档标签数组 tags TEXT[], -- 文档标签数组
keywords TEXT[], -- 关键词数组AI提取 keywords TEXT[], -- 关键词数组AI提取
embedding_status VARCHAR(20) DEFAULT 'pending', -- 向量化状态pending-待处理/processing-处理中/completed-完成/failed-失败 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, -- 切片数量 chunk_count INTEGER DEFAULT 0, -- 切片数量
metadata JSONB DEFAULT NULL, -- 文档元数据JSON格式 metadata JSONB DEFAULT NULL, -- 文档元数据JSON格式
source_url VARCHAR(500), -- 来源URL source_url VARCHAR(500), -- 来源URL
service_type VARCHAR(50), -- 服务类型(继承自知识库)
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
status VARCHAR(20) NOT NULL DEFAULT 'active', -- 状态active-激活/inactive-停用/archived-归档 status VARCHAR(20) NOT NULL DEFAULT 'active', -- 状态active-激活/inactive-停用/archived-归档
creator VARCHAR(50) DEFAULT NULL, -- 创建者 creator VARCHAR(50) DEFAULT NULL, -- 创建者
@@ -69,15 +75,21 @@ CREATE TABLE knowledge.tb_knowledge_document (
deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除
PRIMARY KEY (doc_id), PRIMARY KEY (doc_id),
UNIQUE (optsn), 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_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_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_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 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'; COMMENT ON COLUMN knowledge.tb_knowledge_document.embedding_status IS '向量化状态pending/processing/completed/failed';
-- 知识文档片段表用于RAG检索 -- 知识文档片段表用于RAG检索
@@ -86,12 +98,13 @@ CREATE TABLE knowledge.tb_knowledge_chunk (
optsn VARCHAR(50) NOT NULL, -- 流水号 optsn VARCHAR(50) NOT NULL, -- 流水号
chunk_id VARCHAR(50) NOT NULL, -- 片段ID chunk_id VARCHAR(50) NOT NULL, -- 片段ID
doc_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, -- 片段索引(在文档中的顺序) chunk_index INTEGER NOT NULL, -- 片段索引(在文档中的顺序)
content TEXT NOT NULL, -- 片段内容 content TEXT NOT NULL, -- 片段内容
content_length INTEGER, -- 内容长度 content_length INTEGER, -- 内容长度
embedding vector(1536), -- 向量嵌入假设使用OpenAI 1536维 embedding vector(1536), -- 向量嵌入假设使用OpenAI 1536维
chunk_type VARCHAR(20) DEFAULT 'text', -- 片段类型text-文本/table-表格/image-图片 chunk_type VARCHAR(20) DEFAULT 'text', -- 片段类型text-文本/table-表格/image-图片
version INTEGER DEFAULT 1, -- 分段版本号(用于乐观锁,每次编辑+1
position_info JSONB, -- 位置信息(页码、坐标等) position_info JSONB, -- 位置信息(页码、坐标等)
metadata JSONB, -- 片段元数据 metadata JSONB, -- 片段元数据
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
@@ -102,15 +115,16 @@ CREATE TABLE knowledge.tb_knowledge_chunk (
PRIMARY KEY (chunk_id), PRIMARY KEY (chunk_id),
UNIQUE (optsn), UNIQUE (optsn),
FOREIGN KEY (doc_id) REFERENCES knowledge.tb_knowledge_document(doc_id), 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_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扩展 -- 向量检索索引需要安装pgvector扩展
-- CREATE INDEX idx_chunk_embedding ON knowledge.tb_knowledge_chunk USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100); -- 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 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扩展'; 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 ( CREATE TABLE knowledge.tb_knowledge_access_log (
optsn VARCHAR(50) NOT NULL, -- 流水号 optsn VARCHAR(50) NOT NULL, -- 流水号
log_id VARCHAR(50) NOT NULL, -- 日志ID log_id VARCHAR(50) NOT NULL, -- 日志ID
kb_id VARCHAR(50), -- 知识库ID knowledge_id VARCHAR(50), -- 知识库ID
doc_id VARCHAR(50), -- 文档ID doc_id VARCHAR(50), -- 文档ID
user_id VARCHAR(50) NOT NULL, -- 用户ID user_id VARCHAR(50) NOT NULL, -- 用户ID
access_type VARCHAR(20) NOT NULL, -- 访问类型view-查看/download-下载/search-搜索/edit-编辑 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_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 '知识访问日志表'; COMMENT ON TABLE knowledge.tb_knowledge_access_log IS '知识访问日志表';

View File

@@ -13,6 +13,7 @@ CREATE TABLE log.tb_sys_log (
message VARCHAR(255) NOT NULL, -- 日志消息 message VARCHAR(255) NOT NULL, -- 日志消息
data JSONB DEFAULT NULL, -- 日志数据 data JSONB DEFAULT NULL, -- 日志数据
creator VARCHAR(50) DEFAULT NULL, -- 创建者 creator VARCHAR(50) DEFAULT NULL, -- 创建者
service_type VARCHAR(50) NOT NULL, -- 服务类型
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
updater VARCHAR(50) DEFAULT NULL, -- 更新者 updater VARCHAR(50) DEFAULT NULL, -- 更新者
create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 日志创建时间 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.message IS '日志消息';
COMMENT ON COLUMN log.tb_sys_log.data 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.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.dept_path IS '部门全路径';
COMMENT ON COLUMN log.tb_sys_log.updater IS '更新者'; COMMENT ON COLUMN log.tb_sys_log.updater IS '更新者';
COMMENT ON COLUMN log.tb_sys_log.create_time IS '日志创建时间'; COMMENT ON COLUMN log.tb_sys_log.create_time IS '日志创建时间';

View File

@@ -8,6 +8,7 @@ CREATE TABLE message.tb_message (
content VARCHAR(255) NOT NULL, -- 消息内容 content VARCHAR(255) NOT NULL, -- 消息内容
type VARCHAR(50) NOT NULL, -- 消息类型 type VARCHAR(50) NOT NULL, -- 消息类型
status VARCHAR(50) NOT NULL, -- 消息状态 status VARCHAR(50) NOT NULL, -- 消息状态
service_type VARCHAR(50) NOT NULL, -- 服务类型
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径(隔离) dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径(隔离)
creator VARCHAR(50) NOT NULL DEFAULT 'system',-- 创建者 creator VARCHAR(50) NOT NULL DEFAULT 'system',-- 创建者
updater VARCHAR(50) DEFAULT NULL, -- 更新者 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.content IS '消息内容';
COMMENT ON COLUMN message.tb_message.type IS '消息类型'; COMMENT ON COLUMN message.tb_message.type IS '消息类型';
COMMENT ON COLUMN message.tb_message.status 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.dept_path IS '部门全路径';
COMMENT ON COLUMN message.tb_message.creator IS '创建者'; COMMENT ON COLUMN message.tb_message.creator IS '创建者';
COMMENT ON COLUMN message.tb_message.updater 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.update_time IS '更新时间';
COMMENT ON COLUMN message.tb_message_channel.delete_time IS '删除时间'; COMMENT ON COLUMN message.tb_message_channel.delete_time IS '删除时间';
COMMENT ON COLUMN message.tb_message_channel.deleted 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;

View File

@@ -124,6 +124,7 @@ CREATE TABLE sys.tb_sys_user_role (
optsn VARCHAR(50) NOT NULL, -- 流水号 optsn VARCHAR(50) NOT NULL, -- 流水号
user_id VARCHAR(50) NOT NULL, -- 用户ID user_id VARCHAR(50) NOT NULL, -- 用户ID
role_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, -- 部门全路径 dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
creator VARCHAR(50) DEFAULT NULL, -- 创建者 creator VARCHAR(50) DEFAULT NULL, -- 创建者
updater 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.optsn IS '流水号';
COMMENT ON COLUMN sys.tb_sys_user_role.user_id IS '用户ID'; 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.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.dept_path IS '部门全路径';
COMMENT ON COLUMN sys.tb_sys_user_role.creator IS '创建者'; COMMENT ON COLUMN sys.tb_sys_user_role.creator IS '创建者';
COMMENT ON COLUMN sys.tb_sys_user_role.updater IS '更新者'; COMMENT ON COLUMN sys.tb_sys_user_role.updater IS '更新者';

View File

@@ -54,11 +54,11 @@ CREATE TABLE sys.tb_sys_user_info (
user_id VARCHAR(50) NOT NULL, -- 用户ID user_id VARCHAR(50) NOT NULL, -- 用户ID
avatar VARCHAR(255), -- 头像 avatar VARCHAR(255), -- 头像
gender INTEGER DEFAULT 0, -- 性别 gender INTEGER DEFAULT 0, -- 性别
username VARCHAR(100) NOT NULL -- 用户名 username VARCHAR(100) NOT NULL, -- 用户名
level INTEGER DEFAULT 1, -- 等级 level INTEGER DEFAULT 1, -- 等级
id_card VARCHAR(50), -- 身份证号 id_card VARCHAR(50), -- 身份证号
address VARCHAR(255), -- 地址 address VARCHAR(255), -- 地址
remark VARCHAR(500) DEFAULT NULL -- 备注 remark VARCHAR(500) DEFAULT NULL, -- 备注
create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间(触发器维护) update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间(触发器维护)
delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间

View File

@@ -1,11 +1,55 @@
-- 按顺序执行初始化 -- =============================
\i createDB.sql -- 创建数据库和基础扩展 -- 城市生命线AI数智化平台 - 数据库初始化脚本
\i createTableUser.sql -- 用户表相关(核心表) -- 按顺序执行各模块建表SQL及数据初始化
\i createTablePermission.sql -- 权限相关(核心表) -- =============================
\i createTableFile.sql -- 文件管理
\i createTableMessage.sql -- 消息管理
\i createTableConfig.sql -- 配置管理
\i createTableLog.sql -- 日志管理
-- 初始化基础数据(如果有) -- =============================
-- \i initBaseData.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
-- =============================
-- 第二阶段:初始化基础数据
-- =============================
-- 1. 初始化权限相关基础数据(部门、角色、权限、视图、模块)
\i initDataPermission.sql
-- 2. 初始化用户数据(管理员账户)
\i initDataUser.sql
-- 3. 初始化消息渠道配置
\i initDataMessage.sql
-- 4. 初始化系统配置
\i initDataConfig.sql
-- 注意:文件、日志、知识库、招投标、客服等业务表无需初始化数据

View File

@@ -2,42 +2,43 @@
-- 仅插入常用示例,可按需调整 value/remark -- 仅插入常用示例,可按需调整 value/remark
INSERT INTO config.tb_sys_config ( 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 creator, dept_path, updater, create_time, update_time, delete_time, deleted
) VALUES ) VALUES
-- 站点与品牌 -- 站点与品牌
('CFG-0001', 'cfg_site_name', 'site.name', 'urban-lifeline 平台', 'string', '站点名称', 'site', 10, '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', '/static/logo.png', 'string', '站点Logo地址', 'site', 20, 'enabled', '相对或绝对URL', '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', '', 'string', 'ICP备案号', 'site', 30, 'enabled', '页脚展示', '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-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', '系统默认时区', 'i18n', 20, 'enabled', 'IANA时区名', '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-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','86400', 'number', 'JWT过期秒数', 'security', 20, 'enabled', '默认24小时', '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', 'number', '会话超时(分钟)', 'security', 30, 'enabled', '空闲登出', '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', 'bool', '是否开放注册', 'security', 40, 'enabled', '生产建议关闭', '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-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', '存储后端(local/minio/s3)', 'storage', 20, 'enabled', '本地/MinIO/S3等', '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', '本地存储基路径', 'storage', 30, 'enabled', '当 backend=local', '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 -- 通知(邮件/SMS
('CFG-0401', 'cfg_mail_host', 'mail.smtp.host', '', 'string', 'SMTP主机', 'notify', 10, 'disabled','留空为未配置', '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', '465', 'number', 'SMTP端口', 'notify', 20, 'disabled','SSL常用465', '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', '发件人邮箱', 'notify', 30, 'disabled','如 no-reply@x.com', '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', '短信服务商', 'notify', 40, 'disabled','如 aliyun/tencent', '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-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', 'number', '审计日志保留天数', 'log', 20, 'enabled', '合规按需调整', '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-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', 'enabled', 'string', 'ACL策略开关', 'platform', 20, 'enabled', 'enabled/disabled', '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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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 $$;