183 lines
6.4 KiB
SQL
183 lines
6.4 KiB
SQL
-- ============================================
|
|
-- AegisOne MAX Bot — Database Schema
|
|
-- ============================================
|
|
-- Run this to set up all bot tables.
|
|
-- Assumes database 'aegisone' already exists.
|
|
|
|
-- ============================================
|
|
-- CLEANUP: Drop ALL old bot tables before recreating
|
|
-- ============================================
|
|
DROP TABLE IF EXISTS bot_1c_sync_log CASCADE;
|
|
DROP TABLE IF EXISTS bot_ticket_messages CASCADE;
|
|
DROP TABLE IF EXISTS bot_ticket_statuses CASCADE;
|
|
DROP TABLE IF EXISTS bot_tickets CASCADE;
|
|
DROP TABLE IF EXISTS bot_messages CASCADE;
|
|
DROP TABLE IF EXISTS bot_conversations CASCADE;
|
|
DROP TABLE IF EXISTS bot_knowledge_base CASCADE;
|
|
DROP TABLE IF EXISTS bot_categories CASCADE;
|
|
DROP TABLE IF EXISTS bot_users CASCADE;
|
|
DROP TABLE IF EXISTS bot_consent_logs CASCADE;
|
|
DROP TABLE IF EXISTS bot_features CASCADE;
|
|
DROP TABLE IF EXISTS bot_settings CASCADE;
|
|
DROP TABLE IF EXISTS bot_notification_subscriptions CASCADE;
|
|
DROP TABLE IF EXISTS bot_notifications CASCADE;
|
|
DROP TABLE IF EXISTS bot_risk_questions CASCADE;
|
|
DROP TABLE IF EXISTS bot_broadcasts CASCADE;
|
|
DROP TABLE IF EXISTS bot_response_templates CASCADE;
|
|
DROP TABLE IF EXISTS file_sync_queue CASCADE;
|
|
|
|
-- 1. BOT SETTINGS
|
|
CREATE TABLE IF NOT EXISTS bot_settings (
|
|
id SERIAL PRIMARY KEY,
|
|
key VARCHAR(255) UNIQUE NOT NULL,
|
|
value TEXT,
|
|
created_at TIMESTAMP DEFAULT now(),
|
|
updated_at TIMESTAMP DEFAULT now()
|
|
);
|
|
|
|
-- 2. BOT FEATURES
|
|
CREATE TABLE IF NOT EXISTS bot_features (
|
|
id SERIAL PRIMARY KEY,
|
|
key VARCHAR(255) UNIQUE NOT NULL,
|
|
name VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
is_enabled BOOLEAN DEFAULT FALSE,
|
|
created_at TIMESTAMP DEFAULT now()
|
|
);
|
|
|
|
-- 3. BOT CATEGORIES (for knowledge base)
|
|
CREATE TABLE IF NOT EXISTS bot_categories (
|
|
id SERIAL PRIMARY KEY,
|
|
name VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
sort_order INTEGER DEFAULT 0,
|
|
created_at TIMESTAMP DEFAULT now()
|
|
);
|
|
|
|
-- 4. BOT KNOWLEDGE BASE (Q&A pairs)
|
|
CREATE TABLE IF NOT EXISTS bot_knowledge_base (
|
|
id SERIAL PRIMARY KEY,
|
|
category_id INTEGER REFERENCES bot_categories(id) ON DELETE SET NULL,
|
|
question TEXT NOT NULL,
|
|
answer TEXT,
|
|
keywords TEXT[],
|
|
is_active BOOLEAN DEFAULT TRUE,
|
|
source_url VARCHAR(500),
|
|
sort_order INTEGER DEFAULT 0,
|
|
created_at TIMESTAMP DEFAULT now(),
|
|
updated_at TIMESTAMP DEFAULT now()
|
|
);
|
|
|
|
-- 5. BOT USERS (MAX messenger users)
|
|
CREATE TABLE IF NOT EXISTS bot_users (
|
|
id BIGINT PRIMARY KEY,
|
|
first_name VARCHAR(255),
|
|
last_name VARCHAR(255),
|
|
patronymic VARCHAR(255),
|
|
username VARCHAR(255),
|
|
phone VARCHAR(50),
|
|
email VARCHAR(255),
|
|
organization VARCHAR(255),
|
|
address TEXT,
|
|
vcf_raw TEXT,
|
|
contact_hash VARCHAR(255),
|
|
phone_verified BOOLEAN DEFAULT FALSE,
|
|
email_verified BOOLEAN DEFAULT FALSE,
|
|
consent_given BOOLEAN DEFAULT FALSE,
|
|
consent_date TIMESTAMP,
|
|
last_interaction TIMESTAMP,
|
|
total_conversations INTEGER DEFAULT 0,
|
|
total_tickets INTEGER DEFAULT 0,
|
|
created_at TIMESTAMP DEFAULT now(),
|
|
updated_at TIMESTAMP DEFAULT now()
|
|
);
|
|
|
|
-- 6. BOT CONVERSATIONS
|
|
CREATE TABLE IF NOT EXISTS bot_conversations (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
user_id BIGINT NOT NULL REFERENCES bot_users(id) ON DELETE CASCADE,
|
|
state VARCHAR(50) DEFAULT 'greeting',
|
|
intent VARCHAR(50),
|
|
inquiry_text TEXT,
|
|
created_at TIMESTAMP DEFAULT now(),
|
|
updated_at TIMESTAMP DEFAULT now()
|
|
);
|
|
|
|
-- 7. BOT MESSAGES
|
|
CREATE TABLE IF NOT EXISTS bot_messages (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
conversation_id BIGINT NOT NULL REFERENCES bot_conversations(id) ON DELETE CASCADE,
|
|
direction VARCHAR(10) NOT NULL,
|
|
text TEXT,
|
|
attachment_json TEXT,
|
|
created_at TIMESTAMP DEFAULT now()
|
|
);
|
|
|
|
-- 8. BOT TICKETS (support tickets)
|
|
CREATE TABLE IF NOT EXISTS bot_tickets (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
user_id BIGINT NOT NULL REFERENCES bot_users(id) ON DELETE CASCADE,
|
|
title VARCHAR(500),
|
|
description TEXT,
|
|
priority VARCHAR(20) DEFAULT 'normal',
|
|
status VARCHAR(20) DEFAULT 'Новая',
|
|
created_by VARCHAR(100) DEFAULT 'bot',
|
|
assigned_to BIGINT,
|
|
created_at TIMESTAMP DEFAULT now(),
|
|
updated_at TIMESTAMP DEFAULT now()
|
|
);
|
|
|
|
-- 9. BOT TICKET MESSAGES
|
|
CREATE TABLE IF NOT EXISTS bot_ticket_messages (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
ticket_id BIGINT NOT NULL REFERENCES bot_tickets(id) ON DELETE CASCADE,
|
|
direction VARCHAR(10) NOT NULL,
|
|
text TEXT,
|
|
created_at TIMESTAMP DEFAULT now()
|
|
);
|
|
|
|
-- 10. BOT TICKET STATUSES (change log)
|
|
CREATE TABLE IF NOT EXISTS bot_ticket_statuses (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
ticket_id BIGINT NOT NULL REFERENCES bot_tickets(id) ON DELETE CASCADE,
|
|
old_status VARCHAR(20),
|
|
new_status VARCHAR(20) NOT NULL,
|
|
changed_by VARCHAR(100),
|
|
created_at TIMESTAMP DEFAULT now()
|
|
);
|
|
|
|
-- ============================================
|
|
-- CLEANUP: Drop unused tables from old bot
|
|
-- ============================================
|
|
DROP TABLE IF EXISTS bot_notification_subscriptions CASCADE;
|
|
DROP TABLE IF EXISTS bot_notifications CASCADE;
|
|
DROP TABLE IF EXISTS bot_risk_questions CASCADE;
|
|
DROP TABLE IF EXISTS bot_broadcasts CASCADE;
|
|
DROP TABLE IF EXISTS file_sync_queue CASCADE;
|
|
DROP TABLE IF EXISTS bot_response_templates CASCADE;
|
|
|
|
-- 11. BOT PROCESSING LOGS (diagnostics & dialogues page)
|
|
CREATE TABLE IF NOT EXISTS bot_processing_logs (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
user_id BIGINT NOT NULL REFERENCES bot_users(id) ON DELETE CASCADE,
|
|
conversation_id BIGINT REFERENCES bot_conversations(id) ON DELETE SET NULL,
|
|
step VARCHAR(50) NOT NULL,
|
|
status VARCHAR(20) DEFAULT 'ok',
|
|
message TEXT,
|
|
detail TEXT,
|
|
created_at TIMESTAMP DEFAULT now()
|
|
);
|
|
|
|
-- ============================================
|
|
-- INDEXES
|
|
-- ============================================
|
|
CREATE INDEX IF NOT EXISTS idx_bot_conversations_user_id ON bot_conversations(user_id);
|
|
CREATE INDEX IF NOT EXISTS idx_bot_conversations_state ON bot_conversations(state);
|
|
CREATE INDEX IF NOT EXISTS idx_bot_messages_conversation_id ON bot_messages(conversation_id);
|
|
CREATE INDEX IF NOT EXISTS idx_bot_tickets_user_id ON bot_tickets(user_id);
|
|
CREATE INDEX IF NOT EXISTS idx_bot_tickets_status ON bot_tickets(status);
|
|
CREATE INDEX IF NOT EXISTS idx_bot_ticket_messages_ticket_id ON bot_ticket_messages(ticket_id);
|
|
CREATE INDEX IF NOT EXISTS idx_bot_knowledge_base_category ON bot_knowledge_base(category_id);
|
|
CREATE INDEX IF NOT EXISTS idx_bot_knowledge_base_active ON bot_knowledge_base(is_active);
|
|
CREATE INDEX IF NOT EXISTS idx_bot_knowledge_base_keywords ON bot_knowledge_base USING gin(keywords);
|