-- IM 工作台 AI 建表 SQL -- Run on the shared meeting_im database. CREATE TABLE IF NOT EXISTS wb_ai_capability_config ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, tenant_id BIGINT UNSIGNED NOT NULL DEFAULT 0, tenant_code VARCHAR(64) NOT NULL DEFAULT '', feature VARCHAR(64) NOT NULL, enabled TINYINT(1) NOT NULL DEFAULT 0, model VARCHAR(64) NOT NULL DEFAULT 'deepseek-flash', daily_limit INT NOT NULL DEFAULT 0, concurrency_limit INT NOT NULL DEFAULT 1, max_input_chars INT NOT NULL DEFAULT 0, max_file_size_mb INT NOT NULL DEFAULT 0, config_json JSON NULL, created_at DATETIME(3) NOT NULL, updated_at DATETIME(3) NOT NULL, PRIMARY KEY (id), UNIQUE KEY uk_tenant_feature (tenant_id, feature) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; CREATE TABLE IF NOT EXISTS wb_ai_task ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, task_id VARCHAR(64) NOT NULL, tenant_id BIGINT UNSIGNED NOT NULL, tenant_code VARCHAR(64) NOT NULL, user_id VARCHAR(64) NOT NULL, feature VARCHAR(64) NOT NULL, status VARCHAR(32) NOT NULL, progress INT NOT NULL DEFAULT 0, source_type VARCHAR(32) NOT NULL DEFAULT '', source_ref_id VARCHAR(128) NOT NULL DEFAULT '', input_hash VARCHAR(128) NOT NULL DEFAULT '', input_snapshot JSON NULL, prompt_version VARCHAR(64) NOT NULL DEFAULT '', model VARCHAR(64) NOT NULL DEFAULT '', result_ref_id VARCHAR(64) NOT NULL DEFAULT '', result_json JSON NULL, error_reason VARCHAR(64) NOT NULL DEFAULT '', error_message VARCHAR(255) NOT NULL DEFAULT '', retry_count INT NOT NULL DEFAULT 0, started_at DATETIME(3) NULL, finished_at DATETIME(3) NULL, created_at DATETIME(3) NOT NULL, updated_at DATETIME(3) NOT NULL, PRIMARY KEY (id), UNIQUE KEY uk_task_id (task_id), KEY idx_user_feature_time (tenant_id, user_id, feature, created_at), KEY idx_status_time (status, created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; CREATE TABLE IF NOT EXISTS wb_ai_task_step ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, task_id VARCHAR(64) NOT NULL, step VARCHAR(64) NOT NULL, title VARCHAR(128) NOT NULL, status VARCHAR(32) NOT NULL, progress INT NOT NULL DEFAULT 0, error_reason VARCHAR(64) NOT NULL DEFAULT '', started_at DATETIME(3) NULL, finished_at DATETIME(3) NULL, created_at DATETIME(3) NOT NULL, updated_at DATETIME(3) NOT NULL, PRIMARY KEY (id), UNIQUE KEY uk_task_step (task_id, step) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; CREATE TABLE IF NOT EXISTS wb_ai_record ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, record_id VARCHAR(64) NOT NULL, tenant_id BIGINT UNSIGNED NOT NULL, tenant_code VARCHAR(64) NOT NULL, user_id VARCHAR(64) NOT NULL, record_type VARCHAR(64) NOT NULL, title VARCHAR(128) NOT NULL, summary VARCHAR(512) NOT NULL DEFAULT '', status VARCHAR(32) NOT NULL, detail_id VARCHAR(64) NOT NULL DEFAULT '', task_id VARCHAR(64) NOT NULL DEFAULT '', created_at DATETIME(3) NOT NULL, updated_at DATETIME(3) NOT NULL, deleted_at DATETIME(3) NULL, PRIMARY KEY (id), UNIQUE KEY uk_record_id (record_id), KEY idx_user_type_time (tenant_id, user_id, record_type, created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; CREATE TABLE IF NOT EXISTS wb_ai_document ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, record_id VARCHAR(64) NOT NULL, tenant_id BIGINT UNSIGNED NOT NULL, user_id VARCHAR(64) NOT NULL, document_type VARCHAR(64) NOT NULL, title VARCHAR(128) NOT NULL, content_markdown MEDIUMTEXT NOT NULL, content_plain MEDIUMTEXT NULL, sections_json JSON NULL, source_excerpt VARCHAR(1024) NOT NULL DEFAULT '', prompt_version VARCHAR(64) NOT NULL DEFAULT '', model VARCHAR(64) NOT NULL DEFAULT '', created_at DATETIME(3) NOT NULL, updated_at DATETIME(3) NOT NULL, PRIMARY KEY (id), UNIQUE KEY uk_record_id (record_id), KEY idx_tenant_user_time (tenant_id, user_id, created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; CREATE TABLE IF NOT EXISTS wb_ai_table_analysis ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, record_id VARCHAR(64) NOT NULL, tenant_id BIGINT UNSIGNED NOT NULL, user_id VARCHAR(64) NOT NULL, file_id VARCHAR(128) NOT NULL, file_name VARCHAR(255) NOT NULL, file_type VARCHAR(16) NOT NULL, file_size BIGINT UNSIGNED NOT NULL DEFAULT 0, topic VARCHAR(128) NOT NULL, metrics_json JSON NULL, preview_json JSON NULL, alerts_json JSON NULL, interpretation MEDIUMTEXT NULL, export_file_id VARCHAR(128) NOT NULL DEFAULT '', prompt_version VARCHAR(64) NOT NULL DEFAULT '', model VARCHAR(64) NOT NULL DEFAULT '', created_at DATETIME(3) NOT NULL, updated_at DATETIME(3) NOT NULL, PRIMARY KEY (id), UNIQUE KEY uk_record_id (record_id), KEY idx_file_id (tenant_id, file_id), KEY idx_tenant_user_time (tenant_id, user_id, created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; CREATE TABLE IF NOT EXISTS wb_ai_meeting_summary ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, summary_id VARCHAR(64) NOT NULL, tenant_id BIGINT UNSIGNED NOT NULL, tenant_code VARCHAR(64) NOT NULL, meeting_id VARCHAR(128) NOT NULL, user_id VARCHAR(64) NOT NULL, task_id VARCHAR(64) NOT NULL DEFAULT '', conclusions_json JSON NULL, decisions_json JSON NULL, action_items_json JSON NULL, source_file_ids_json JSON NULL, prompt_version VARCHAR(64) NOT NULL DEFAULT '', model VARCHAR(64) NOT NULL DEFAULT '', edited_by VARCHAR(64) NOT NULL DEFAULT '', edited_at DATETIME(3) NULL, version INT NOT NULL DEFAULT 1, created_at DATETIME(3) NOT NULL, updated_at DATETIME(3) NOT NULL, PRIMARY KEY (id), UNIQUE KEY uk_summary_id (summary_id), UNIQUE KEY uk_tenant_meeting (tenant_id, meeting_id), KEY idx_user_time (tenant_id, user_id, updated_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; CREATE TABLE IF NOT EXISTS wb_ai_usage_log ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, tenant_id BIGINT UNSIGNED NOT NULL, tenant_code VARCHAR(64) NOT NULL, user_id VARCHAR(64) NOT NULL, feature VARCHAR(64) NOT NULL, task_id VARCHAR(64) NOT NULL DEFAULT '', provider VARCHAR(32) NOT NULL, model VARCHAR(64) NOT NULL, provider_request_id VARCHAR(128) NOT NULL DEFAULT '', prompt_tokens INT NOT NULL DEFAULT 0, completion_tokens INT NOT NULL DEFAULT 0, total_tokens INT NOT NULL DEFAULT 0, latency_ms INT NOT NULL DEFAULT 0, status VARCHAR(32) NOT NULL, error_reason VARCHAR(64) NOT NULL DEFAULT '', input_hash VARCHAR(128) NOT NULL DEFAULT '', output_hash VARCHAR(128) NOT NULL DEFAULT '', created_at DATETIME(3) NOT NULL, PRIMARY KEY (id), KEY idx_user_feature_day (tenant_id, user_id, feature, created_at), KEY idx_provider_time (provider, model, created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; CREATE TABLE IF NOT EXISTS wb_ai_idempotency_record ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, tenant_id BIGINT UNSIGNED NOT NULL, user_id VARCHAR(64) NOT NULL, idempotency_key VARCHAR(128) NOT NULL, request_hash VARCHAR(128) NOT NULL, response_code INT NOT NULL DEFAULT 0, response_body JSON NULL, status VARCHAR(32) NOT NULL, created_at DATETIME(3) NOT NULL, updated_at DATETIME(3) NOT NULL, PRIMARY KEY (id), UNIQUE KEY uk_idempotency (tenant_id, user_id, idempotency_key) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; CREATE TABLE IF NOT EXISTS wb_ai_prompt_template ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, template_key VARCHAR(64) NOT NULL, version VARCHAR(64) NOT NULL, provider VARCHAR(32) NOT NULL DEFAULT 'deepseek', model VARCHAR(64) NOT NULL DEFAULT 'deepseek-flash', system_prompt MEDIUMTEXT NOT NULL, user_prompt_template MEDIUMTEXT NOT NULL, response_schema JSON NULL, enabled TINYINT(1) NOT NULL DEFAULT 1, created_at DATETIME(3) NOT NULL, updated_at DATETIME(3) NOT NULL, PRIMARY KEY (id), UNIQUE KEY uk_template_version (template_key, version), KEY idx_template_enabled (template_key, enabled) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; INSERT INTO wb_ai_capability_config (tenant_id, tenant_code, feature, enabled, model, daily_limit, concurrency_limit, max_input_chars, max_file_size_mb, config_json, created_at, updated_at) VALUES (0, '', 'smart_document', 0, 'deepseek-flash', 20, 1, 1000, 0, JSON_OBJECT('entry_title', '智能文档'), NOW(3), NOW(3)), (0, '', 'smart_table', 0, 'deepseek-v4-pro', 10, 1, 100, 20, JSON_OBJECT('entry_title', '智能表格', 'allowed_file_types', JSON_ARRAY('xlsx', 'xls', 'csv')), NOW(3), NOW(3)), (0, '', 'text_polish', 0, 'deepseek-flash', 50, 3, 300, 0, JSON_OBJECT('entry_title', 'AI美文'), NOW(3), NOW(3)), (0, '', 'daily_report_polish', 0, 'deepseek-flash', 50, 3, 300, 0, JSON_OBJECT('entry_title', 'AI美文'), NOW(3), NOW(3)), (0, '', 'monthly_report_polish', 0, 'deepseek-flash', 30, 3, 1000, 0, JSON_OBJECT('entry_title', 'AI美文'), NOW(3), NOW(3)), (0, '', 'meeting_summary', 0, 'deepseek-v4-pro', 10, 1, 0, 0, JSON_OBJECT('entry_title', 'AI总结'), NOW(3), NOW(3)) ON DUPLICATE KEY UPDATE model = VALUES(model), daily_limit = VALUES(daily_limit), concurrency_limit = VALUES(concurrency_limit), max_input_chars = VALUES(max_input_chars), max_file_size_mb = VALUES(max_file_size_mb), config_json = VALUES(config_json), updated_at = NOW(3);