Files
smart-customer-service/backend/migrations/001_init_schema.sql
Ubuntu c68ea3b600 feat: 智能客服系统基础架构完成
 已完成功能:
1. 项目基础设施和Docker开发环境
2. 前端React 18 + TypeScript架构
3. 后端Golang + Gin框架
4. 多租户数据库设计
5. 完整API路由系统
6. 智能客服聊天界面
7. 详细文档和部署指南

🔧 技术栈:
- 前端:React 18, TypeScript, Vite, Zustand
- 后端:Golang, Gin, GORM, PostgreSQL
- 部署:Docker, Docker Compose

🎨 设计规范:
- 无渐变色,无紫色
- 简洁专业的中性色系
- 响应式布局

📊 状态:
- 前端开发服务器:http://localhost:5173
- 后端API服务:http://localhost:8080
- 数据库:PostgreSQL + Redis
- 完整的多租户架构

作者:小弟 (大哥的AI助手)
日期:2026-02-27
2026-02-27 17:00:15 +08:00

450 lines
14 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- 智能客服系统数据库初始化脚本
-- 创建时间: 2026-02-27
-- 作者: 小弟 (大哥的AI助手)
-- 启用UUID扩展
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- 1. 租户表
CREATE TABLE tenants (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL UNIQUE,
display_name VARCHAR(200),
description TEXT,
domain VARCHAR(100) UNIQUE,
email VARCHAR(100) NOT NULL,
phone VARCHAR(20),
-- 订阅信息
plan VARCHAR(50) DEFAULT 'free',
status VARCHAR(20) DEFAULT 'active',
expires_at TIMESTAMP WITH TIME ZONE,
-- 资源配置
max_users INT DEFAULT 10,
max_agents INT DEFAULT 5,
max_storage BIGINT DEFAULT 1073741824, -- 1GB
max_api_calls INT DEFAULT 1000,
-- 使用统计
user_count INT DEFAULT 0,
agent_count INT DEFAULT 0,
storage_used BIGINT DEFAULT 0,
api_calls_used INT DEFAULT 0,
-- 配置
config JSONB DEFAULT '{}',
-- 时间戳
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
deleted_at TIMESTAMP WITH TIME ZONE
);
-- 创建索引
CREATE INDEX idx_tenants_status ON tenants(status);
CREATE INDEX idx_tenants_domain ON tenants(domain);
CREATE INDEX idx_tenants_deleted_at ON tenants(deleted_at);
-- 2. 用户表(多租户共享)
CREATE TABLE users (
id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
password VARCHAR(255) NOT NULL,
phone VARCHAR(20),
-- 个人信息
full_name VARCHAR(100),
avatar VARCHAR(255),
bio TEXT,
-- 角色和权限
role VARCHAR(20) DEFAULT 'user',
status VARCHAR(20) DEFAULT 'active',
is_verified BOOLEAN DEFAULT FALSE,
-- 最后活动
last_login_at TIMESTAMP WITH TIME ZONE,
last_ip VARCHAR(45),
-- 配置
preferences JSONB DEFAULT '{}',
-- 时间戳
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
deleted_at TIMESTAMP WITH TIME ZONE
);
-- 创建复合索引和唯一约束
CREATE UNIQUE INDEX idx_users_email_tenant ON users(email, tenant_id);
CREATE INDEX idx_users_tenant_id ON users(tenant_id);
CREATE INDEX idx_users_username ON users(username);
CREATE INDEX idx_users_role ON users(role);
CREATE INDEX idx_users_status ON users(status);
CREATE INDEX idx_users_deleted_at ON users(deleted_at);
-- 3. 客服坐席表
CREATE TABLE agents (
id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
user_id INT NOT NULL UNIQUE REFERENCES users(id) ON DELETE CASCADE,
-- 坐席信息
agent_id VARCHAR(50) NOT NULL UNIQUE,
department VARCHAR(100),
title VARCHAR(100),
skills JSONB DEFAULT '[]',
-- 工作状态
status VARCHAR(20) DEFAULT 'offline',
max_chats INT DEFAULT 5,
current_chats INT DEFAULT 0,
-- 绩效统计
total_chats INT DEFAULT 0,
avg_rating DECIMAL(3,2) DEFAULT 0,
response_time_avg INT DEFAULT 0,
-- 工作时间
work_schedule JSONB DEFAULT '{}',
-- 时间戳
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- 创建索引
CREATE INDEX idx_agents_tenant_id ON agents(tenant_id);
CREATE INDEX idx_agents_user_id ON agents(user_id);
CREATE INDEX idx_agents_status ON agents(status);
CREATE INDEX idx_agents_agent_id ON agents(agent_id);
-- 4. 会话表
CREATE TABLE conversations (
id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
channel VARCHAR(50) NOT NULL,
type VARCHAR(20) NOT NULL,
-- 参与者
customer_id INT REFERENCES users(id) ON DELETE SET NULL,
customer_name VARCHAR(100),
customer_email VARCHAR(100),
customer_phone VARCHAR(20),
agent_id INT REFERENCES agents(id) ON DELETE SET NULL,
department VARCHAR(100),
-- 会话信息
title VARCHAR(200),
description TEXT,
tags JSONB DEFAULT '[]',
priority VARCHAR(20) DEFAULT 'normal',
-- 状态
status VARCHAR(20) DEFAULT 'open',
source VARCHAR(100),
referrer VARCHAR(500),
-- 统计
message_count INT DEFAULT 0,
first_response_at TIMESTAMP WITH TIME ZONE,
first_response_duration INT DEFAULT 0,
resolution_at TIMESTAMP WITH TIME ZONE,
resolution_duration INT DEFAULT 0,
-- 满意度
rating INT CHECK (rating >= 1 AND rating <= 5),
rating_comment TEXT,
-- 元数据
metadata JSONB DEFAULT '{}',
-- 时间戳
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
closed_at TIMESTAMP WITH TIME ZONE
);
-- 创建索引
CREATE INDEX idx_conversations_tenant_id ON conversations(tenant_id);
CREATE INDEX idx_conversations_customer_id ON conversations(customer_id);
CREATE INDEX idx_conversations_agent_id ON conversations(agent_id);
CREATE INDEX idx_conversations_status ON conversations(status);
CREATE INDEX idx_conversations_priority ON conversations(priority);
CREATE INDEX idx_conversations_created_at ON conversations(created_at);
-- 5. 消息表
CREATE TABLE messages (
id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
conversation_id INT NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,
-- 发送者信息
sender_type VARCHAR(20) NOT NULL,
sender_id INT REFERENCES users(id) ON DELETE SET NULL,
sender_name VARCHAR(100),
sender_avatar VARCHAR(255),
-- 消息内容
content_type VARCHAR(50) DEFAULT 'text',
content TEXT NOT NULL,
rich_content JSONB DEFAULT '{}',
-- AI相关
is_ai_response BOOLEAN DEFAULT FALSE,
ai_model VARCHAR(100),
ai_prompt_tokens INT DEFAULT 0,
ai_completion_tokens INT DEFAULT 0,
ai_total_tokens INT DEFAULT 0,
-- 状态
status VARCHAR(20) DEFAULT 'sent',
read_by JSONB DEFAULT '[]',
read_at TIMESTAMP WITH TIME ZONE,
-- 回复引用
reply_to_id INT REFERENCES messages(id) ON DELETE SET NULL,
-- 时间戳
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- 创建索引
CREATE INDEX idx_messages_tenant_id ON messages(tenant_id);
CREATE INDEX idx_messages_conversation_id ON messages(conversation_id);
CREATE INDEX idx_messages_sender_id ON messages(sender_id);
CREATE INDEX idx_messages_sender_type ON messages(sender_type);
CREATE INDEX idx_messages_created_at ON messages(created_at);
CREATE INDEX idx_messages_reply_to_id ON messages(reply_to_id);
-- 6. 附件表
CREATE TABLE attachments (
id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
message_id INT NOT NULL REFERENCES messages(id) ON DELETE CASCADE,
-- 文件信息
name VARCHAR(255) NOT NULL,
type VARCHAR(100) NOT NULL,
size BIGINT NOT NULL,
url VARCHAR(500) NOT NULL,
thumbnail_url VARCHAR(500),
-- 元数据
width INT,
height INT,
duration INT,
-- 时间戳
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- 创建索引
CREATE INDEX idx_attachments_tenant_id ON attachments(tenant_id);
CREATE INDEX idx_attachments_message_id ON attachments(message_id);
-- 7. 工单表
CREATE TABLE tickets (
id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
conversation_id INT REFERENCES conversations(id) ON DELETE SET NULL,
-- 工单信息
ticket_number VARCHAR(50) NOT NULL UNIQUE,
title VARCHAR(200) NOT NULL,
description TEXT NOT NULL,
category VARCHAR(100),
subcategory VARCHAR(100),
tags JSONB DEFAULT '[]',
priority VARCHAR(20) DEFAULT 'normal',
-- 参与者
customer_id INT REFERENCES users(id) ON DELETE SET NULL,
customer_name VARCHAR(100),
customer_email VARCHAR(100),
assigned_agent_id INT REFERENCES agents(id) ON DELETE SET NULL,
assigned_department VARCHAR(100),
-- 状态
status VARCHAR(20) DEFAULT 'open',
source VARCHAR(100),
-- SLA管理
sla_level VARCHAR(50),
due_at TIMESTAMP WITH TIME ZONE,
first_response_due_at TIMESTAMP WITH TIME ZONE,
resolution_due_at TIMESTAMP WITH TIME ZONE,
-- 统计
first_response_at TIMESTAMP WITH TIME ZONE,
first_response_duration INT DEFAULT 0,
resolution_at TIMESTAMP WITH TIME ZONE,
resolution_duration INT DEFAULT 0,
-- 满意度
rating INT CHECK (rating >= 1 AND rating <= 5),
rating_comment TEXT,
-- 元数据
metadata JSONB DEFAULT '{}',
-- 时间戳
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
closed_at TIMESTAMP WITH TIME ZONE
);
-- 创建索引
CREATE INDEX idx_tickets_tenant_id ON tickets(tenant_id);
CREATE INDEX idx_tickets_ticket_number ON tickets(ticket_number);
CREATE INDEX idx_tickets_customer_id ON tickets(customer_id);
CREATE INDEX idx_tickets_assigned_agent_id ON tickets(assigned_agent_id);
CREATE INDEX idx_tickets_status ON tickets(status);
CREATE INDEX idx_tickets_priority ON tickets(priority);
CREATE INDEX idx_tickets_due_at ON tickets(due_at);
CREATE INDEX idx_tickets_created_at ON tickets(created_at);
-- 8. 知识库表
CREATE TABLE knowledge_base (
id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
-- 知识条目
title VARCHAR(200) NOT NULL,
content TEXT NOT NULL,
summary TEXT,
category VARCHAR(100),
tags JSONB DEFAULT '[]',
-- 状态
status VARCHAR(20) DEFAULT 'draft',
visibility VARCHAR(20) DEFAULT 'private',
-- 统计
view_count INT DEFAULT 0,
helpful_count INT DEFAULT 0,
not_helpful_count INT DEFAULT 0,
-- AI训练
is_trained BOOLEAN DEFAULT FALSE,
training_status VARCHAR(50),
last_trained_at TIMESTAMP WITH TIME ZONE,
-- 元数据
metadata JSONB DEFAULT '{}',
-- 作者信息
author_id INT REFERENCES users(id) ON DELETE SET NULL,
author_name VARCHAR(100),
-- 时间戳
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
published_at TIMESTAMP WITH TIME ZONE
);
-- 创建索引
CREATE INDEX idx_knowledge_base_tenant_id ON knowledge_base(tenant_id);
CREATE INDEX idx_knowledge_base_category ON knowledge_base(category);
CREATE INDEX idx_knowledge_base_status ON knowledge_base(status);
CREATE INDEX idx_knowledge_base_visibility ON knowledge_base(visibility);
CREATE INDEX idx_knowledge_base_tags ON knowledge_base USING GIN(tags);
-- 9. 系统配置表
CREATE TABLE system_configs (
id SERIAL PRIMARY KEY,
tenant_id INT REFERENCES tenants(id) ON DELETE CASCADE,
config_key VARCHAR(100) NOT NULL,
config_value JSONB NOT NULL,
config_type VARCHAR(50) DEFAULT 'string',
description TEXT,
-- 作用域
scope VARCHAR(50) DEFAULT 'tenant', -- system, tenant, user
is_public BOOLEAN DEFAULT FALSE,
-- 时间戳
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- 创建唯一约束和索引
CREATE UNIQUE INDEX idx_system_configs_key_tenant ON system_configs(config_key, tenant_id);
CREATE INDEX idx_system_configs_scope ON system_configs(scope);
-- 10. 审计日志表
CREATE TABLE audit_logs (
id SERIAL PRIMARY KEY,
tenant_id INT REFERENCES tenants(id) ON DELETE CASCADE,
-- 操作信息
action VARCHAR(100) NOT NULL,
resource_type VARCHAR(50) NOT NULL,
resource_id VARCHAR(100),
resource_name VARCHAR(200),
-- 用户信息
user_id INT REFERENCES users(id) ON DELETE SET NULL,
user_name VARCHAR(100),
user_ip VARCHAR(45),
user_agent TEXT,
-- 变更详情
old_values JSONB,
new_values JSONB,
changes JSONB,
-- 结果
status VARCHAR(20) DEFAULT 'success',
error_message TEXT,
-- 时间戳
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
-- 创建索引
CREATE INDEX idx_audit_logs_tenant_id ON audit_logs(tenant_id);
CREATE INDEX idx_audit_logs_user_id ON audit_logs(user_id);
CREATE INDEX idx_audit_logs_action ON audit_logs(action);
CREATE INDEX idx_audit_logs_resource_type ON audit_logs(resource_type);
CREATE INDEX idx_audit_logs_created_at ON audit_logs(created_at);
-- 插入默认系统配置
INSERT INTO system_configs (config_key, config_value, config_type, description, scope, is_public)
VALUES
('system.name', '"智能客服系统"', 'string', '系统名称', 'system', TRUE),
('system.version', '"1.0.0"', 'string', '系统版本', 'system', TRUE),
('system.maintenance', 'false', 'boolean', '系统维护状态', 'system', TRUE),
('ai.default_model', '"gpt-3.5-turbo"', 'string', '默认AI模型', 'system', FALSE),
('ai.max_tokens', '1000', 'number', 'AI最大token数', 'system', FALSE),
('ai.temperature', '0.7', 'number', 'AI温度参数', 'system', FALSE),
('sla.first_response', '3600', 'number', '首次响应SLA', 'system', FALSE),
('sla.resolution', '86400', 'number', '解决SLA', 'system', FALSE);
-- 创建默认管理员租户
INSERT INTO tenants (name, display_name, description, domain, email, phone, plan, max_users, max_agents)
VALUES
('admin', '系统管理租户', '系统默认管理租户', 'admin.local', 'admin@example.com', '13800138000', 'enterprise', 100, 50);
-- 创建默认管理员用户
INSERT INTO users (tenant_id, username, email, password, full_name, role, is_verified)
SELECT
id,
'admin',
'admin@example.com',
-- 密码: admin123 (bcrypt hash)
'$2a$10$N9qo8uLOickgx2ZMRZoMye3Z7c7K8pB7J7B7J7B7J7B7J7B7J7B7J',
'系统管理员',
'super_admin',
TRUE
FROM tenants WHERE name = 'admin';
-- 输出完成信息
SELECT '数据库初始化完成!' AS message;