Files
1818web-hoduan/V2__add_ai_task_and_points_schema.sql
2025-11-14 17:41:15 +08:00

118 lines
7.1 KiB
SQL
Raw 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.

-- =================================================================
-- 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脚本结束
-- =================================================================