# 积分与AI任务系统设计文档

## 1. 项目概述

### 1.1 背景与目标

为集成第三方AI模型（如Sora Image/Video），并建立一套商业化积分体系，本项目旨在设计并开发一个稳定、可扩展、安全的积分消费与AI任务管理系统。

**核心目标:**

- **商业化闭环:** 建立用户充值、积分兑换、模型消费的完整商业流程。
- **任务持久化:** 保证用户提交的AI生成任务不因刷新或关闭页面而丢失，可随时查看历史记录。
- **高效队列管理:** 解决API并发限制问题，通过队列机制保证服务稳定性和用户体验。
- **实时反馈:** 为用户提供任务的实时进度更新，提升交互体验。
- **安全可靠:** 保证积分和交易数据的安全，防止恶意攻击和滥用。

### 1.2 设计原则

- **高内聚低耦合:** 各模块（积分、任务、队列、API调用）职责清晰，易于维护和扩展。
- **异步化处理:** 核心AI任务采用异步处理，避免长时间阻塞，提高系统吞吐量。
- **状态驱动:** 任务和积分为状态驱动，保证数据一致性和流程可追溯性。
- **用户为中心:** 优化从提交任务到获取结果的全流程体验。
- **安全第一:** 在设计、开发、部署各环节贯彻安全思想。

---

## 2. 系统架构

系统采用微服务化的思想，将核心功能模块化，通过API和消息队列进行通信。

```mermaid
graph TD
    subgraph 用户端 (Web/App)
        A[用户界面]
    end

    subgraph 服务端 (Backend)
        B[API网关]
        C[积分服务 PointsService]
        D[AI任务服务 AiTaskService]
        E[队列管理器 QueueManager]
        F[定时任务 Scheduler]
        G[WebSocket服务]
    end

    subgraph 第三方服务
        H[中转站AI API]
    end

    subgraph 基础设施
        I[MySQL数据库]
        J[Redis缓存/队列]
    end

    A -- REST API --> B
    B -- 调用 --> C
    B -- 调用 --> D
    
    D -- 操作任务 --> I
    D -- 添加任务到 --> E
    D -- 更新积分 --> C
    
    C -- 操作积分 --> I

    E -- 使用 --> J
    E -- 触发 --> D

    F -- 扫描 --> E
    F -- 清理 --> D

    D -- 推送进度 --> G
    G -- WebSocket --> A
    
    D -- 调用 --> H
```

**核心流程:**
1. 用户通过**API网关**提交AI任务。
2. **AI任务服务**接收请求，调用**积分服务**冻结相应积分。
3. 任务服务将任务信息持久化到**MySQL**，并交给**队列管理器**。
4. **队列管理器**基于**Redis**实现任务排队，并根据并发限制（50个）决定是否立即处理。
5. **定时任务**周期性扫描队列，将排队的任务交给任务服务处理。
6. 任务服务异步调用**中转站AI API**，并通过**WebSocket**向用户实时推送进度。
7. 任务完成后，更新数据库状态，并调用积分服务进行最终的扣除或退款。

---

## 3. 核心功能设计

### 3.1 积分体系设计

#### 3.1.1 兑换与定价

- **兑换比例:** `1 元人民币 = 100 积分`
- **模型定价:** 在中转站价格基础上加价50%。

**图片模型定价 (示例)**
| 模型名称 | 中转站价格 | 我方价格 (USD) | 我方价格 (CNY) | 积分消耗 |
|---|---|---|---|---|
| sora_image | $0.01 | $0.015 | ~¥0.11 | **11 积分/张** |
| gpt-4o-image | $0.01 | $0.015 | ~¥0.11 | **11 积分/张** |

**视频模型定价 (示例)**
| 模型名称 | 中转站价格 | 我方价格 (USD) | 我方价格 (CNY) | 积分消耗 |
|---|---|---|---|---|
| sora_video2 | $0.15 | $0.225 | ~¥1.6 | **160 积分/次** |
| sora_video2-15s | $0.25 | $0.375 | ~¥2.6 | **260 积分/次** |
| sora-2-pro-all | $0.40 | $0.60 | ~¥4.2 | **420 积分/次** |
*(注: CNY价格按汇率7.2估算，最终积分以CNY价格为准，取整)*

#### 3.1.2 充值与会员

- **充值档位:** 设计多档位充值套餐，提供不同比例的积分赠送。
- **会员体系:** VIP/SVIP会员可享受每日免费积分、生成任务折扣等权益。

### 3.2 AI任务管理

#### 3.2.1 任务生命周期

```mermaid
stateDiagram-v2
    [*] --> created: 用户提交
    created --> queued: 进入队列
    created --> processing: 队列有空位
    queued --> processing: 轮到处理
    processing --> completed: 生成成功
    processing --> failed: 生成失败
    queued --> cancelled: 用户取消
    processing --> cancelled: 用户取消(不支持)
    failed --> processing: 系统重试
    completed --> [*]
    failed --> [*]
    cancelled --> [*]
```
- **created:** 任务已创建，积分已冻结。
- **queued:** 系统繁忙，任务在队列中等待。
- **processing:** 任务正在被AI模型处理。
- **completed:** 任务成功，结果已生成。
- **failed:** 任务失败，积分将退还。
- **cancelled:** 用户主动取消（仅排队中可取消）。

#### 3.2.2 队列管理

- **系统并发限制:** 每个模型最多同时处理50个任务。
- **用户并发限制:** 每个用户最多同时进行3个任务。
- **优先级策略:** SVIP > VIP > 普通用户 > 等待时间。
- **超时机制:** `processing`状态超过10分钟的任务将被标记为失败，并自动退款。

---

## 4. 数据库设计

为支持以上功能，需新增以下核心表：

```sql
-- AI生成任务表 (核心)
CREATE TABLE IF NOT EXISTS `ai_task` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `task_no` varchar(64) UNIQUE NOT NULL COMMENT '任务编号',
  `user_id` bigint NOT NULL,
  `model_name` varchar(64) NOT NULL,
  `task_type` varchar(32) NOT NULL COMMENT '任务类型 (image/video)',
  `prompt` text NOT NULL,
  `status` varchar(32) NOT NULL DEFAULT 'created' COMMENT '任务状态 (created, queued, processing, completed, failed, cancelled)',
  `progress` int DEFAULT 0 COMMENT '进度百分比',
  `progress_message` varchar(255) DEFAULT NULL,
  `points_frozen` int NOT NULL COMMENT '冻结积分',
  `points_consumed` int DEFAULT 0 COMMENT '实际消耗积分',
  `result_url` varchar(512) DEFAULT NULL,
  `error_message` text DEFAULT NULL,
  `queue_time` datetime DEFAULT NULL,
  `start_time` datetime DEFAULT NULL,
  `complete_time` datetime DEFAULT NULL,
  `expire_time` datetime DEFAULT NULL COMMENT '结果过期时间',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `is_deleted` tinyint(1) NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_task_no` (`task_no`),
  KEY `idx_user_status` (`user_id`, `status`),
  KEY `idx_status_time` (`status`, `create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AI生成任务表';

-- 积分消费配置表
CREATE TABLE IF NOT EXISTS `points_config` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `model_name` varchar(64) UNIQUE NOT NULL COMMENT '模型名称',
  `points_cost` int NOT NULL COMMENT '积分消耗',
  `description` varchar(255) DEFAULT NULL,
  `is_enabled` tinyint(1) NOT NULL DEFAULT 1,
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='积分消费配置表';

-- 积分消费记录表
CREATE TABLE IF NOT EXISTS `points_consumption_log` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `user_id` bigint NOT NULL,
  `task_no` varchar(64) DEFAULT NULL,
  `change_type` varchar(32) NOT NULL COMMENT '(consume, refund)',
  `change_amount` int NOT NULL,
  `balance_before` int NOT NULL,
  `balance_after` int NOT NULL,
  `description` varchar(255) DEFAULT NULL,
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='积分消费记录表';

-- 系统配置表
CREATE TABLE IF NOT EXISTS `system_config` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `config_key` varchar(64) UNIQUE NOT NULL,
  `config_value` varchar(512) NOT NULL,
  `description` varchar(255) DEFAULT NULL,
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统配置表';
```

---

## 5. 安全设计

安全是本系统的重中之重，需在多个层面进行防御。

### 5.1 防滥用与攻击

- **接口频率限制:** 对任务提交、状态查询等核心接口进行IP和用户级别的双重限流，防止CC攻击。
- **图形验证码:** 在登录、充值、提交任务等关键操作前，引入图形验证码，防止机器人批量操作。
- **输入校验:** 对所有用户输入（特别是`prompt`）进行严格的XSS和SQL注入过滤，防止恶意脚本和敏感信息泄露。
- **API密钥保护:** 中转站的API Key必须存储在安全的环境变量或配置中心，绝不能硬编码在代码中。所有对外的API调用需在服务端完成，严禁在前端暴露密钥。

### 5.2 数据与交易安全

- **事务一致性:** 积分的冻结、扣除、退款操作必须与任务状态变更在同一个数据库事务中完成，保证数据原子性，防止出现"钱扣了任务没创建"等问题。
- **防并发竞争 (Race Condition):** 在扣减积分、更新任务状态等操作时，使用乐观锁（增加`version`字段）或悲观锁（`SELECT ... FOR UPDATE`），防止并发请求导致的数据错乱（如一笔积分被消费两次）。
- **敏感数据加密:** 数据库中存储的密码、API密钥等敏感信息必须使用强哈希算法（如Argon2, bcrypt）进行加密存储。
- **日志审计:** 对所有积分变更、管理员操作进行详细的日志记录，便于审计和问题追溯。

### 5.3 访问控制

- **权限分离:** 严格区分用户和管理员的API接口，使用基于角色的访问控制（RBAC）。普通用户不能访问任何管理接口。
- **水平越权防护:** 所有查询和操作用户数据的接口，必须严格校验当前登录用户ID与要操作的数据归属ID是否一致，防止用户A操作用户B的任务或积分。
- **CSRF防护:** 对所有状态变更的POST/PUT请求（如取消任务、修改配置）启用CSRF Token验证。

---

## 6. 开发功能清单

### 第一阶段：核心后台 (15人日)
- [ ] 数据库表结构设计与创建
- [ ] 实体类与Mapper层代码生成
- [ ] 积分核心服务 (查询、冻结、扣除、退款)
- [ ] AI任务核心服务 (创建、状态更新)
- [ ] 积分与任务的事务性保证
- [ ] 中转站API客户端封装

### 第二阶段：队列与异步 (10人日)
- [ ] 基于Redis的队列管理器实现
- [ ] 任务优先级算法实现
- [ ] 异步处理任务的`@Async`配置
- [ ] 队列扫描、超时检查、过期清理的定时任务
- [ ] WebSocket服务基础搭建

### 第三阶段：API与前端 (12人日)
- [ ] 用户端API接口开发 (提交、查询、列表、取消)
- [ ] WebSocket实时进度推送实现
- [ ] 管理端API接口开发 (任务监控、队列配置)
- [ ] 详细的API文档编写 (Swagger/OpenAPI)
- [ ] 前端任务提交与结果展示页面
- [ ] 前端任务历史列表与状态展示

### 第四阶段：安全与测试 (8人日)
- [ ] 单元测试与集成测试编写
- [ ] 安全加固 (限流、输入校验、权限检查)
- [ ] 压力测试 (模拟高并发提交任务)
- [ ] 部署脚本编写与上线

---

## 7. 任务进度计划 (甘特图)

| 阶段 | 任务 | 负责人 | 预估工时 | W1 | W2 | W3 | W4 | W5 | 状态 |
|:---|:---|:---|:---:|:---:|:---:|:---:|:---:|:---:|:---|
| **P1: 核心后台** | 数据库设计与创建 | 后端A | 2d | ██ | | | | | ✅ |
| | 核心服务开发 | 后端A | 8d | ████ | ████ | | | |  진행중 |
| | API客户端封装 | 后端B | 3d | ███ | | | | | ✅ |
| | 单元测试(P1) | 后端A/B | 2d | | | ██ | | | 대기 |
| **P2: 队列与异步** | 队列管理器实现 | 后端B | 5d | | ███ | ██ | | | 대기 |
| | 定时任务开发 | 后端A | 3d | | | | ███ | | 대기 |
| | WebSocket搭建 | 后端B | 2d | | | | | ██ | 대기 |
| **P3: API与前端** | 用户端API开发 | 后端A | 4d | | | ████ | | | 대기 |
| | 管理端API开发 | 后端B | 2d | | | | ██ | | 대기 |
| | 前端页面开发 | 前端C | 6d | | | ██ | ████ | | 대기 |
| **P4: 测试与部署** | 集成与压力测试 | 测试D | 5d | | | | | █████ | 대기 |
| | 安全加固与部署 | 运维E | 3d | | | | | | ███ |

*(注: d=人日, 一个█代表1人日)*
