sql更新
This commit is contained in:
225
urbanLifelineServ/.bin/database/postgres/sql/README_INIT.md
Normal file
225
urbanLifelineServ/.bin/database/postgres/sql/README_INIT.md
Normal 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: 不需要,这些表的数据在系统运行时动态产生
|
||||
|
||||
## 联系支持
|
||||
|
||||
如有问题,请联系技术支持团队。
|
||||
@@ -1,308 +1,306 @@
|
||||
-- =============================
|
||||
-- 智能体管理和平台基础设施模块
|
||||
-- 支持:智能体广场、API集成管理、智能体运维监控
|
||||
-- =============================
|
||||
CREATE SCHEMA IF NOT EXISTS agent;
|
||||
-- -- =============================
|
||||
-- -- 智能体管理和平台基础设施模块
|
||||
-- -- 支持:智能体广场、API集成管理、智能体运维监控
|
||||
-- -- =============================
|
||||
-- CREATE SCHEMA IF NOT EXISTS agent;
|
||||
|
||||
-- 智能体定义表
|
||||
DROP TABLE IF EXISTS agent.tb_agent CASCADE;
|
||||
CREATE TABLE agent.tb_agent (
|
||||
optsn VARCHAR(50) NOT NULL, -- 流水号
|
||||
agent_id VARCHAR(50) NOT NULL, -- 智能体ID
|
||||
agent_code VARCHAR(100) NOT NULL, -- 智能体编码(唯一标识)
|
||||
agent_name VARCHAR(255) NOT NULL, -- 智能体名称
|
||||
agent_type VARCHAR(50) NOT NULL, -- 智能体类型:bidding-招投标/customer_service-客服/knowledge_assistant-知识助手/custom-自定义
|
||||
display_name VARCHAR(255) NOT NULL, -- 展示名称
|
||||
description TEXT, -- 智能体描述
|
||||
icon VARCHAR(500), -- 图标URL
|
||||
banner VARCHAR(500), -- Banner图URL
|
||||
version VARCHAR(20) DEFAULT '1.0.0', -- 版本号
|
||||
model_provider VARCHAR(50), -- 模型提供商:openai/anthropic/baidu/aliyun/custom
|
||||
model_name VARCHAR(100), -- 模型名称
|
||||
model_config JSONB, -- 模型配置(温度、最大tokens等)
|
||||
prompt_template TEXT, -- 提示词模板
|
||||
system_prompt TEXT, -- 系统提示词
|
||||
kb_ids VARCHAR(50)[], -- 关联知识库ID数组
|
||||
tool_ids VARCHAR(50)[], -- 关联工具ID数组
|
||||
capabilities TEXT[], -- 能力列表
|
||||
access_level VARCHAR(20) DEFAULT 'private', -- 访问级别:public-公开/private-私有/internal-内部
|
||||
is_published BOOLEAN DEFAULT false, -- 是否发布到智能体广场
|
||||
usage_count INTEGER DEFAULT 0, -- 使用次数
|
||||
rating DECIMAL(3,2) DEFAULT 0, -- 评分(0-5)
|
||||
rating_count INTEGER DEFAULT 0, -- 评分人数
|
||||
tags TEXT[], -- 标签数组
|
||||
category VARCHAR(100), -- 分类
|
||||
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
|
||||
owner_user_id VARCHAR(50), -- 所有者用户ID
|
||||
status VARCHAR(20) DEFAULT 'active', -- 状态:active-激活/inactive-停用/under_maintenance-维护中
|
||||
creator VARCHAR(50) DEFAULT NULL, -- 创建者
|
||||
updater VARCHAR(50) DEFAULT NULL, -- 更新者
|
||||
create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
|
||||
update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间
|
||||
delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间
|
||||
deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除
|
||||
PRIMARY KEY (agent_id),
|
||||
UNIQUE (optsn),
|
||||
UNIQUE (agent_code)
|
||||
);
|
||||
-- -- 智能体定义表
|
||||
-- DROP TABLE IF EXISTS agent.tb_agent CASCADE;
|
||||
-- CREATE TABLE agent.tb_agent (
|
||||
-- optsn VARCHAR(50) NOT NULL, -- 流水号
|
||||
-- agent_id VARCHAR(50) NOT NULL, -- 智能体ID
|
||||
-- agent_code VARCHAR(100) NOT NULL, -- 智能体编码(唯一标识)
|
||||
-- agent_name VARCHAR(255) NOT NULL, -- 智能体名称
|
||||
-- agent_type VARCHAR(50) NOT NULL, -- 智能体类型:bidding-招投标/customer_service-客服/knowledge_assistant-知识助手/custom-自定义
|
||||
-- display_name VARCHAR(255) NOT NULL, -- 展示名称
|
||||
-- description TEXT, -- 智能体描述
|
||||
-- icon VARCHAR(500), -- 图标URL
|
||||
-- banner VARCHAR(500), -- Banner图URL
|
||||
-- version VARCHAR(20) DEFAULT '1.0.0', -- 版本号
|
||||
-- model_provider VARCHAR(50), -- 模型提供商:openai/anthropic/baidu/aliyun/custom
|
||||
-- model_name VARCHAR(100), -- 模型名称
|
||||
-- model_config JSONB, -- 模型配置(温度、最大tokens等)
|
||||
-- prompt_template TEXT, -- 提示词模板
|
||||
-- system_prompt TEXT, -- 系统提示词
|
||||
-- capabilities TEXT[], -- 能力列表
|
||||
-- access_level VARCHAR(20) DEFAULT 'private', -- 访问级别:public-公开/private-私有/internal-内部
|
||||
-- is_published BOOLEAN DEFAULT false, -- 是否发布到智能体广场
|
||||
-- usage_count INTEGER DEFAULT 0, -- 使用次数
|
||||
-- rating DECIMAL(3,2) DEFAULT 0, -- 评分(0-5)
|
||||
-- rating_count INTEGER DEFAULT 0, -- 评分人数
|
||||
-- tags TEXT[], -- 标签数组
|
||||
-- category VARCHAR(100), -- 分类
|
||||
-- dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
|
||||
-- owner_user_id VARCHAR(50), -- 所有者用户ID
|
||||
-- status VARCHAR(20) DEFAULT 'active', -- 状态:active-激活/inactive-停用/under_maintenance-维护中
|
||||
-- creator VARCHAR(50) DEFAULT NULL, -- 创建者
|
||||
-- updater VARCHAR(50) DEFAULT NULL, -- 更新者
|
||||
-- create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
|
||||
-- update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间
|
||||
-- delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间
|
||||
-- deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除
|
||||
-- PRIMARY KEY (agent_id),
|
||||
-- UNIQUE (optsn),
|
||||
-- UNIQUE (agent_code)
|
||||
-- );
|
||||
|
||||
CREATE INDEX idx_agent_type ON agent.tb_agent(agent_type) WHERE deleted = false;
|
||||
CREATE INDEX idx_agent_published ON agent.tb_agent(is_published) WHERE deleted = false AND is_published = true;
|
||||
CREATE INDEX idx_agent_category ON agent.tb_agent(category) WHERE deleted = false;
|
||||
-- CREATE INDEX idx_agent_type ON agent.tb_agent(agent_type) WHERE deleted = false;
|
||||
-- CREATE INDEX idx_agent_published ON agent.tb_agent(is_published) WHERE deleted = false AND is_published = true;
|
||||
-- CREATE INDEX idx_agent_category ON agent.tb_agent(category) WHERE deleted = false;
|
||||
|
||||
COMMENT ON TABLE agent.tb_agent IS '智能体定义表';
|
||||
COMMENT ON COLUMN agent.tb_agent.agent_type IS '智能体类型:bidding/customer_service/knowledge_assistant/custom';
|
||||
-- COMMENT ON TABLE agent.tb_agent IS '智能体定义表';
|
||||
-- COMMENT ON COLUMN agent.tb_agent.agent_type IS '智能体类型:bidding/customer_service/knowledge_assistant/custom';
|
||||
|
||||
-- 智能体会话表
|
||||
DROP TABLE IF EXISTS agent.tb_agent_session CASCADE;
|
||||
CREATE TABLE agent.tb_agent_session (
|
||||
optsn VARCHAR(50) NOT NULL, -- 流水号
|
||||
session_id VARCHAR(50) NOT NULL, -- 会话ID
|
||||
agent_id VARCHAR(50) NOT NULL, -- 智能体ID
|
||||
user_id VARCHAR(50) NOT NULL, -- 用户ID
|
||||
session_type VARCHAR(30) DEFAULT 'chat', -- 会话类型:chat-对话/task-任务/workflow-工作流
|
||||
session_name VARCHAR(255), -- 会话名称
|
||||
context JSONB, -- 会话上下文
|
||||
session_status VARCHAR(20) DEFAULT 'active', -- 会话状态:active-活跃/paused-暂停/ended-结束
|
||||
start_time TIMESTAMPTZ DEFAULT now(), -- 开始时间
|
||||
end_time TIMESTAMPTZ, -- 结束时间
|
||||
message_count INTEGER DEFAULT 0, -- 消息数量
|
||||
token_usage INTEGER DEFAULT 0, -- Token使用量
|
||||
cost DECIMAL(10,4) DEFAULT 0, -- 成本
|
||||
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
|
||||
creator VARCHAR(50) DEFAULT NULL, -- 创建者
|
||||
create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
|
||||
update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间
|
||||
deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除
|
||||
PRIMARY KEY (session_id),
|
||||
UNIQUE (optsn),
|
||||
FOREIGN KEY (agent_id) REFERENCES agent.tb_agent(agent_id)
|
||||
);
|
||||
-- -- 智能体会话表
|
||||
-- DROP TABLE IF EXISTS agent.tb_agent_session CASCADE;
|
||||
-- CREATE TABLE agent.tb_agent_session (
|
||||
-- optsn VARCHAR(50) NOT NULL, -- 流水号
|
||||
-- session_id VARCHAR(50) NOT NULL, -- 会话ID
|
||||
-- agent_id VARCHAR(50) NOT NULL, -- 智能体ID
|
||||
-- user_id VARCHAR(50) NOT NULL, -- 用户ID
|
||||
-- session_type VARCHAR(30) DEFAULT 'chat', -- 会话类型:chat-对话/task-任务/workflow-工作流
|
||||
-- session_name VARCHAR(255), -- 会话名称
|
||||
-- context JSONB, -- 会话上下文
|
||||
-- session_status VARCHAR(20) DEFAULT 'active', -- 会话状态:active-活跃/paused-暂停/ended-结束
|
||||
-- start_time TIMESTAMPTZ DEFAULT now(), -- 开始时间
|
||||
-- end_time TIMESTAMPTZ, -- 结束时间
|
||||
-- message_count INTEGER DEFAULT 0, -- 消息数量
|
||||
-- token_usage INTEGER DEFAULT 0, -- Token使用量
|
||||
-- cost DECIMAL(10,4) DEFAULT 0, -- 成本
|
||||
-- dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
|
||||
-- creator VARCHAR(50) DEFAULT NULL, -- 创建者
|
||||
-- create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
|
||||
-- update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间
|
||||
-- deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除
|
||||
-- PRIMARY KEY (session_id),
|
||||
-- UNIQUE (optsn),
|
||||
-- FOREIGN KEY (agent_id) REFERENCES agent.tb_agent(agent_id)
|
||||
-- );
|
||||
|
||||
CREATE INDEX idx_session_agent ON agent.tb_agent_session(agent_id) WHERE deleted = false;
|
||||
CREATE INDEX idx_session_user ON agent.tb_agent_session(user_id) WHERE deleted = false;
|
||||
-- CREATE INDEX idx_session_agent ON agent.tb_agent_session(agent_id) WHERE deleted = false;
|
||||
-- CREATE INDEX idx_session_user ON agent.tb_agent_session(user_id) WHERE deleted = false;
|
||||
|
||||
COMMENT ON TABLE agent.tb_agent_session IS '智能体会话表';
|
||||
-- COMMENT ON TABLE agent.tb_agent_session IS '智能体会话表';
|
||||
|
||||
-- 智能体消息表
|
||||
DROP TABLE IF EXISTS agent.tb_agent_message CASCADE;
|
||||
CREATE TABLE agent.tb_agent_message (
|
||||
optsn VARCHAR(50) NOT NULL, -- 流水号
|
||||
message_id VARCHAR(50) NOT NULL, -- 消息ID
|
||||
session_id VARCHAR(50) NOT NULL, -- 会话ID
|
||||
agent_id VARCHAR(50) NOT NULL, -- 智能体ID
|
||||
role VARCHAR(20) NOT NULL, -- 角色:user-用户/assistant-助手/system-系统/function-函数
|
||||
content TEXT, -- 消息内容
|
||||
content_type VARCHAR(30) DEFAULT 'text', -- 内容类型:text-文本/image-图片/file-文件/structured-结构化数据
|
||||
function_call JSONB, -- 函数调用(JSON格式)
|
||||
function_response JSONB, -- 函数响应
|
||||
token_count INTEGER, -- Token数量
|
||||
model_name VARCHAR(100), -- 使用的模型
|
||||
kb_references JSONB, -- 知识库引用(JSON数组)
|
||||
metadata JSONB, -- 消息元数据
|
||||
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
|
||||
create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
|
||||
deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除
|
||||
PRIMARY KEY (message_id),
|
||||
UNIQUE (optsn),
|
||||
FOREIGN KEY (session_id) REFERENCES agent.tb_agent_session(session_id),
|
||||
FOREIGN KEY (agent_id) REFERENCES agent.tb_agent(agent_id)
|
||||
);
|
||||
-- -- 智能体消息表
|
||||
-- DROP TABLE IF EXISTS agent.tb_agent_message CASCADE;
|
||||
-- CREATE TABLE agent.tb_agent_message (
|
||||
-- optsn VARCHAR(50) NOT NULL, -- 流水号
|
||||
-- message_id VARCHAR(50) NOT NULL, -- 消息ID
|
||||
-- session_id VARCHAR(50) NOT NULL, -- 会话ID
|
||||
-- agent_id VARCHAR(50) NOT NULL, -- 智能体ID
|
||||
-- role VARCHAR(20) NOT NULL, -- 角色:user-用户/assistant-助手/system-系统/function-函数
|
||||
-- content TEXT, -- 消息内容
|
||||
-- content_type VARCHAR(30) DEFAULT 'text', -- 内容类型:text-文本/image-图片/file-文件/structured-结构化数据
|
||||
-- function_call JSONB, -- 函数调用(JSON格式)
|
||||
-- function_response JSONB, -- 函数响应
|
||||
-- token_count INTEGER, -- Token数量
|
||||
-- model_name VARCHAR(100), -- 使用的模型
|
||||
-- kb_references JSONB, -- 知识库引用(JSON数组)
|
||||
-- metadata JSONB, -- 消息元数据
|
||||
-- dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
|
||||
-- create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
|
||||
-- deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除
|
||||
-- PRIMARY KEY (message_id),
|
||||
-- UNIQUE (optsn),
|
||||
-- FOREIGN KEY (session_id) REFERENCES agent.tb_agent_session(session_id),
|
||||
-- FOREIGN KEY (agent_id) REFERENCES agent.tb_agent(agent_id)
|
||||
-- );
|
||||
|
||||
CREATE INDEX idx_msg_session ON agent.tb_agent_message(session_id, create_time) WHERE deleted = false;
|
||||
CREATE INDEX idx_msg_agent ON agent.tb_agent_message(agent_id) WHERE deleted = false;
|
||||
-- CREATE INDEX idx_msg_session ON agent.tb_agent_message(session_id, create_time) WHERE deleted = false;
|
||||
-- CREATE INDEX idx_msg_agent ON agent.tb_agent_message(agent_id) WHERE deleted = false;
|
||||
|
||||
COMMENT ON TABLE agent.tb_agent_message IS '智能体消息表';
|
||||
-- COMMENT ON TABLE agent.tb_agent_message IS '智能体消息表';
|
||||
|
||||
-- 智能体工具表
|
||||
DROP TABLE IF EXISTS agent.tb_agent_tool CASCADE;
|
||||
CREATE TABLE agent.tb_agent_tool (
|
||||
optsn VARCHAR(50) NOT NULL, -- 流水号
|
||||
tool_id VARCHAR(50) NOT NULL, -- 工具ID
|
||||
tool_code VARCHAR(100) NOT NULL, -- 工具编码
|
||||
tool_name VARCHAR(255) NOT NULL, -- 工具名称
|
||||
tool_type VARCHAR(50) NOT NULL, -- 工具类型:api-API调用/function-函数/plugin-插件/integration-集成
|
||||
description TEXT, -- 工具描述
|
||||
function_schema JSONB, -- 函数Schema(OpenAI function calling格式)
|
||||
api_endpoint VARCHAR(500), -- API端点
|
||||
api_method VARCHAR(10), -- API方法:GET/POST/PUT/DELETE
|
||||
api_headers JSONB, -- API请求头
|
||||
auth_type VARCHAR(30), -- 认证类型:none/api_key/oauth2/bearer
|
||||
auth_config JSONB, -- 认证配置(加密存储)
|
||||
request_template TEXT, -- 请求模板
|
||||
response_template TEXT, -- 响应模板
|
||||
timeout_seconds INTEGER DEFAULT 30, -- 超时时间(秒)
|
||||
retry_count INTEGER DEFAULT 3, -- 重试次数
|
||||
is_enabled BOOLEAN DEFAULT true, -- 是否启用
|
||||
usage_count INTEGER DEFAULT 0, -- 使用次数
|
||||
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
|
||||
creator VARCHAR(50) DEFAULT NULL, -- 创建者
|
||||
updater VARCHAR(50) DEFAULT NULL, -- 更新者
|
||||
create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
|
||||
update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间
|
||||
delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间
|
||||
deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除
|
||||
PRIMARY KEY (tool_id),
|
||||
UNIQUE (optsn),
|
||||
UNIQUE (tool_code)
|
||||
);
|
||||
-- -- 智能体工具表
|
||||
-- DROP TABLE IF EXISTS agent.tb_agent_tool CASCADE;
|
||||
-- CREATE TABLE agent.tb_agent_tool (
|
||||
-- optsn VARCHAR(50) NOT NULL, -- 流水号
|
||||
-- tool_id VARCHAR(50) NOT NULL, -- 工具ID
|
||||
-- tool_code VARCHAR(100) NOT NULL, -- 工具编码
|
||||
-- tool_name VARCHAR(255) NOT NULL, -- 工具名称
|
||||
-- tool_type VARCHAR(50) NOT NULL, -- 工具类型:api-API调用/function-函数/plugin-插件/integration-集成
|
||||
-- description TEXT, -- 工具描述
|
||||
-- function_schema JSONB, -- 函数Schema(OpenAI function calling格式)
|
||||
-- api_endpoint VARCHAR(500), -- API端点
|
||||
-- api_method VARCHAR(10), -- API方法:GET/POST/PUT/DELETE
|
||||
-- api_headers JSONB, -- API请求头
|
||||
-- auth_type VARCHAR(30), -- 认证类型:none/api_key/oauth2/bearer
|
||||
-- auth_config JSONB, -- 认证配置(加密存储)
|
||||
-- request_template TEXT, -- 请求模板
|
||||
-- response_template TEXT, -- 响应模板
|
||||
-- timeout_seconds INTEGER DEFAULT 30, -- 超时时间(秒)
|
||||
-- retry_count INTEGER DEFAULT 3, -- 重试次数
|
||||
-- is_enabled BOOLEAN DEFAULT true, -- 是否启用
|
||||
-- usage_count INTEGER DEFAULT 0, -- 使用次数
|
||||
-- dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
|
||||
-- creator VARCHAR(50) DEFAULT NULL, -- 创建者
|
||||
-- updater VARCHAR(50) DEFAULT NULL, -- 更新者
|
||||
-- create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
|
||||
-- update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间
|
||||
-- delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间
|
||||
-- deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除
|
||||
-- PRIMARY KEY (tool_id),
|
||||
-- UNIQUE (optsn),
|
||||
-- UNIQUE (tool_code)
|
||||
-- );
|
||||
|
||||
CREATE INDEX idx_tool_type ON agent.tb_agent_tool(tool_type) WHERE deleted = false;
|
||||
-- CREATE INDEX idx_tool_type ON agent.tb_agent_tool(tool_type) WHERE deleted = false;
|
||||
|
||||
COMMENT ON TABLE agent.tb_agent_tool IS '智能体工具表';
|
||||
-- COMMENT ON TABLE agent.tb_agent_tool IS '智能体工具表';
|
||||
|
||||
-- API集成注册表
|
||||
DROP TABLE IF EXISTS agent.tb_api_integration CASCADE;
|
||||
CREATE TABLE agent.tb_api_integration (
|
||||
optsn VARCHAR(50) NOT NULL, -- 流水号
|
||||
integration_id VARCHAR(50) NOT NULL, -- 集成ID
|
||||
integration_name VARCHAR(255) NOT NULL, -- 集成名称
|
||||
integration_type VARCHAR(50) NOT NULL, -- 集成类型:rest_api/soap/graphql/webhook/mq
|
||||
provider VARCHAR(100), -- 提供商
|
||||
base_url VARCHAR(500), -- 基础URL
|
||||
version VARCHAR(20), -- API版本
|
||||
auth_type VARCHAR(30) DEFAULT 'none', -- 认证类型
|
||||
auth_config JSONB, -- 认证配置(加密存储)
|
||||
endpoints JSONB, -- 端点列表(JSON数组)
|
||||
rate_limit INTEGER, -- 速率限制(请求/秒)
|
||||
timeout_seconds INTEGER DEFAULT 30, -- 超时时间
|
||||
retry_config JSONB, -- 重试配置
|
||||
health_check_url VARCHAR(500), -- 健康检查URL
|
||||
health_status VARCHAR(20) DEFAULT 'unknown', -- 健康状态:healthy-健康/unhealthy-不健康/unknown-未知
|
||||
last_health_check TIMESTAMPTZ, -- 最后健康检查时间
|
||||
documentation_url VARCHAR(500), -- 文档URL
|
||||
is_enabled BOOLEAN DEFAULT true, -- 是否启用
|
||||
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
|
||||
creator VARCHAR(50) DEFAULT NULL, -- 创建者
|
||||
updater VARCHAR(50) DEFAULT NULL, -- 更新者
|
||||
create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
|
||||
update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间
|
||||
delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间
|
||||
deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除
|
||||
PRIMARY KEY (integration_id),
|
||||
UNIQUE (optsn)
|
||||
);
|
||||
-- -- API集成注册表
|
||||
-- DROP TABLE IF EXISTS agent.tb_api_integration CASCADE;
|
||||
-- CREATE TABLE agent.tb_api_integration (
|
||||
-- optsn VARCHAR(50) NOT NULL, -- 流水号
|
||||
-- integration_id VARCHAR(50) NOT NULL, -- 集成ID
|
||||
-- integration_name VARCHAR(255) NOT NULL, -- 集成名称
|
||||
-- integration_type VARCHAR(50) NOT NULL, -- 集成类型:rest_api/soap/graphql/webhook/mq
|
||||
-- provider VARCHAR(100), -- 提供商
|
||||
-- base_url VARCHAR(500), -- 基础URL
|
||||
-- version VARCHAR(20), -- API版本
|
||||
-- auth_type VARCHAR(30) DEFAULT 'none', -- 认证类型
|
||||
-- auth_config JSONB, -- 认证配置(加密存储)
|
||||
-- endpoints JSONB, -- 端点列表(JSON数组)
|
||||
-- rate_limit INTEGER, -- 速率限制(请求/秒)
|
||||
-- timeout_seconds INTEGER DEFAULT 30, -- 超时时间
|
||||
-- retry_config JSONB, -- 重试配置
|
||||
-- health_check_url VARCHAR(500), -- 健康检查URL
|
||||
-- health_status VARCHAR(20) DEFAULT 'unknown', -- 健康状态:healthy-健康/unhealthy-不健康/unknown-未知
|
||||
-- last_health_check TIMESTAMPTZ, -- 最后健康检查时间
|
||||
-- documentation_url VARCHAR(500), -- 文档URL
|
||||
-- is_enabled BOOLEAN DEFAULT true, -- 是否启用
|
||||
-- dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
|
||||
-- creator VARCHAR(50) DEFAULT NULL, -- 创建者
|
||||
-- updater VARCHAR(50) DEFAULT NULL, -- 更新者
|
||||
-- create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
|
||||
-- update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间
|
||||
-- delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间
|
||||
-- deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除
|
||||
-- PRIMARY KEY (integration_id),
|
||||
-- UNIQUE (optsn)
|
||||
-- );
|
||||
|
||||
CREATE INDEX idx_integration_type ON agent.tb_api_integration(integration_type) WHERE deleted = false;
|
||||
CREATE INDEX idx_integration_health ON agent.tb_api_integration(health_status) WHERE deleted = false;
|
||||
-- CREATE INDEX idx_integration_type ON agent.tb_api_integration(integration_type) WHERE deleted = false;
|
||||
-- CREATE INDEX idx_integration_health ON agent.tb_api_integration(health_status) WHERE deleted = false;
|
||||
|
||||
COMMENT ON TABLE agent.tb_api_integration IS 'API集成注册表';
|
||||
-- COMMENT ON TABLE agent.tb_api_integration IS 'API集成注册表';
|
||||
|
||||
-- API调用日志表
|
||||
DROP TABLE IF EXISTS agent.tb_api_call_log CASCADE;
|
||||
CREATE TABLE agent.tb_api_call_log (
|
||||
optsn VARCHAR(50) NOT NULL, -- 流水号
|
||||
log_id VARCHAR(50) NOT NULL, -- 日志ID
|
||||
integration_id VARCHAR(50), -- 集成ID
|
||||
tool_id VARCHAR(50), -- 工具ID
|
||||
agent_id VARCHAR(50), -- 智能体ID
|
||||
session_id VARCHAR(50), -- 会话ID
|
||||
user_id VARCHAR(50), -- 用户ID
|
||||
endpoint VARCHAR(500) NOT NULL, -- 请求端点
|
||||
method VARCHAR(10) NOT NULL, -- 请求方法
|
||||
request_headers JSONB, -- 请求头
|
||||
request_body TEXT, -- 请求体
|
||||
response_status INTEGER, -- 响应状态码
|
||||
response_headers JSONB, -- 响应头
|
||||
response_body TEXT, -- 响应体
|
||||
duration_ms INTEGER, -- 请求耗时(毫秒)
|
||||
is_success BOOLEAN, -- 是否成功
|
||||
error_message TEXT, -- 错误信息
|
||||
retry_count INTEGER DEFAULT 0, -- 重试次数
|
||||
ip_address VARCHAR(45), -- IP地址
|
||||
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
|
||||
create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
|
||||
PRIMARY KEY (log_id),
|
||||
UNIQUE (optsn)
|
||||
);
|
||||
-- -- API调用日志表
|
||||
-- DROP TABLE IF EXISTS agent.tb_api_call_log CASCADE;
|
||||
-- CREATE TABLE agent.tb_api_call_log (
|
||||
-- optsn VARCHAR(50) NOT NULL, -- 流水号
|
||||
-- log_id VARCHAR(50) NOT NULL, -- 日志ID
|
||||
-- integration_id VARCHAR(50), -- 集成ID
|
||||
-- tool_id VARCHAR(50), -- 工具ID
|
||||
-- agent_id VARCHAR(50), -- 智能体ID
|
||||
-- session_id VARCHAR(50), -- 会话ID
|
||||
-- user_id VARCHAR(50), -- 用户ID
|
||||
-- endpoint VARCHAR(500) NOT NULL, -- 请求端点
|
||||
-- method VARCHAR(10) NOT NULL, -- 请求方法
|
||||
-- request_headers JSONB, -- 请求头
|
||||
-- request_body TEXT, -- 请求体
|
||||
-- response_status INTEGER, -- 响应状态码
|
||||
-- response_headers JSONB, -- 响应头
|
||||
-- response_body TEXT, -- 响应体
|
||||
-- duration_ms INTEGER, -- 请求耗时(毫秒)
|
||||
-- is_success BOOLEAN, -- 是否成功
|
||||
-- error_message TEXT, -- 错误信息
|
||||
-- retry_count INTEGER DEFAULT 0, -- 重试次数
|
||||
-- ip_address VARCHAR(45), -- IP地址
|
||||
-- dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
|
||||
-- create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
|
||||
-- PRIMARY KEY (log_id),
|
||||
-- UNIQUE (optsn)
|
||||
-- );
|
||||
|
||||
CREATE INDEX idx_api_log_integration ON agent.tb_api_call_log(integration_id, create_time DESC);
|
||||
CREATE INDEX idx_api_log_agent ON agent.tb_api_call_log(agent_id, create_time DESC);
|
||||
CREATE INDEX idx_api_log_status ON agent.tb_api_call_log(is_success, create_time DESC);
|
||||
-- CREATE INDEX idx_api_log_integration ON agent.tb_api_call_log(integration_id, create_time DESC);
|
||||
-- CREATE INDEX idx_api_log_agent ON agent.tb_api_call_log(agent_id, create_time DESC);
|
||||
-- CREATE INDEX idx_api_log_status ON agent.tb_api_call_log(is_success, create_time DESC);
|
||||
|
||||
COMMENT ON TABLE agent.tb_api_call_log IS 'API调用日志表';
|
||||
-- COMMENT ON TABLE agent.tb_api_call_log IS 'API调用日志表';
|
||||
|
||||
-- 智能体监控指标表
|
||||
DROP TABLE IF EXISTS agent.tb_agent_metrics CASCADE;
|
||||
CREATE TABLE agent.tb_agent_metrics (
|
||||
optsn VARCHAR(50) NOT NULL, -- 流水号
|
||||
metric_id VARCHAR(50) NOT NULL, -- 指标ID
|
||||
agent_id VARCHAR(50) NOT NULL, -- 智能体ID
|
||||
metric_date DATE NOT NULL, -- 指标日期
|
||||
metric_hour INTEGER, -- 指标小时(0-23)
|
||||
total_sessions INTEGER DEFAULT 0, -- 总会话数
|
||||
active_sessions INTEGER DEFAULT 0, -- 活跃会话数
|
||||
total_messages INTEGER DEFAULT 0, -- 总消息数
|
||||
total_tokens BIGINT DEFAULT 0, -- 总Token数
|
||||
total_cost DECIMAL(10,4) DEFAULT 0, -- 总成本
|
||||
avg_response_time INTEGER, -- 平均响应时间(毫秒)
|
||||
success_rate DECIMAL(5,4), -- 成功率
|
||||
error_count INTEGER DEFAULT 0, -- 错误次数
|
||||
api_call_count INTEGER DEFAULT 0, -- API调用次数
|
||||
avg_rating DECIMAL(3,2), -- 平均评分
|
||||
rating_count INTEGER DEFAULT 0, -- 评分数量
|
||||
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
|
||||
create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
|
||||
update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间
|
||||
PRIMARY KEY (metric_id),
|
||||
UNIQUE (optsn),
|
||||
UNIQUE (agent_id, metric_date, metric_hour),
|
||||
FOREIGN KEY (agent_id) REFERENCES agent.tb_agent(agent_id)
|
||||
);
|
||||
-- -- 智能体监控指标表
|
||||
-- DROP TABLE IF EXISTS agent.tb_agent_metrics CASCADE;
|
||||
-- CREATE TABLE agent.tb_agent_metrics (
|
||||
-- optsn VARCHAR(50) NOT NULL, -- 流水号
|
||||
-- metric_id VARCHAR(50) NOT NULL, -- 指标ID
|
||||
-- agent_id VARCHAR(50) NOT NULL, -- 智能体ID
|
||||
-- metric_date DATE NOT NULL, -- 指标日期
|
||||
-- metric_hour INTEGER, -- 指标小时(0-23)
|
||||
-- total_sessions INTEGER DEFAULT 0, -- 总会话数
|
||||
-- active_sessions INTEGER DEFAULT 0, -- 活跃会话数
|
||||
-- total_messages INTEGER DEFAULT 0, -- 总消息数
|
||||
-- total_tokens BIGINT DEFAULT 0, -- 总Token数
|
||||
-- total_cost DECIMAL(10,4) DEFAULT 0, -- 总成本
|
||||
-- avg_response_time INTEGER, -- 平均响应时间(毫秒)
|
||||
-- success_rate DECIMAL(5,4), -- 成功率
|
||||
-- error_count INTEGER DEFAULT 0, -- 错误次数
|
||||
-- api_call_count INTEGER DEFAULT 0, -- API调用次数
|
||||
-- avg_rating DECIMAL(3,2), -- 平均评分
|
||||
-- rating_count INTEGER DEFAULT 0, -- 评分数量
|
||||
-- dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
|
||||
-- create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
|
||||
-- update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间
|
||||
-- PRIMARY KEY (metric_id),
|
||||
-- UNIQUE (optsn),
|
||||
-- UNIQUE (agent_id, metric_date, metric_hour),
|
||||
-- FOREIGN KEY (agent_id) REFERENCES agent.tb_agent(agent_id)
|
||||
-- );
|
||||
|
||||
CREATE INDEX idx_metrics_agent_date ON agent.tb_agent_metrics(agent_id, metric_date DESC);
|
||||
-- CREATE INDEX idx_metrics_agent_date ON agent.tb_agent_metrics(agent_id, metric_date DESC);
|
||||
|
||||
COMMENT ON TABLE agent.tb_agent_metrics IS '智能体监控指标表';
|
||||
-- COMMENT ON TABLE agent.tb_agent_metrics IS '智能体监控指标表';
|
||||
|
||||
-- 智能体异常日志表
|
||||
DROP TABLE IF EXISTS agent.tb_agent_error_log CASCADE;
|
||||
CREATE TABLE agent.tb_agent_error_log (
|
||||
optsn VARCHAR(50) NOT NULL, -- 流水号
|
||||
log_id VARCHAR(50) NOT NULL, -- 日志ID
|
||||
agent_id VARCHAR(50) NOT NULL, -- 智能体ID
|
||||
session_id VARCHAR(50), -- 会话ID
|
||||
error_type VARCHAR(50) NOT NULL, -- 错误类型:model_error-模型错误/api_error-API错误/timeout-超时/rate_limit-限流/other-其他
|
||||
error_code VARCHAR(50), -- 错误代码
|
||||
error_message TEXT NOT NULL, -- 错误信息
|
||||
stack_trace TEXT, -- 堆栈跟踪
|
||||
request_context JSONB, -- 请求上下文
|
||||
severity VARCHAR(20) DEFAULT 'error', -- 严重级别:critical-致命/error-错误/warning-警告
|
||||
is_resolved BOOLEAN DEFAULT false, -- 是否已解决
|
||||
resolution_notes TEXT, -- 解决方案备注
|
||||
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
|
||||
create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
|
||||
resolve_time TIMESTAMPTZ, -- 解决时间
|
||||
PRIMARY KEY (log_id),
|
||||
UNIQUE (optsn),
|
||||
FOREIGN KEY (agent_id) REFERENCES agent.tb_agent(agent_id)
|
||||
);
|
||||
-- -- 智能体异常日志表
|
||||
-- DROP TABLE IF EXISTS agent.tb_agent_error_log CASCADE;
|
||||
-- CREATE TABLE agent.tb_agent_error_log (
|
||||
-- optsn VARCHAR(50) NOT NULL, -- 流水号
|
||||
-- log_id VARCHAR(50) NOT NULL, -- 日志ID
|
||||
-- agent_id VARCHAR(50) NOT NULL, -- 智能体ID
|
||||
-- session_id VARCHAR(50), -- 会话ID
|
||||
-- error_type VARCHAR(50) NOT NULL, -- 错误类型:model_error-模型错误/api_error-API错误/timeout-超时/rate_limit-限流/other-其他
|
||||
-- error_code VARCHAR(50), -- 错误代码
|
||||
-- error_message TEXT NOT NULL, -- 错误信息
|
||||
-- stack_trace TEXT, -- 堆栈跟踪
|
||||
-- request_context JSONB, -- 请求上下文
|
||||
-- severity VARCHAR(20) DEFAULT 'error', -- 严重级别:critical-致命/error-错误/warning-警告
|
||||
-- is_resolved BOOLEAN DEFAULT false, -- 是否已解决
|
||||
-- resolution_notes TEXT, -- 解决方案备注
|
||||
-- dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
|
||||
-- create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
|
||||
-- resolve_time TIMESTAMPTZ, -- 解决时间
|
||||
-- PRIMARY KEY (log_id),
|
||||
-- UNIQUE (optsn),
|
||||
-- FOREIGN KEY (agent_id) REFERENCES agent.tb_agent(agent_id)
|
||||
-- );
|
||||
|
||||
CREATE INDEX idx_error_agent ON agent.tb_agent_error_log(agent_id, create_time DESC);
|
||||
CREATE INDEX idx_error_severity ON agent.tb_agent_error_log(severity) WHERE is_resolved = false;
|
||||
-- CREATE INDEX idx_error_agent ON agent.tb_agent_error_log(agent_id, create_time DESC);
|
||||
-- CREATE INDEX idx_error_severity ON agent.tb_agent_error_log(severity) WHERE is_resolved = false;
|
||||
|
||||
COMMENT ON TABLE agent.tb_agent_error_log IS '智能体异常日志表';
|
||||
-- COMMENT ON TABLE agent.tb_agent_error_log IS '智能体异常日志表';
|
||||
|
||||
-- 智能体评价表
|
||||
DROP TABLE IF EXISTS agent.tb_agent_rating CASCADE;
|
||||
CREATE TABLE agent.tb_agent_rating (
|
||||
optsn VARCHAR(50) NOT NULL, -- 流水号
|
||||
rating_id VARCHAR(50) NOT NULL, -- 评价ID
|
||||
agent_id VARCHAR(50) NOT NULL, -- 智能体ID
|
||||
session_id VARCHAR(50), -- 会话ID
|
||||
user_id VARCHAR(50) NOT NULL, -- 用户ID
|
||||
rating INTEGER NOT NULL, -- 评分(1-5星)
|
||||
dimensions JSONB, -- 分维度评分(准确性、速度、友好度等)
|
||||
feedback TEXT, -- 评价反馈
|
||||
tags TEXT[], -- 标签
|
||||
is_anonymous BOOLEAN DEFAULT false, -- 是否匿名
|
||||
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
|
||||
create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
|
||||
deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除
|
||||
PRIMARY KEY (rating_id),
|
||||
UNIQUE (optsn),
|
||||
FOREIGN KEY (agent_id) REFERENCES agent.tb_agent(agent_id)
|
||||
);
|
||||
-- -- 智能体评价表
|
||||
-- DROP TABLE IF EXISTS agent.tb_agent_rating CASCADE;
|
||||
-- CREATE TABLE agent.tb_agent_rating (
|
||||
-- optsn VARCHAR(50) NOT NULL, -- 流水号
|
||||
-- rating_id VARCHAR(50) NOT NULL, -- 评价ID
|
||||
-- agent_id VARCHAR(50) NOT NULL, -- 智能体ID
|
||||
-- session_id VARCHAR(50), -- 会话ID
|
||||
-- user_id VARCHAR(50) NOT NULL, -- 用户ID
|
||||
-- rating INTEGER NOT NULL, -- 评分(1-5星)
|
||||
-- dimensions JSONB, -- 分维度评分(准确性、速度、友好度等)
|
||||
-- feedback TEXT, -- 评价反馈
|
||||
-- tags TEXT[], -- 标签
|
||||
-- is_anonymous BOOLEAN DEFAULT false, -- 是否匿名
|
||||
-- dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
|
||||
-- create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
|
||||
-- deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除
|
||||
-- PRIMARY KEY (rating_id),
|
||||
-- UNIQUE (optsn),
|
||||
-- FOREIGN KEY (agent_id) REFERENCES agent.tb_agent(agent_id)
|
||||
-- );
|
||||
|
||||
CREATE INDEX idx_rating_agent ON agent.tb_agent_rating(agent_id) WHERE deleted = false;
|
||||
-- CREATE INDEX idx_rating_agent ON agent.tb_agent_rating(agent_id) WHERE deleted = false;
|
||||
|
||||
COMMENT ON TABLE agent.tb_agent_rating IS '智能体评价表';
|
||||
-- COMMENT ON TABLE agent.tb_agent_rating IS '智能体评价表';
|
||||
|
||||
@@ -55,59 +55,6 @@ CREATE EXTENSION IF NOT EXISTS "btree_gin"; -- GIN索引支持
|
||||
-- =============================
|
||||
\i createTableAgent.sql
|
||||
|
||||
-- =============================
|
||||
-- 创建通用触发器函数
|
||||
-- =============================
|
||||
|
||||
-- 自动更新update_time的触发器函数
|
||||
CREATE OR REPLACE FUNCTION public.update_modified_column()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
NEW.update_time = now();
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- 为所有表添加update_time触发器的辅助函数
|
||||
CREATE OR REPLACE FUNCTION public.create_update_triggers()
|
||||
RETURNS void AS $$
|
||||
DECLARE
|
||||
r RECORD;
|
||||
BEGIN
|
||||
FOR r IN
|
||||
SELECT schemaname, tablename
|
||||
FROM pg_tables
|
||||
WHERE schemaname IN ('sys', 'file', 'message', 'log', 'config', 'knowledge', 'bidding', 'customer_service', 'agent')
|
||||
AND tablename LIKE 'tb_%'
|
||||
LOOP
|
||||
-- 检查表是否有update_time列
|
||||
IF EXISTS (
|
||||
SELECT 1
|
||||
FROM information_schema.columns
|
||||
WHERE table_schema = r.schemaname
|
||||
AND table_name = r.tablename
|
||||
AND column_name = 'update_time'
|
||||
) THEN
|
||||
-- 删除已存在的触发器
|
||||
EXECUTE format('DROP TRIGGER IF EXISTS trg_%s_update_time ON %I.%I',
|
||||
r.tablename, r.schemaname, r.tablename);
|
||||
|
||||
-- 创建新触发器
|
||||
EXECUTE format('CREATE TRIGGER trg_%s_update_time
|
||||
BEFORE UPDATE ON %I.%I
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION public.update_modified_column()',
|
||||
r.tablename, r.schemaname, r.tablename);
|
||||
|
||||
RAISE NOTICE 'Created trigger for %.%', r.schemaname, r.tablename;
|
||||
END IF;
|
||||
END LOOP;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- 执行触发器创建
|
||||
SELECT public.create_update_triggers();
|
||||
|
||||
-- =============================
|
||||
-- 创建视图
|
||||
-- =============================
|
||||
|
||||
@@ -207,7 +207,7 @@ DROP TABLE IF EXISTS customer_service.tb_faq CASCADE;
|
||||
CREATE TABLE customer_service.tb_faq (
|
||||
optsn VARCHAR(50) NOT NULL, -- 流水号
|
||||
faq_id VARCHAR(50) NOT NULL, -- FAQ ID
|
||||
kb_id VARCHAR(50), -- 关联知识库ID
|
||||
knowledge_id VARCHAR(50), -- 关联知识库ID
|
||||
category VARCHAR(100) NOT NULL, -- 分类
|
||||
question TEXT NOT NULL, -- 问题
|
||||
answer TEXT NOT NULL, -- 答案
|
||||
|
||||
@@ -12,6 +12,7 @@ CREATE TABLE file.tb_sys_file (
|
||||
mime_type VARCHAR(255) NOT NULL, -- 文件MIME类型
|
||||
url VARCHAR(255) NOT NULL, -- 文件URL
|
||||
status VARCHAR(50) NOT NULL, -- 文件状态
|
||||
service_type VARCHAR(50), -- 服务类型(bidding/customer_service/internal等)
|
||||
dept_path VARCHAR(255) NOT NULL, -- 当前部门路径
|
||||
creator VARCHAR(50) DEFAULT NULL, -- 创建者
|
||||
updater VARCHAR(50) DEFAULT NULL, -- 更新者
|
||||
@@ -22,7 +23,10 @@ CREATE TABLE file.tb_sys_file (
|
||||
PRIMARY KEY (file_id),
|
||||
UNIQUE (optsn)
|
||||
);
|
||||
CREATE INDEX idx_file_service ON file.tb_sys_file(service_type) WHERE deleted = false;
|
||||
|
||||
COMMENT ON TABLE file.tb_sys_file IS '文件表';
|
||||
COMMENT ON COLUMN file.tb_sys_file.service_type IS '服务类型(用于服务间数据隔离)';
|
||||
COMMENT ON COLUMN file.tb_sys_file.optsn IS '流水号';
|
||||
COMMENT ON COLUMN file.tb_sys_file.file_id IS '文件ID';
|
||||
COMMENT ON COLUMN file.tb_sys_file.name IS '文件名';
|
||||
@@ -39,4 +43,48 @@ COMMENT ON COLUMN file.tb_sys_file.updater IS '更新者';
|
||||
COMMENT ON COLUMN file.tb_sys_file.create_time IS '创建时间';
|
||||
COMMENT ON COLUMN file.tb_sys_file.update_time IS '更新时间';
|
||||
COMMENT ON COLUMN file.tb_sys_file.delete_time IS '删除时间';
|
||||
COMMENT ON COLUMN file.tb_sys_file.deleted IS '是否删除';
|
||||
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;
|
||||
@@ -8,7 +8,8 @@ CREATE SCHEMA IF NOT EXISTS knowledge;
|
||||
DROP TABLE IF EXISTS knowledge.tb_knowledge_base CASCADE;
|
||||
CREATE TABLE knowledge.tb_knowledge_base (
|
||||
optsn VARCHAR(50) NOT NULL, -- 流水号
|
||||
kb_id VARCHAR(50) NOT NULL, -- 知识库ID
|
||||
agent_id VARCHAR(50) NOT NULL, -- 智能体id
|
||||
knowledge_id VARCHAR(50) NOT NULL, -- 知识库ID
|
||||
name VARCHAR(255) NOT NULL, -- 知识库名称
|
||||
kb_type VARCHAR(50) NOT NULL, -- 知识库类型:bidding-招投标/customer_service-客服/internal-内部协同
|
||||
access_level VARCHAR(20) NOT NULL DEFAULT 'private', -- 访问级别:public-公开/private-私有/internal-内部
|
||||
@@ -16,6 +17,7 @@ CREATE TABLE knowledge.tb_knowledge_base (
|
||||
storage_path VARCHAR(500), -- 存储路径
|
||||
version VARCHAR(20) DEFAULT '1.0', -- 当前版本号
|
||||
config JSONB DEFAULT NULL, -- 知识库配置(JSON格式:索引配置、检索参数等)
|
||||
service_type VARCHAR(50), -- 服务类型(bidding/customer_service/internal,冗余kb_type便于查询)
|
||||
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'active', -- 状态:active-激活/inactive-停用/archived-归档
|
||||
creator VARCHAR(50) DEFAULT NULL, -- 创建者
|
||||
@@ -24,15 +26,17 @@ CREATE TABLE knowledge.tb_knowledge_base (
|
||||
update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间
|
||||
delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间
|
||||
deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除
|
||||
PRIMARY KEY (kb_id),
|
||||
PRIMARY KEY (knowledge_id),
|
||||
UNIQUE (optsn)
|
||||
);
|
||||
|
||||
CREATE INDEX idx_kb_type ON knowledge.tb_knowledge_base(kb_type) WHERE deleted = false;
|
||||
CREATE INDEX idx_kb_service ON knowledge.tb_knowledge_base(service_type) WHERE deleted = false;
|
||||
CREATE INDEX idx_kb_dept_path ON knowledge.tb_knowledge_base(dept_path) WHERE deleted = false;
|
||||
|
||||
COMMENT ON TABLE knowledge.tb_knowledge_base IS '知识库表';
|
||||
COMMENT ON COLUMN knowledge.tb_knowledge_base.kb_type IS '知识库类型:bidding-招投标/customer_service-客服/internal-内部协同';
|
||||
COMMENT ON COLUMN knowledge.tb_knowledge_base.service_type IS '服务类型(冗余存储便于快速过滤,与kb_type保持一致)';
|
||||
COMMENT ON COLUMN knowledge.tb_knowledge_base.access_level IS '访问级别:public-公开/private-私有/internal-内部';
|
||||
|
||||
-- 知识文档表
|
||||
@@ -40,7 +44,7 @@ DROP TABLE IF EXISTS knowledge.tb_knowledge_document CASCADE;
|
||||
CREATE TABLE knowledge.tb_knowledge_document (
|
||||
optsn VARCHAR(50) NOT NULL, -- 流水号
|
||||
doc_id VARCHAR(50) NOT NULL, -- 文档ID
|
||||
kb_id VARCHAR(50) NOT NULL, -- 所属知识库ID
|
||||
knowledge_id VARCHAR(50) NOT NULL, -- 所属知识库ID
|
||||
title VARCHAR(500) NOT NULL, -- 文档标题
|
||||
doc_type VARCHAR(50) NOT NULL, -- 文档类型:text-文本/pdf/word/excel/image/video
|
||||
category VARCHAR(100), -- 文档分类(自动或手动分类)
|
||||
@@ -50,8 +54,9 @@ CREATE TABLE knowledge.tb_knowledge_document (
|
||||
file_path VARCHAR(500), -- 文件路径
|
||||
file_size BIGINT, -- 文件大小(字节)
|
||||
mime_type VARCHAR(100), -- MIME类型
|
||||
version VARCHAR(20) DEFAULT '1.0', -- 文档版本号
|
||||
parent_doc_id VARCHAR(50), -- 父文档ID(用于版本管理)
|
||||
version INTEGER DEFAULT 1, -- 版本号(自动递增)
|
||||
root_doc_id VARCHAR(50), -- 根文档ID(版本组标识)
|
||||
is_current BOOLEAN DEFAULT true, -- 是否当前使用的版本
|
||||
tags TEXT[], -- 文档标签数组
|
||||
keywords TEXT[], -- 关键词数组(AI提取)
|
||||
embedding_status VARCHAR(20) DEFAULT 'pending', -- 向量化状态:pending-待处理/processing-处理中/completed-完成/failed-失败
|
||||
@@ -59,6 +64,7 @@ CREATE TABLE knowledge.tb_knowledge_document (
|
||||
chunk_count INTEGER DEFAULT 0, -- 切片数量
|
||||
metadata JSONB DEFAULT NULL, -- 文档元数据(JSON格式)
|
||||
source_url VARCHAR(500), -- 来源URL
|
||||
service_type VARCHAR(50), -- 服务类型(继承自知识库)
|
||||
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'active', -- 状态:active-激活/inactive-停用/archived-归档
|
||||
creator VARCHAR(50) DEFAULT NULL, -- 创建者
|
||||
@@ -69,15 +75,21 @@ CREATE TABLE knowledge.tb_knowledge_document (
|
||||
deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除
|
||||
PRIMARY KEY (doc_id),
|
||||
UNIQUE (optsn),
|
||||
FOREIGN KEY (kb_id) REFERENCES knowledge.tb_knowledge_base(kb_id)
|
||||
FOREIGN KEY (knowledge_id) REFERENCES knowledge.tb_knowledge_base(knowledge_id)
|
||||
);
|
||||
|
||||
CREATE INDEX idx_doc_kb ON knowledge.tb_knowledge_document(kb_id) WHERE deleted = false;
|
||||
CREATE INDEX idx_doc_kb ON knowledge.tb_knowledge_document(knowledge_id) WHERE deleted = false;
|
||||
CREATE INDEX idx_doc_service ON knowledge.tb_knowledge_document(service_type) WHERE deleted = false;
|
||||
CREATE INDEX idx_doc_category ON knowledge.tb_knowledge_document(category) WHERE deleted = false;
|
||||
CREATE INDEX idx_doc_embedding_status ON knowledge.tb_knowledge_document(embedding_status) WHERE deleted = false;
|
||||
CREATE INDEX idx_doc_tags ON knowledge.tb_knowledge_document USING GIN(tags) WHERE deleted = false;
|
||||
CREATE INDEX idx_doc_root_current ON knowledge.tb_knowledge_document(root_doc_id, is_current) WHERE deleted = false;
|
||||
|
||||
COMMENT ON TABLE knowledge.tb_knowledge_document IS '知识文档表';
|
||||
COMMENT ON COLUMN knowledge.tb_knowledge_document.service_type IS '服务类型(从知识库继承,用于服务间隔离)';
|
||||
COMMENT ON COLUMN knowledge.tb_knowledge_document.version IS '版本号(整数,每次创建新版本自动+1)';
|
||||
COMMENT ON COLUMN knowledge.tb_knowledge_document.root_doc_id IS '根文档ID(同一文档的所有版本共享此ID,首次上传时等于doc_id)';
|
||||
COMMENT ON COLUMN knowledge.tb_knowledge_document.is_current IS '是否当前使用的版本(每个root_doc_id只有一个is_current=true)';
|
||||
COMMENT ON COLUMN knowledge.tb_knowledge_document.embedding_status IS '向量化状态:pending/processing/completed/failed';
|
||||
|
||||
-- 知识文档片段表(用于RAG检索)
|
||||
@@ -86,12 +98,13 @@ CREATE TABLE knowledge.tb_knowledge_chunk (
|
||||
optsn VARCHAR(50) NOT NULL, -- 流水号
|
||||
chunk_id VARCHAR(50) NOT NULL, -- 片段ID
|
||||
doc_id VARCHAR(50) NOT NULL, -- 所属文档ID
|
||||
kb_id VARCHAR(50) NOT NULL, -- 所属知识库ID
|
||||
knowledge_id VARCHAR(50) NOT NULL, -- 所属知识库ID
|
||||
chunk_index INTEGER NOT NULL, -- 片段索引(在文档中的顺序)
|
||||
content TEXT NOT NULL, -- 片段内容
|
||||
content_length INTEGER, -- 内容长度
|
||||
embedding vector(1536), -- 向量嵌入(假设使用OpenAI 1536维)
|
||||
chunk_type VARCHAR(20) DEFAULT 'text', -- 片段类型:text-文本/table-表格/image-图片
|
||||
version INTEGER DEFAULT 1, -- 分段版本号(用于乐观锁,每次编辑+1)
|
||||
position_info JSONB, -- 位置信息(页码、坐标等)
|
||||
metadata JSONB, -- 片段元数据
|
||||
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
|
||||
@@ -102,15 +115,16 @@ CREATE TABLE knowledge.tb_knowledge_chunk (
|
||||
PRIMARY KEY (chunk_id),
|
||||
UNIQUE (optsn),
|
||||
FOREIGN KEY (doc_id) REFERENCES knowledge.tb_knowledge_document(doc_id),
|
||||
FOREIGN KEY (kb_id) REFERENCES knowledge.tb_knowledge_base(kb_id)
|
||||
FOREIGN KEY (knowledge_id) REFERENCES knowledge.tb_knowledge_base(knowledge_id)
|
||||
);
|
||||
|
||||
CREATE INDEX idx_chunk_doc ON knowledge.tb_knowledge_chunk(doc_id) WHERE deleted = false;
|
||||
CREATE INDEX idx_chunk_kb ON knowledge.tb_knowledge_chunk(kb_id) WHERE deleted = false;
|
||||
CREATE INDEX idx_chunk_kb ON knowledge.tb_knowledge_chunk(knowledge_id) WHERE deleted = false;
|
||||
-- 向量检索索引(需要安装pgvector扩展)
|
||||
-- CREATE INDEX idx_chunk_embedding ON knowledge.tb_knowledge_chunk USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
|
||||
|
||||
COMMENT ON TABLE knowledge.tb_knowledge_chunk IS '知识文档片段表(RAG检索)';
|
||||
COMMENT ON COLUMN knowledge.tb_knowledge_chunk.version IS '分段版本号(用于乐观锁,防止并发编辑冲突)';
|
||||
COMMENT ON COLUMN knowledge.tb_knowledge_chunk.embedding IS '向量嵌入(需要pgvector扩展)';
|
||||
|
||||
-- 知识访问日志表
|
||||
@@ -118,7 +132,7 @@ DROP TABLE IF EXISTS knowledge.tb_knowledge_access_log CASCADE;
|
||||
CREATE TABLE knowledge.tb_knowledge_access_log (
|
||||
optsn VARCHAR(50) NOT NULL, -- 流水号
|
||||
log_id VARCHAR(50) NOT NULL, -- 日志ID
|
||||
kb_id VARCHAR(50), -- 知识库ID
|
||||
knowledge_id VARCHAR(50), -- 知识库ID
|
||||
doc_id VARCHAR(50), -- 文档ID
|
||||
user_id VARCHAR(50) NOT NULL, -- 用户ID
|
||||
access_type VARCHAR(20) NOT NULL, -- 访问类型:view-查看/download-下载/search-搜索/edit-编辑
|
||||
@@ -133,6 +147,6 @@ CREATE TABLE knowledge.tb_knowledge_access_log (
|
||||
);
|
||||
|
||||
CREATE INDEX idx_access_log_user ON knowledge.tb_knowledge_access_log(user_id, create_time DESC);
|
||||
CREATE INDEX idx_access_log_kb ON knowledge.tb_knowledge_access_log(kb_id, create_time DESC);
|
||||
CREATE INDEX idx_access_log_kb ON knowledge.tb_knowledge_access_log(knowledge_id, create_time DESC);
|
||||
|
||||
COMMENT ON TABLE knowledge.tb_knowledge_access_log IS '知识访问日志表';
|
||||
|
||||
@@ -13,6 +13,7 @@ CREATE TABLE log.tb_sys_log (
|
||||
message VARCHAR(255) NOT NULL, -- 日志消息
|
||||
data JSONB DEFAULT NULL, -- 日志数据
|
||||
creator VARCHAR(50) DEFAULT NULL, -- 创建者
|
||||
service_type VARCHAR(50) NOT NULL, -- 服务类型
|
||||
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
|
||||
updater VARCHAR(50) DEFAULT NULL, -- 更新者
|
||||
create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 日志创建时间
|
||||
@@ -31,6 +32,7 @@ COMMENT ON COLUMN log.tb_sys_log.module IS '日志模块';
|
||||
COMMENT ON COLUMN log.tb_sys_log.message IS '日志消息';
|
||||
COMMENT ON COLUMN log.tb_sys_log.data IS '日志数据';
|
||||
COMMENT ON COLUMN log.tb_sys_log.creator IS '创建者';
|
||||
COMMENT ON COLUMN log.tb_sys_log.service_type IS '服务类型';
|
||||
COMMENT ON COLUMN log.tb_sys_log.dept_path IS '部门全路径';
|
||||
COMMENT ON COLUMN log.tb_sys_log.updater IS '更新者';
|
||||
COMMENT ON COLUMN log.tb_sys_log.create_time IS '日志创建时间';
|
||||
|
||||
@@ -8,6 +8,7 @@ CREATE TABLE message.tb_message (
|
||||
content VARCHAR(255) NOT NULL, -- 消息内容
|
||||
type VARCHAR(50) NOT NULL, -- 消息类型
|
||||
status VARCHAR(50) NOT NULL, -- 消息状态
|
||||
service_type VARCHAR(50) NOT NULL, -- 服务类型
|
||||
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径(隔离)
|
||||
creator VARCHAR(50) NOT NULL DEFAULT 'system',-- 创建者
|
||||
updater VARCHAR(50) DEFAULT NULL, -- 更新者
|
||||
@@ -26,6 +27,7 @@ COMMENT ON COLUMN message.tb_message.title IS '消息标题';
|
||||
COMMENT ON COLUMN message.tb_message.content IS '消息内容';
|
||||
COMMENT ON COLUMN message.tb_message.type IS '消息类型';
|
||||
COMMENT ON COLUMN message.tb_message.status IS '消息状态';
|
||||
COMMENT ON COLUMN message.tb_message.service_type IS '服务类型';
|
||||
COMMENT ON COLUMN message.tb_message.dept_path IS '部门全路径';
|
||||
COMMENT ON COLUMN message.tb_message.creator IS '创建者';
|
||||
COMMENT ON COLUMN message.tb_message.updater IS '更新者';
|
||||
@@ -150,3 +152,49 @@ COMMENT ON COLUMN message.tb_message_channel.create_time IS '创建时间';
|
||||
COMMENT ON COLUMN message.tb_message_channel.update_time IS '更新时间';
|
||||
COMMENT ON COLUMN message.tb_message_channel.delete_time IS '删除时间';
|
||||
COMMENT ON COLUMN message.tb_message_channel.deleted IS '是否删除';
|
||||
|
||||
-- =============================
|
||||
-- 消息模板表
|
||||
-- =============================
|
||||
DROP TABLE IF EXISTS message.tb_message_template CASCADE;
|
||||
CREATE TABLE message.tb_message_template (
|
||||
optsn VARCHAR(50) NOT NULL,
|
||||
template_id VARCHAR(50) NOT NULL,
|
||||
template_code VARCHAR(100) NOT NULL, -- 模板编码
|
||||
template_name VARCHAR(255) NOT NULL, -- 模板名称
|
||||
template_type VARCHAR(30) NOT NULL, -- 模板类型:system-系统/business-业务
|
||||
title_template TEXT, -- 标题模板(支持变量)
|
||||
content_template TEXT NOT NULL, -- 内容模板(支持变量)
|
||||
variables JSONB, -- 模板变量定义
|
||||
service_type VARCHAR(50) NOT NULL, -- 服务类型
|
||||
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
|
||||
creator VARCHAR(50) DEFAULT NULL, -- 创建者
|
||||
updater VARCHAR(50) DEFAULT NULL, -- 更新者
|
||||
create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
|
||||
update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间
|
||||
delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间
|
||||
deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除
|
||||
PRIMARY KEY (template_id),
|
||||
UNIQUE (optsn),
|
||||
UNIQUE (template_code)
|
||||
);
|
||||
|
||||
COMMENT ON TABLE message.tb_message_template IS '消息模板表';
|
||||
COMMENT ON COLUMN message.tb_message_template.optsn IS '流水号';
|
||||
COMMENT ON COLUMN message.tb_message_template.template_id IS '模板ID';
|
||||
COMMENT ON COLUMN message.tb_message_template.template_code IS '模板编码';
|
||||
COMMENT ON COLUMN message.tb_message_template.template_name IS '模板名称';
|
||||
COMMENT ON COLUMN message.tb_message_template.template_type IS '模板类型:system-系统/business-业务';
|
||||
COMMENT ON COLUMN message.tb_message_template.title_template IS '标题模板(支持变量)';
|
||||
COMMENT ON COLUMN message.tb_message_template.content_template IS '内容模板(支持变量)';
|
||||
COMMENT ON COLUMN message.tb_message_template.variables IS '模板变量定义';
|
||||
COMMENT ON COLUMN message.tb_message_template.service_type IS '服务类型';
|
||||
COMMENT ON COLUMN message.tb_message_template.dept_path IS '部门全路径';
|
||||
COMMENT ON COLUMN message.tb_message_template.creator IS '创建者';
|
||||
COMMENT ON COLUMN message.tb_message_template.updater IS '更新者';
|
||||
COMMENT ON COLUMN message.tb_message_template.create_time IS '创建时间';
|
||||
COMMENT ON COLUMN message.tb_message_template.update_time IS '更新时间';
|
||||
COMMENT ON COLUMN message.tb_message_template.delete_time IS '删除时间';
|
||||
COMMENT ON COLUMN message.tb_message_template.deleted IS '是否删除';
|
||||
|
||||
CREATE INDEX idx_template_type ON message.tb_message_template(template_type) WHERE deleted = false;
|
||||
|
||||
@@ -124,6 +124,7 @@ CREATE TABLE sys.tb_sys_user_role (
|
||||
optsn VARCHAR(50) NOT NULL, -- 流水号
|
||||
user_id VARCHAR(50) NOT NULL, -- 用户ID
|
||||
role_id VARCHAR(50) NOT NULL, -- 角色ID
|
||||
dept_id VARCHAR(50) NOT NULL, -- 部门ID
|
||||
dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径
|
||||
creator VARCHAR(50) DEFAULT NULL, -- 创建者
|
||||
updater VARCHAR(50) DEFAULT NULL, -- 更新者
|
||||
@@ -138,6 +139,7 @@ COMMENT ON TABLE sys.tb_sys_user_role IS '用户角色关联表';
|
||||
COMMENT ON COLUMN sys.tb_sys_user_role.optsn IS '流水号';
|
||||
COMMENT ON COLUMN sys.tb_sys_user_role.user_id IS '用户ID';
|
||||
COMMENT ON COLUMN sys.tb_sys_user_role.role_id IS '角色ID';
|
||||
COMMENT ON COLUMN sys.tb_sys_user_role.dept_id IS '部门ID';
|
||||
COMMENT ON COLUMN sys.tb_sys_user_role.dept_path IS '部门全路径';
|
||||
COMMENT ON COLUMN sys.tb_sys_user_role.creator IS '创建者';
|
||||
COMMENT ON COLUMN sys.tb_sys_user_role.updater IS '更新者';
|
||||
|
||||
@@ -54,11 +54,11 @@ CREATE TABLE sys.tb_sys_user_info (
|
||||
user_id VARCHAR(50) NOT NULL, -- 用户ID
|
||||
avatar VARCHAR(255), -- 头像
|
||||
gender INTEGER DEFAULT 0, -- 性别
|
||||
username VARCHAR(100) NOT NULL -- 用户名
|
||||
username VARCHAR(100) NOT NULL, -- 用户名
|
||||
level INTEGER DEFAULT 1, -- 等级
|
||||
id_card VARCHAR(50), -- 身份证号
|
||||
address VARCHAR(255), -- 地址
|
||||
remark VARCHAR(500) DEFAULT NULL -- 备注
|
||||
remark VARCHAR(500) DEFAULT NULL, -- 备注
|
||||
create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间
|
||||
update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间(触发器维护)
|
||||
delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间
|
||||
|
||||
@@ -1,11 +1,55 @@
|
||||
-- 按顺序执行初始化
|
||||
\i createDB.sql -- 创建数据库和基础扩展
|
||||
\i createTableUser.sql -- 用户表相关(核心表)
|
||||
\i createTablePermission.sql -- 权限相关(核心表)
|
||||
\i createTableFile.sql -- 文件管理
|
||||
\i createTableMessage.sql -- 消息管理
|
||||
\i createTableConfig.sql -- 配置管理
|
||||
\i createTableLog.sql -- 日志管理
|
||||
-- =============================
|
||||
-- 城市生命线AI数智化平台 - 数据库初始化脚本
|
||||
-- 按顺序执行各模块建表SQL及数据初始化
|
||||
-- =============================
|
||||
|
||||
-- 初始化基础数据(如果有)
|
||||
-- \i initBaseData.sql -- 取消注释如果需要初始化基础数据
|
||||
-- =============================
|
||||
-- 第一阶段:创建数据库和表结构
|
||||
-- =============================
|
||||
\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
|
||||
|
||||
-- 注意:文件、日志、知识库、招投标、客服等业务表无需初始化数据
|
||||
@@ -2,42 +2,43 @@
|
||||
-- 仅插入常用示例,可按需调整 value/remark
|
||||
|
||||
INSERT INTO config.tb_sys_config (
|
||||
optsn, config_id, key, value, type, description, "group", "order", status, remark,
|
||||
optsn, config_id, key, name, value, config_type, render_type, description,
|
||||
re, options, "group", module_id, order_num, status, remark,
|
||||
creator, dept_path, updater, create_time, update_time, delete_time, deleted
|
||||
) VALUES
|
||||
|
||||
-- 站点与品牌
|
||||
('CFG-0001', 'cfg_site_name', 'site.name', 'urban-lifeline 平台', 'string', '站点名称', 'site', 10, 'enabled', '展示在标题/登录/页脚', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0002', 'cfg_site_logo', 'site.logo', '/static/logo.png', 'string', '站点Logo地址', 'site', 20, 'enabled', '相对或绝对URL', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0003', 'cfg_site_icp', 'site.icp', '', 'string', 'ICP备案号', 'site', 30, 'enabled', '页脚展示', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0001', 'cfg_site_name', 'site.name', '站点名称', 'urban-lifeline 平台', 'String', 'input', '站点名称', NULL, NULL, 'site', 'mod_system', 10, 0, '展示在标题/登录/页脚', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0002', 'cfg_site_logo', 'site.logo', '站点Logo', '/static/logo.png', 'String', 'input', '站点Logo地址', NULL, NULL, 'site', 'mod_system', 20, 0, '相对或绝对URL', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0003', 'cfg_site_icp', 'site.icp', 'ICP备案号', '', 'String', 'input', 'ICP备案号', NULL, NULL, 'site', 'mod_system', 30, 0, '页脚展示', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
|
||||
-- 国际化与时区
|
||||
('CFG-0101', 'cfg_i18n_locale', 'i18n.defaultLocale', 'zh-CN', 'string', '默认语言', 'i18n', 10, 'enabled', '如 zh-CN/en-US', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0102', 'cfg_timezone', 'system.timezone', 'Asia/Shanghai', 'string', '系统默认时区', 'i18n', 20, 'enabled', 'IANA时区名', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0101', 'cfg_i18n_locale', 'i18n.defaultLocale', '默认语言', 'zh-CN', 'String', 'select', '默认语言', NULL, '["zh-CN", "en-US"]'::json, 'i18n', 'mod_system', 10, 0, '如 zh-CN/en-US', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0102', 'cfg_timezone', 'system.timezone', '系统时区', 'Asia/Shanghai', 'String', 'input', '系统默认时区', NULL, NULL, 'i18n', 'mod_system', 20, 0, 'IANA时区名', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
|
||||
-- 安全与认证
|
||||
('CFG-0201', 'cfg_pwd_policy', 'security.passwordPolicy','{"minLen":8,"upper":1,"lower":1,"digit":1,"special":0}', 'json', '密码策略', 'security', 10, 'enabled', 'JSON结构', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0202', 'cfg_jwt_exp', 'security.jwt.expireSeconds','86400', 'number', 'JWT过期秒数', 'security', 20, 'enabled', '默认24小时', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0203', 'cfg_session_timeout', 'security.session.timeoutMinutes','30', 'number', '会话超时(分钟)', 'security', 30, 'enabled', '空闲登出', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0204', 'cfg_signup_enabled', 'security.signup.enabled','false', 'bool', '是否开放注册', 'security', 40, 'enabled', '生产建议关闭', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0201', 'cfg_pwd_policy', 'security.passwordPolicy','密码策略', '{"minLen":8,"upper":1,"lower":1,"digit":1,"special":0}', 'String', 'textarea', '密码策略', NULL, NULL, 'security', 'mod_system', 10, 0, 'JSON结构', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0202', 'cfg_jwt_exp', 'security.jwt.expireSeconds','JWT过期时间', '86400', 'INTEGER', 'input', 'JWT过期秒数', NULL, NULL, 'security', 'mod_system', 20, 0, '默认24小时', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0203', 'cfg_session_timeout', 'security.session.timeoutMinutes','会话超时', '30', 'INTEGER', 'input', '会话超时(分钟)', NULL, NULL, 'security', 'mod_system', 30, 0, '空闲登出', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0204', 'cfg_signup_enabled', 'security.signup.enabled','开放注册', 'false', 'BOOLEAN', 'switch', '是否开放注册', NULL, NULL, 'security', 'mod_system', 40, 0, '生产建议关闭', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
|
||||
-- 存储与上传
|
||||
('CFG-0301', 'cfg_upload_max', 'upload.maxSizeMB', '50', 'number', '单文件最大上传(MB)', 'storage', 10, 'enabled', '前后端需一致校验', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0302', 'cfg_storage_backend', 'storage.backend', 'local', 'string', '存储后端(local/minio/s3)', 'storage', 20, 'enabled', '本地/MinIO/S3等', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0303', 'cfg_storage_base', 'storage.basePath', '/data/urban-lifeline', 'string', '本地存储基路径', 'storage', 30, 'enabled', '当 backend=local', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0301', 'cfg_upload_max', 'upload.maxSizeMB', '最大上传大小', '50', 'INTEGER', 'input', '单文件最大上传(MB)', NULL, NULL, 'storage', 'mod_file', 10, 0, '前后端需一致校验', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0302', 'cfg_storage_backend', 'storage.backend', '存储后端', 'local', 'String', 'select', '存储后端类型', NULL, '["local", "minio", "s3"]'::json, 'storage', 'mod_file', 20, 0, '本地/MinIO/S3等', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0303', 'cfg_storage_base', 'storage.basePath', '存储路径', '/data/urban-lifeline', 'String', 'input', '本地存储基路径', NULL, NULL, 'storage', 'mod_file', 30, 0, '当 backend=local', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
|
||||
-- 通知(邮件/SMS)
|
||||
('CFG-0401', 'cfg_mail_host', 'mail.smtp.host', '', 'string', 'SMTP主机', 'notify', 10, 'disabled','留空为未配置', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0402', 'cfg_mail_port', 'mail.smtp.port', '465', 'number', 'SMTP端口', 'notify', 20, 'disabled','SSL常用465', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0403', 'cfg_mail_from', 'mail.from', '', 'string', '发件人邮箱', 'notify', 30, 'disabled','如 no-reply@x.com', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0411', 'cfg_sms_provider', 'sms.provider', '', 'string', '短信服务商', 'notify', 40, 'disabled','如 aliyun/tencent', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0401', 'cfg_mail_host', 'mail.smtp.host', 'SMTP主机', '', 'String', 'input', 'SMTP主机', NULL, NULL, 'notify', 'mod_message', 10, 1, '留空为未配置', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0402', 'cfg_mail_port', 'mail.smtp.port', 'SMTP端口', '465', 'INTEGER', 'input', 'SMTP端口', NULL, NULL, 'notify', 'mod_message', 20, 1, 'SSL常用465', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0403', 'cfg_mail_from', 'mail.from', '发件人邮箱', '', 'String', 'input', '发件人邮箱', NULL, NULL, 'notify', 'mod_message', 30, 1, '如 no-reply@x.com', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0411', 'cfg_sms_provider', 'sms.provider', '短信服务商', '', 'String', 'select', '短信服务商', NULL, '["aliyun", "tencent"]'::json, 'notify', 'mod_message', 40, 1, '如 aliyun/tencent', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
|
||||
-- 日志与审计
|
||||
('CFG-0501', 'cfg_log_level', 'log.level', 'INFO', 'string', '系统日志级别', 'log', 10, 'enabled', 'DEBUG/INFO/WARN/ERROR', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0502', 'cfg_audit_retention', 'audit.retentionDays', '90', 'number', '审计日志保留天数', 'log', 20, 'enabled', '合规按需调整', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0501', 'cfg_log_level', 'log.level', '日志级别', 'INFO', 'String', 'select', '系统日志级别', NULL, '["DEBUG", "INFO", "WARN", "ERROR"]'::json, 'log', 'mod_system', 10, 0, 'DEBUG/INFO/WARN/ERROR', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0502', 'cfg_audit_retention', 'audit.retentionDays', '审计日志保留', '90', 'INTEGER', 'input', '审计日志保留天数', NULL, NULL, 'log', 'mod_system', 20, 0, '合规按需调整', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
|
||||
-- 平台特性
|
||||
('CFG-0601', 'cfg_maintenance', 'platform.maintenance', 'false', 'bool', '维护模式开关', 'platform', 10, 'enabled', 'true时仅管理员可用', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0602', 'cfg_feature_acl_policy', 'feature.acl.policy', 'enabled', 'string', 'ACL策略开关', 'platform', 20, 'enabled', 'enabled/disabled', 'system', NULL, NULL, now(), NULL, NULL, false);
|
||||
('CFG-0601', 'cfg_maintenance', 'platform.maintenance', '维护模式', 'false', 'BOOLEAN', 'switch', '维护模式开关', NULL, NULL, 'platform', 'mod_system', 10, 0, 'true时仅管理员可用', 'system', NULL, NULL, now(), NULL, NULL, false),
|
||||
('CFG-0602', 'cfg_feature_acl_policy','feature.acl.policy', 'ACL策略', 'enabled', 'String', 'select', 'ACL策略开关', NULL, '["enabled", "disabled"]'::json, 'platform', 'mod_system', 20, 0, 'enabled/disabled', 'system', NULL, NULL, now(), NULL, NULL, false);
|
||||
|
||||
|
||||
|
||||
118
urbanLifelineServ/.bin/database/postgres/sql/initDataMessage.sql
Normal file
118
urbanLifelineServ/.bin/database/postgres/sql/initDataMessage.sql
Normal 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);
|
||||
@@ -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);
|
||||
@@ -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);
|
||||
@@ -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 $$;
|
||||
Reference in New Issue
Block a user