-- =================================================================
-- V2: AI任务与积分消费系统 数据库结构定义
-- 时间: 2025-10-19
-- 描述: 为集成第三方AI模型和积分商业化，新增相关表结构。
-- 此脚本为增量更新，不修改现有表，保证向前兼容。
-- =================================================================

-- 1. AI生成任务表 (核心)
-- 作用: 持久化用户的每一次AI生成请求，追踪其完整的生命周期。
-- =================================================================
CREATE TABLE IF NOT EXISTS `ai_task` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `task_no` varchar(64) UNIQUE NOT NULL COMMENT '任务编号 (系统生成的唯一ID)',
  `user_id` bigint NOT NULL COMMENT '关联的用户ID',
  `model_name` varchar(64) NOT NULL COMMENT '请求的模型名称 (如: sora_image)',
  `task_type` varchar(32) NOT NULL COMMENT '任务类型 (image/video)',
  `prompt` text NOT NULL COMMENT '用户提交的提示词',
  `status` varchar(32) NOT NULL DEFAULT 'created' COMMENT '任务状态 (created, queued, processing, completed, failed, cancelled)',
  `progress` int DEFAULT 0 COMMENT '生成进度百分比 (0-100)',
  `progress_message` varchar(255) DEFAULT NULL COMMENT '当前进度文本描述',
  `points_frozen` int NOT NULL COMMENT '本次任务冻结的积分',
  `points_consumed` int DEFAULT 0 COMMENT '任务成功后实际消耗的积分',
  `result_url` varchar(512) DEFAULT NULL COMMENT '生成结果的URL',
  `error_message` text DEFAULT NULL COMMENT '任务失败时的错误信息',
  `queue_time` datetime DEFAULT NULL COMMENT '进入队列的时间',
  `start_time` datetime DEFAULT NULL COMMENT '开始处理的时间',
  `complete_time` datetime DEFAULT NULL COMMENT '任务完成或失败的时间',
  `expire_time` datetime DEFAULT NULL COMMENT '结果URL的过期时间 (根据第三方API策略设定)',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '任务创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
  `is_deleted` tinyint(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除标识',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_task_no` (`task_no`),
  KEY `idx_user_status` (`user_id`, `status`),
  KEY `idx_status_time` (`status`, `create_time`),
  FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AI生成任务表';

-- =================================================================
-- 2. 积分消费配置表
-- 作用: 管理员可在此配置不同AI模型的积分价格，实现动态调价。
-- =================================================================
CREATE TABLE IF NOT EXISTS `points_config` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `model_name` varchar(64) UNIQUE NOT NULL COMMENT '模型名称 (如: sora_image)',
  `points_cost` int NOT NULL COMMENT '调用一次消耗的积分',
  `description` varchar(255) DEFAULT NULL COMMENT '模型描述',
  `is_enabled` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否启用 (0:禁用, 1:启用)',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='积分消费配置表';

-- =================================================================
-- 3. 积分消费记录表
-- 作用: 提供完整的积分变动审计日志，便于追踪和对账。
-- =================================================================
CREATE TABLE IF NOT EXISTS `points_consumption_log` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_id` bigint NOT NULL COMMENT '关联的用户ID',
  `task_no` varchar(64) DEFAULT NULL COMMENT '关联的AI任务编号',
  `change_type` varchar(32) NOT NULL COMMENT '变动类型 (consume:消费, refund:退款, admin_adjust:管理员调整)',
  `change_amount` int NOT NULL COMMENT '变动积分数量 (正数表示增加，负数表示减少)',
  `balance_before` int NOT NULL COMMENT '变动前积分余额',
  `balance_after` int NOT NULL COMMENT '变动后积分余额',
  `description` varchar(255) DEFAULT NULL COMMENT '变动描述',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',
  PRIMARY KEY (`id`),
  KEY `idx_user_id_type` (`user_id`, `change_type`),
  FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='积分消费记录表';

-- =================================================================
-- 4. 系统配置表
-- 作用: 存储可由管理员在后台动态调整的系统级参数。
-- =================================================================
CREATE TABLE IF NOT EXISTS `system_config` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `config_key` varchar(64) UNIQUE NOT NULL COMMENT '配置键 (如: ai.queue.max_concurrent)',
  `config_value` varchar(512) NOT NULL COMMENT '配置值',
  `description` varchar(255) DEFAULT NULL COMMENT '配置说明',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统配置表';

-- =================================================================
-- 初始化默认配置数据
-- 作用: 插入一些基础配置，保证系统首次启动时功能正常。
-- =================================================================

-- 初始化系统配置
INSERT INTO `system_config` (`config_key`, `config_value`, `description`) VALUES
    ('ai.queue.max_concurrent', '50', '每个AI模型的最大并发处理数'),
    ('ai.queue.max_user_concurrent', '3', '单个用户的最大并发任务数'),
    ('ai.task.timeout_minutes', '10', '任务处理超时时间（分钟）'),
    ('ai.task.max_retry', '2', '任务失败后的最大自动重试次数')
ON DUPLICATE KEY UPDATE `config_value` = VALUES(`config_value`);

-- 初始化图片模型定价
INSERT INTO `points_config` (`model_name`, `points_cost`, `description`, `is_enabled`) VALUES
    ('sora_image', 11, 'Sora高质量图片生成', 1),
    ('gpt-4o-image', 11, 'GPT-4o图片生成', 1)
ON DUPLICATE KEY UPDATE `points_cost` = VALUES(`points_cost`);

-- 初始化视频模型定价
INSERT INTO `points_config` (`model_name`, `points_cost`, `description`, `is_enabled`) VALUES
    ('sora_video2', 160, 'Sora视频生成 (竖屏10秒)', 1),
    ('sora_video2-landscape', 160, 'Sora视频生成 (横屏10秒)', 1),
    ('sora_video2-15s', 260, 'Sora视频生成 (竖屏15秒)', 1),
    ('sora_video2-landscape-15s', 260, 'Sora视频生成 (横屏15秒)', 1),
    ('sora-2-pro-all', 420, 'Sora Pro高清视频', 1)
ON DUPLICATE KEY UPDATE `points_cost` = VALUES(`points_cost`);

-- =================================================================
-- V2脚本结束
-- =================================================================
