-- CreateTable CREATE TABLE `users` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `email` VARCHAR(191) NULL, `phone` VARCHAR(50) NULL, `password_hash` VARCHAR(255) NOT NULL, `nickname` VARCHAR(100) NULL, `avatar_url` VARCHAR(500) NULL, `role` VARCHAR(50) NOT NULL DEFAULT 'user', `status` VARCHAR(50) NOT NULL DEFAULT 'active', `wechat_openid` VARCHAR(191) NULL, `last_login_at` DATETIME(3) NULL, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updated_at` DATETIME(3) NOT NULL, UNIQUE INDEX `users_email_key`(`email`), UNIQUE INDEX `users_phone_key`(`phone`), UNIQUE INDEX `users_wechat_openid_key`(`wechat_openid`), INDEX `users_role_status_idx`(`role`, `status`), INDEX `users_created_at_idx`(`created_at`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `projects` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `user_id` BIGINT NOT NULL, `title` VARCHAR(255) NULL, `input_mode` VARCHAR(50) NOT NULL, `genre` VARCHAR(100) NULL, `style_code` VARCHAR(100) NULL, `output_type` VARCHAR(50) NULL, `target_episode_count` INTEGER NULL, `episode_duration` INTEGER NULL, `status` VARCHAR(80) NOT NULL DEFAULT 'draft', `copyright_status` VARCHAR(80) NOT NULL DEFAULT 'pending', `payment_status` VARCHAR(80) NOT NULL DEFAULT 'unpaid', `quality_level` VARCHAR(50) NULL, `is_long_series` BOOLEAN NOT NULL DEFAULT false, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updated_at` DATETIME(3) NOT NULL, `completed_at` DATETIME(3) NULL, INDEX `projects_user_id_status_idx`(`user_id`, `status`), INDEX `projects_genre_status_idx`(`genre`, `status`), INDEX `projects_created_at_idx`(`created_at`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `novel_sources` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `project_id` BIGINT NOT NULL, `source_type` VARCHAR(50) NOT NULL, `title` VARCHAR(255) NULL, `author_name` VARCHAR(100) NULL, `raw_asset_id` BIGINT NULL, `raw_text` LONGTEXT NULL, `clean_text` LONGTEXT NULL, `word_count` INTEGER NULL, `chapter_count` INTEGER NULL, `parse_status` VARCHAR(50) NOT NULL DEFAULT 'pending', `parse_report` JSON NULL, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), INDEX `novel_sources_project_id_idx`(`project_id`), INDEX `novel_sources_parse_status_idx`(`parse_status`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `novel_chapters` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `project_id` BIGINT NOT NULL, `novel_source_id` BIGINT NULL, `chapter_no` INTEGER NOT NULL, `title` VARCHAR(255) NULL, `content` LONGTEXT NOT NULL, `summary` TEXT NULL, `visual_summary` TEXT NULL, `word_count` INTEGER NULL, `status` VARCHAR(50) NOT NULL DEFAULT 'draft', `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), INDEX `novel_chapters_project_id_chapter_no_idx`(`project_id`, `chapter_no`), INDEX `novel_chapters_project_id_status_idx`(`project_id`, `status`), UNIQUE INDEX `novel_chapters_novel_source_id_chapter_no_key`(`novel_source_id`, `chapter_no`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `copyright_records` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `project_id` BIGINT NOT NULL, `user_id` BIGINT NOT NULL, `authorization_type` VARCHAR(50) NOT NULL, `statement_text` TEXT NOT NULL, `ip` VARCHAR(80) NULL, `user_agent` TEXT NULL, `confirmed_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), INDEX `copyright_records_project_id_idx`(`project_id`), INDEX `copyright_records_user_id_idx`(`user_id`), INDEX `copyright_records_authorization_type_idx`(`authorization_type`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `story_bibles` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `project_id` BIGINT NOT NULL, `title` VARCHAR(255) NULL, `logline` TEXT NULL, `main_plot` TEXT NULL, `core_conflict` TEXT NULL, `selling_points` TEXT NULL, `tone` VARCHAR(100) NULL, `world_summary` TEXT NULL, `ending_direction` TEXT NULL, `taboo_rules` TEXT NULL, `version` INTEGER NOT NULL DEFAULT 1, `status` VARCHAR(50) NOT NULL DEFAULT 'draft', `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updated_at` DATETIME(3) NOT NULL, INDEX `story_bibles_project_id_status_idx`(`project_id`, `status`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `world_bibles` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `project_id` BIGINT NOT NULL, `world_type` VARCHAR(100) NULL, `setting_text` TEXT NULL, `rules_text` TEXT NULL, `power_system` TEXT NULL, `social_structure` TEXT NULL, `time_period` TEXT NULL, `visual_rules` TEXT NULL, `forbidden_rules` TEXT NULL, `status` VARCHAR(50) NOT NULL DEFAULT 'draft', `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), INDEX `world_bibles_project_id_status_idx`(`project_id`, `status`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `characters` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `project_id` BIGINT NOT NULL, `name` VARCHAR(100) NOT NULL, `alias_names` JSON NULL, `role_type` VARCHAR(50) NOT NULL, `gender_label` VARCHAR(50) NULL, `age_group` VARCHAR(50) NULL, `identity_desc` TEXT NULL, `appearance_desc` TEXT NULL, `face_desc` TEXT NULL, `hair_desc` TEXT NULL, `eye_desc` TEXT NULL, `body_desc` TEXT NULL, `costume_rules` TEXT NULL, `special_props` TEXT NULL, `personality_desc` TEXT NULL, `speech_style` TEXT NULL, `relationship_desc` TEXT NULL, `character_arc` TEXT NULL, `negative_rules` TEXT NULL, `anchor_asset_id` BIGINT NULL, `importance_level` INTEGER NOT NULL DEFAULT 0, `status` VARCHAR(50) NOT NULL DEFAULT 'draft', `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updated_at` DATETIME(3) NOT NULL, INDEX `characters_project_id_role_type_idx`(`project_id`, `role_type`), INDEX `characters_project_id_status_idx`(`project_id`, `status`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `character_images` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `project_id` BIGINT NOT NULL, `character_id` BIGINT NOT NULL, `asset_id` BIGINT NULL, `image_type` VARCHAR(50) NOT NULL, `prompt_text` TEXT NULL, `negative_prompt` TEXT NULL, `is_anchor` BOOLEAN NOT NULL DEFAULT false, `quality_score` DECIMAL(5, 2) NULL, `status` VARCHAR(50) NOT NULL DEFAULT 'pending', `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), INDEX `character_images_project_id_idx`(`project_id`), INDEX `character_images_character_id_image_type_idx`(`character_id`, `image_type`), INDEX `character_images_character_id_is_anchor_idx`(`character_id`, `is_anchor`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `character_memories` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `project_id` BIGINT NOT NULL, `character_id` BIGINT NOT NULL, `episode_id` BIGINT NULL, `memory_type` VARCHAR(50) NOT NULL, `content` TEXT NOT NULL, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), INDEX `character_memories_project_id_character_id_idx`(`project_id`, `character_id`), INDEX `character_memories_project_id_episode_id_idx`(`project_id`, `episode_id`), INDEX `character_memories_memory_type_idx`(`memory_type`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `episodes` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `project_id` BIGINT NOT NULL, `episode_no` INTEGER NOT NULL, `source_chapter_ids` JSON NULL, `title` VARCHAR(255) NULL, `summary` TEXT NULL, `opening_hook` TEXT NULL, `middle_conflict` TEXT NULL, `ending_hook` TEXT NULL, `target_duration` INTEGER NULL, `status` VARCHAR(50) NOT NULL DEFAULT 'draft', `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updated_at` DATETIME(3) NOT NULL, INDEX `episodes_project_id_status_idx`(`project_id`, `status`), UNIQUE INDEX `episodes_project_id_episode_no_key`(`project_id`, `episode_no`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `episode_scripts` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `project_id` BIGINT NOT NULL, `episode_id` BIGINT NOT NULL, `script_text` LONGTEXT NULL, `narration_text` LONGTEXT NULL, `dialogue_json` JSON NULL, `version` INTEGER NOT NULL DEFAULT 1, `status` VARCHAR(50) NOT NULL DEFAULT 'draft', `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updated_at` DATETIME(3) NOT NULL, INDEX `episode_scripts_project_id_idx`(`project_id`), INDEX `episode_scripts_episode_id_version_idx`(`episode_id`, `version`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `storyboard_shots` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `project_id` BIGINT NOT NULL, `episode_id` BIGINT NOT NULL, `shot_no` INTEGER NOT NULL, `scene_name` VARCHAR(255) NULL, `location_desc` TEXT NULL, `characters_json` JSON NULL, `visual_desc` TEXT NULL, `action_desc` TEXT NULL, `dialogue_text` TEXT NULL, `narration_text` TEXT NULL, `camera_motion` VARCHAR(100) NULL, `effect_type` VARCHAR(100) NULL, `duration` DECIMAL(6, 2) NULL, `prompt_text` TEXT NULL, `negative_prompt` TEXT NULL, `status` VARCHAR(50) NOT NULL DEFAULT 'draft', `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updated_at` DATETIME(3) NOT NULL, INDEX `storyboard_shots_project_id_episode_id_shot_no_idx`(`project_id`, `episode_id`, `shot_no`), INDEX `storyboard_shots_project_id_status_idx`(`project_id`, `status`), UNIQUE INDEX `storyboard_shots_episode_id_shot_no_key`(`episode_id`, `shot_no`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `shot_images` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `project_id` BIGINT NOT NULL, `episode_id` BIGINT NULL, `shot_id` BIGINT NOT NULL, `asset_id` BIGINT NULL, `image_type` VARCHAR(50) NOT NULL DEFAULT 'preview', `prompt_text` TEXT NULL, `negative_prompt` TEXT NULL, `quality_score` DECIMAL(5, 2) NULL, `status` VARCHAR(50) NOT NULL DEFAULT 'pending', `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), INDEX `shot_images_project_id_episode_id_idx`(`project_id`, `episode_id`), INDEX `shot_images_shot_id_image_type_idx`(`shot_id`, `image_type`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `plot_memories` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `project_id` BIGINT NOT NULL, `episode_id` BIGINT NULL, `chapter_id` BIGINT NULL, `memory_type` VARCHAR(50) NOT NULL, `content` TEXT NOT NULL, `importance_level` INTEGER NOT NULL DEFAULT 0, `status` VARCHAR(50) NOT NULL DEFAULT 'active', `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), INDEX `plot_memories_project_id_episode_id_idx`(`project_id`, `episode_id`), INDEX `plot_memories_project_id_memory_type_idx`(`project_id`, `memory_type`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `plot_threads` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `project_id` BIGINT NOT NULL, `thread_name` VARCHAR(255) NOT NULL, `thread_type` VARCHAR(80) NOT NULL, `description` TEXT NULL, `start_episode_no` INTEGER NULL, `expected_resolve_episode_no` INTEGER NULL, `resolved_episode_no` INTEGER NULL, `status` VARCHAR(50) NOT NULL DEFAULT 'open', `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updated_at` DATETIME(3) NOT NULL, INDEX `plot_threads_project_id_status_idx`(`project_id`, `status`), INDEX `plot_threads_project_id_thread_type_idx`(`project_id`, `thread_type`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `continuity_checks` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `project_id` BIGINT NOT NULL, `episode_id` BIGINT NULL, `check_type` VARCHAR(80) NOT NULL, `result_status` VARCHAR(50) NOT NULL, `issue_text` TEXT NULL, `suggestion_text` TEXT NULL, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), INDEX `continuity_checks_project_id_episode_id_idx`(`project_id`, `episode_id`), INDEX `continuity_checks_result_status_idx`(`result_status`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `assets` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `user_id` BIGINT NULL, `project_id` BIGINT NULL, `asset_type` VARCHAR(50) NOT NULL, `file_path` VARCHAR(500) NOT NULL, `file_url` VARCHAR(500) NULL, `mime_type` VARCHAR(100) NULL, `width` INTEGER NULL, `height` INTEGER NULL, `duration` DECIMAL(10, 2) NULL, `size` BIGINT NULL, `hash` VARCHAR(128) NULL, `visibility` VARCHAR(30) NOT NULL DEFAULT 'private', `status` VARCHAR(50) NOT NULL DEFAULT 'active', `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), INDEX `assets_project_id_asset_type_idx`(`project_id`, `asset_type`), INDEX `assets_user_id_asset_type_idx`(`user_id`, `asset_type`), INDEX `assets_hash_idx`(`hash`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `render_tasks` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `project_id` BIGINT NOT NULL, `episode_id` BIGINT NULL, `shot_id` BIGINT NULL, `task_type` VARCHAR(80) NOT NULL, `provider_id` BIGINT NULL, `status` VARCHAR(50) NOT NULL DEFAULT 'pending', `input_json` JSON NULL, `input_hash` VARCHAR(128) NULL, `idempotency_key` VARCHAR(191) NULL, `output_asset_id` BIGINT NULL, `provider_request_id` VARCHAR(255) NULL, `retry_count` INTEGER NOT NULL DEFAULT 0, `max_retry` INTEGER NOT NULL DEFAULT 0, `cost_estimate` DECIMAL(12, 4) NULL, `cost_actual` DECIMAL(12, 4) NULL, `error_code` VARCHAR(100) NULL, `error_message` TEXT NULL, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `started_at` DATETIME(3) NULL, `finished_at` DATETIME(3) NULL, UNIQUE INDEX `render_tasks_idempotency_key_key`(`idempotency_key`), INDEX `render_tasks_project_id_status_idx`(`project_id`, `status`), INDEX `render_tasks_task_type_status_idx`(`task_type`, `status`), INDEX `render_tasks_project_id_episode_id_idx`(`project_id`, `episode_id`), INDEX `render_tasks_input_hash_idx`(`input_hash`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `provider_configs` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `provider_type` VARCHAR(80) NOT NULL, `provider_code` VARCHAR(100) NOT NULL, `display_name` VARCHAR(100) NULL, `mode` VARCHAR(50) NOT NULL DEFAULT 'mock', `model_name` VARCHAR(100) NULL, `config_json` JSON NULL, `fallback_provider_id` BIGINT NULL, `is_enabled` BOOLEAN NOT NULL DEFAULT true, `priority` INTEGER NOT NULL DEFAULT 0, `rate_limit_json` JSON NULL, `cost_rule_json` JSON NULL, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updated_at` DATETIME(3) NOT NULL, INDEX `provider_configs_provider_type_is_enabled_idx`(`provider_type`, `is_enabled`), UNIQUE INDEX `provider_configs_provider_type_provider_code_key`(`provider_type`, `provider_code`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `provider_logs` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `provider_id` BIGINT NULL, `task_id` BIGINT NULL, `project_id` BIGINT NULL, `provider_type` VARCHAR(80) NOT NULL, `provider_code` VARCHAR(100) NULL, `model_name` VARCHAR(100) NULL, `request_json` JSON NULL, `response_json` JSON NULL, `input_size` INTEGER NULL, `output_size` INTEGER NULL, `cost_estimate` DECIMAL(12, 4) NULL, `cost_actual` DECIMAL(12, 4) NULL, `status` VARCHAR(50) NOT NULL DEFAULT 'success', `error_code` VARCHAR(100) NULL, `error_message` TEXT NULL, `started_at` DATETIME(3) NULL, `finished_at` DATETIME(3) NULL, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), INDEX `provider_logs_provider_type_status_idx`(`provider_type`, `status`), INDEX `provider_logs_project_id_idx`(`project_id`), INDEX `provider_logs_task_id_idx`(`task_id`), INDEX `provider_logs_created_at_idx`(`created_at`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `orders` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `user_id` BIGINT NOT NULL, `project_id` BIGINT NULL, `order_no` VARCHAR(100) NOT NULL, `package_code` VARCHAR(100) NULL, `amount` DECIMAL(12, 2) NOT NULL DEFAULT 0, `currency` VARCHAR(20) NOT NULL DEFAULT 'CNY', `payment_method` VARCHAR(50) NULL, `payment_status` VARCHAR(50) NOT NULL DEFAULT 'pending', `paid_at` DATETIME(3) NULL, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updated_at` DATETIME(3) NOT NULL, UNIQUE INDEX `orders_order_no_key`(`order_no`), INDEX `orders_user_id_payment_status_idx`(`user_id`, `payment_status`), INDEX `orders_project_id_idx`(`project_id`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `quota_accounts` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `user_id` BIGINT NOT NULL, `total_quota` DECIMAL(12, 2) NOT NULL DEFAULT 0, `available_quota` DECIMAL(12, 2) NOT NULL DEFAULT 0, `frozen_quota` DECIMAL(12, 2) NOT NULL DEFAULT 0, `used_quota` DECIMAL(12, 2) NOT NULL DEFAULT 0, `status` VARCHAR(50) NOT NULL DEFAULT 'active', `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updated_at` DATETIME(3) NOT NULL, UNIQUE INDEX `quota_accounts_user_id_key`(`user_id`), INDEX `quota_accounts_status_idx`(`status`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `quota_logs` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `user_id` BIGINT NOT NULL, `project_id` BIGINT NULL, `task_id` BIGINT NULL, `change_type` VARCHAR(50) NOT NULL, `amount` DECIMAL(12, 2) NOT NULL, `balance_after` DECIMAL(12, 2) NULL, `reason` VARCHAR(255) NULL, `metadata_json` JSON NULL, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), INDEX `quota_logs_user_id_created_at_idx`(`user_id`, `created_at`), INDEX `quota_logs_project_id_idx`(`project_id`), INDEX `quota_logs_task_id_idx`(`task_id`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `revision_requests` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `project_id` BIGINT NOT NULL, `user_id` BIGINT NOT NULL, `revision_type` VARCHAR(50) NOT NULL, `target_type` VARCHAR(80) NULL, `target_id` BIGINT NULL, `description` TEXT NOT NULL, `status` VARCHAR(50) NOT NULL DEFAULT 'pending', `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updated_at` DATETIME(3) NOT NULL, INDEX `revision_requests_project_id_status_idx`(`project_id`, `status`), INDEX `revision_requests_user_id_status_idx`(`user_id`, `status`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `content_reviews` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `project_id` BIGINT NULL, `user_id` BIGINT NULL, `target_type` VARCHAR(80) NOT NULL, `target_id` BIGINT NULL, `review_type` VARCHAR(80) NOT NULL, `result_status` VARCHAR(50) NOT NULL DEFAULT 'pending', `risk_level` VARCHAR(50) NULL, `issue_text` TEXT NULL, `suggestion_text` TEXT NULL, `reviewer_id` BIGINT NULL, `reviewed_at` DATETIME(3) NULL, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updated_at` DATETIME(3) NOT NULL, INDEX `content_reviews_project_id_result_status_idx`(`project_id`, `result_status`), INDEX `content_reviews_target_type_target_id_idx`(`target_type`, `target_id`), INDEX `content_reviews_review_type_result_status_idx`(`review_type`, `result_status`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `case_showcases` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `project_id` BIGINT NOT NULL, `user_id` BIGINT NULL, `title` VARCHAR(255) NOT NULL, `cover_asset_id` BIGINT NULL, `video_asset_id` BIGINT NULL, `authorization_status` VARCHAR(50) NOT NULL DEFAULT 'pending', `visibility` VARCHAR(30) NOT NULL DEFAULT 'private', `sort_order` INTEGER NOT NULL DEFAULT 0, `published_at` DATETIME(3) NULL, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updated_at` DATETIME(3) NOT NULL, INDEX `case_showcases_visibility_sort_order_idx`(`visibility`, `sort_order`), INDEX `case_showcases_project_id_idx`(`project_id`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `analytics_events` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `project_id` BIGINT NOT NULL, `episode_id` BIGINT NULL, `event_type` VARCHAR(80) NOT NULL, `platform` VARCHAR(80) NULL, `metric_json` JSON NULL, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), INDEX `analytics_events_project_id_idx`(`project_id`), INDEX `analytics_events_episode_id_idx`(`episode_id`), INDEX `analytics_events_event_type_created_at_idx`(`event_type`, `created_at`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `system_configs` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `config_key` VARCHAR(191) NOT NULL, `config_value` JSON NULL, `description` TEXT NULL, `is_public` BOOLEAN NOT NULL DEFAULT false, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updated_at` DATETIME(3) NOT NULL, UNIQUE INDEX `system_configs_config_key_key`(`config_key`), INDEX `system_configs_is_public_idx`(`is_public`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `operation_logs` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `user_id` BIGINT NULL, `operator_role` VARCHAR(50) NULL, `action` VARCHAR(100) NOT NULL, `target_type` VARCHAR(80) NULL, `target_id` BIGINT NULL, `ip` VARCHAR(80) NULL, `user_agent` TEXT NULL, `metadata_json` JSON NULL, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), INDEX `operation_logs_user_id_created_at_idx`(`user_id`, `created_at`), INDEX `operation_logs_target_type_target_id_idx`(`target_type`, `target_id`), INDEX `operation_logs_action_created_at_idx`(`action`, `created_at`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;