删除doc文件

This commit is contained in:
tianfeng 2025-12-16 14:40:53 +08:00
parent c077c563eb
commit 18209b32ae

View File

@ -1,622 +0,0 @@
# 🚀 语聊房火箭系统 - 完整需求文档
---
## 📋 文档信息
| 项目 | 内容 |
|-----|------|
| **文档名称** | 语聊房火箭系统需求文档 |
| **版本** | v1.0 |
| **创建日期** | 2025-01-15 |
| **所属项目** | Likei Services |
| **所属模块** | rc-service-other |
| **项目路径** | D:\workspace\likei-services\rc-service\rc-service-other |
---
## 1. 业务需求
### 1.1 功能概述
语聊房火箭是一个房间级互动玩法,用户通过送礼积累火箭能量,达到阈值后自动发射并分发奖励。
### 1.2 核心规则
#### 能量积累规则
- **基础规则**1金币礼物 = 1火箭能量点
- **幸运加成**幸运礼物额外增加4%能量
- **实时累积**:每次送礼立即增加能量
#### 火箭等级系统
| 等级 | 能量阈值 | 说明 |
|-----|---------|------|
| Lv1 | 150,000 | 一级火箭 |
| Lv2 | 500,000 | 二级火箭 |
| Lv3 | 1,000,000 | 三级火箭 |
#### 发射机制
- 能量达到阈值自动触发发射
- 发射后进入"领取中"状态
- 领取有效期1分钟
#### 奖励领取规则
- 房间内所有用户可领取
- 贡献者和普通用户奖励不同(配置待定)
- 每人限领一次
- 过期后自动重置
#### 每日重置
- 每天00:00重置火箭状态
- 历史记录保存到MongoDB
---
## 2. 技术架构
### 2.1 技术栈
| 组件 | 技术 |
|-----|------|
| **语言** | Java 17+ |
| **框架** | Spring Boot |
| **数据库** | MySQL + MongoDB |
| **缓存** | Redis |
| **架构模式** | DDD + CQRS |
### 2.2 数据库设计
#### MongoDB 集合
**room_rocket_status** - 火箭实时状态
```javascript
{
"_id": ObjectId,
"room_id": NumberLong,
"date": "2025-01-15",
"level": 1, // 1/2/3
"current_energy": NumberLong(85000),
"max_energy": NumberLong(150000),
"status": 1, // 1:CHARGING 2:LAUNCHED 3:CLAIMING
"contributors": [
{
"user_id": NumberLong,
"user_name": "张三",
"user_avatar": "https://...",
"energy": NumberLong(50000),
"contribution_rate": 58.82,
"gift_count": 125,
"first_contribute_time": ISODate,
"last_contribute_time": ISODate
}
],
"launch_time": ISODate,
"claim_expire_time": ISODate,
"claim_count": 0,
"created_at": ISODate,
"updated_at": ISODate
}
// 索引
db.room_rocket_status.createIndex({"room_id": 1, "date": 1}, {unique: true})
db.room_rocket_status.createIndex({"status": 1})
```
#### MySQL 表
**rocket_config** - 火箭配置表
```sql
CREATE TABLE `rocket_config` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`level` TINYINT UNSIGNED NOT NULL COMMENT '等级 1/2/3',
`max_energy` BIGINT UNSIGNED NOT NULL COMMENT '最大能量值',
`reward_config` JSON DEFAULT NULL COMMENT '奖励配置(预留)',
`status` TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_level` (`level`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `rocket_config` (`level`, `max_energy`) VALUES
(1, 150000),
(2, 500000),
(3, 1000000);
```
**rocket_reward_claim_log** - 奖励领取记录表
```sql
CREATE TABLE `rocket_reward_claim_log` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`rocket_history_id` VARCHAR(32) NOT NULL COMMENT 'MongoDB _id',
`room_id` BIGINT UNSIGNED NOT NULL,
`user_id` BIGINT UNSIGNED NOT NULL,
`is_contributor` TINYINT UNSIGNED NOT NULL COMMENT '是否贡献者',
`reward_type` VARCHAR(32) NOT NULL COMMENT 'GOLD/DIAMOND/PROP',
`reward_amount` BIGINT UNSIGNED NOT NULL,
`claimed_at` DATETIME NOT NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_rocket_user` (`rocket_history_id`, `user_id`),
KEY `idx_room_id` (`room_id`),
KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```
### 2.3 Redis 缓存设计
| Key | 类型 | TTL | 用途 |
|-----|------|-----|------|
| ROCKET:STATUS:{roomId} | String(JSON) | 24h | 状态缓存 |
| ROCKET:LOCK:{roomId} | String | 5s | 分布式锁 |
| ROCKET:CLAIMED:{historyId} | Set | 2min | 已领取用户 |
| ROCKET:CONFIG:{level} | String(JSON) | 1h | 配置缓存 |
---
## 3. 核心流程
### 3.1 能量积累流程
```
用户送礼 → GiftSendEvent
RocketEnergyAddCmdExe
1. 获取分布式锁 (Redis)
2. 查询火箭状态 (MongoDB)
3. 计算能量值 (普通/幸运)
4. 更新能量和贡献者
5. 检查等级提升
6. 保存状态
7. 判断是否达到发射条件
├─ 是 → 触发发射
└─ 否 → 推送能量更新
```
### 3.2 火箭发射流程
```
能量达到阈值
RocketLaunchCmdExe
1. 获取分布式锁
2. 校验状态和能量
3. 发射火箭 (status → LAUNCHED)
4. 设置领取过期时间 (+1分钟)
5. 进入领取状态 (status → CLAIMING)
6. 保存状态
7. 推送发射动画 (TODO: WebSocket)
8. 保存历史记录 (TODO)
```
### 3.3 奖励领取流程
```
用户点击领取
RocketRewardClaimCmdExe
1. 获取分布式锁
2. 校验领取资格
├─ 状态是否为CLAIMING
├─ 是否过期
└─ 是否重复领取
3. 判断是否贡献者
4. 计算奖励金额 (TODO: 配置)
5. 调用钱包服务发放 (TODO)
6. 记录领取日志 (MySQL)
7. 更新领取人数
8. 返回奖励详情
```
### 3.4 每日重置流程
```
定时任务 00:00
RocketDailyResetTask
1. 查询所有CHARGING状态火箭
2. 保存历史记录 (TODO)
3. 重置火箭状态
├─ level = 1
├─ current_energy = 0
├─ contributors = []
└─ date = 今天
4. 清除Redis缓存
```
---
## 4. API 接口设计
### 4.1 查询火箭状态
**接口**: `GET /api/rocket/status`
**请求参数**:
```json
{
"roomId": 123456,
"currentUserId": 789 // 可选
}
```
**响应数据**:
```json
{
"roomId": 123456,
"date": "2025-01-15",
"level": 2,
"levelName": "二级火箭",
"currentEnergy": 350000,
"maxEnergy": 500000,
"energyPercent": 70.00,
"status": "CHARGING",
"statusDesc": "充能中",
"topContributors": [
{
"userId": 789,
"userName": "张三",
"userAvatar": "https://...",
"energy": 200000,
"contributionRate": 57.14,
"rank": 1,
"giftCount": 500
}
],
"totalContributors": 25,
"claimCount": 0,
"canClaim": false,
"hasClaimed": false,
"myContribution": 200000,
"myContributionRate": 57.14
}
```
### 4.2 领取奖励
**接口**: `POST /api/rocket/claim`
**请求参数**:
```json
{
"roomId": 123456,
"userId": 789,
"rocketHistoryId": "507f1f77bcf86cd799439011"
}
```
**响应数据**:
```json
{
"rewardType": "GOLD",
"rewardAmount": 1000,
"isContributor": true,
"contributionEnergy": 200000,
"contributionRate": 57.14,
"message": "恭喜您获得贡献者奖励!"
}
```
### 4.3 手动触发发射 (测试用)
**接口**: `POST /api/rocket/manual-launch`
**请求参数**:
```
roomId=123456
```
---
## 5. 已实现文件清单
### 5.1 Domain 层
```
✅ RocketLevel.java - 等级枚举
✅ RocketStatusEnum.java - 状态枚举
✅ RocketContributor.java - 贡献者值对象
✅ RocketStatus.java - 火箭状态领域对象
✅ RocketStatusGateway.java - Gateway接口
```
### 5.2 Infrastructure 层
```
✅ RocketKeys.java - Redis Key枚举
✅ RocketStatusDocument.java - MongoDB文档
✅ RocketStatusRepository.java - MongoDB Repository
✅ RocketStatusGatewayImpl.java - Gateway实现
```
### 5.3 Client 层
```
✅ RocketEnergyAddCmd.java - 能量增加命令
✅ RocketRewardClaimCmd.java - 奖励领取命令
✅ RocketStatusQueryCmd.java - 状态查询命令
✅ RocketStatusCO.java - 状态客户端对象
✅ RocketContributorCO.java - 贡献者客户端对象
✅ RocketRewardCO.java - 奖励客户端对象
✅ RocketService.java - 服务接口
```
### 5.4 Application 层
```
✅ RocketEnergyAddCmdExe.java - 能量增加执行器
✅ RocketLaunchCmdExe.java - 火箭发射执行器
✅ RocketStatusQryExe.java - 状态查询执行器
✅ RocketRewardClaimCmdExe.java - 奖励领取执行器
✅ RocketServiceImpl.java - 服务实现
✅ RocketDailyResetTask.java - 每日重置任务
✅ RocketClaimExpireTask.java - 过期检查任务
```
### 5.5 Adapter 层
```
✅ RocketRestController.java - REST控制器
```
---
## 6. 待实现功能清单
### 6.1 高优先级 (P0)
#### 1. 礼物事件监听
**文件**: `GiftSendRocketListener.java`
**位置**: `other-application/src/.../app/listener/`
**功能**: 监听送礼事件,自动触发能量增加
```java
@EventListener
public void onGiftSend(GiftSendEvent event) {
RocketEnergyAddCmd cmd = new RocketEnergyAddCmd();
cmd.setRoomId(event.getRoomId());
cmd.setUserId(event.getUserId());
cmd.setGiftGoldValue(event.getGiftGoldValue());
cmd.setIsLucky(event.getIsLuckyGift());
cmd.setBizNo("GIFT_" + event.getGiftOrderId());
rocketService.addEnergy(cmd);
}
```
#### 2. MySQL 表创建
**执行SQL**:
- `rocket_config` 配置表
- `rocket_reward_claim_log` 领取记录表
#### 3. MongoDB 索引创建
```javascript
db.room_rocket_status.createIndex(
{"room_id": 1, "date": 1},
{unique: true, name: "uk_room_date"}
)
db.room_rocket_status.createIndex(
{"status": 1},
{name: "idx_status"}
)
```
#### 4. 奖励发放集成
**需要**: 调用 `wallet-inner-api`
**实现**: 在 `RocketRewardClaimCmdExe` 中补充
```java
// 注入 Feign Client
@Autowired
private WalletGoldClient walletGoldClient;
// 发放奖励
String bizNo = "ROCKET_" + rocketHistoryId + "_" + userId;
WalletReceiptReqDTO req = new WalletReceiptReqDTO();
req.setUserId(userId);
req.setAmount(rewardAmount);
req.setBizType(WalletBizType.ROCKET_REWARD);
req.setBizNo(bizNo);
walletGoldClient.income(req);
```
#### 5. 领取防重实现
**实现**: MySQL唯一索引 + Redis检查
```java
// 查询MySQL
boolean hasClaimed = rocketRewardLogGateway.existsByRocketAndUser(
rocketHistoryId, userId
);
if (hasClaimed) {
throw new RuntimeException("您已经领取过奖励了");
}
```
### 6.2 中优先级 (P1)
#### 6. 历史记录保存
**文件**: `RocketHistoryDocument.java` + `RocketHistoryRepository.java`
**功能**: 发射后保存完整历史
#### 7. WebSocket 推送
**功能**:
- 能量更新推送
- 发射动画推送
- 领取通知推送
#### 8. 奖励配置管理
**功能**: 后台配置各等级奖励规则
#### 9. 排行榜查询
**文件**: `RocketRankingQryExe.java`
**功能**: 查询贡献排行榜
### 6.3 低优先级 (P2)
#### 10. 管理后台接口
**功能**:
- 配置管理
- 数据统计
- 手动重置
#### 11. 数据统计报表
**功能**: 发射次数、领取人数等统计
#### 12. 监控告警
**功能**: 关键指标监控、异常告警
---
## 7. 测试用例
### 7.1 单元测试
```java
@Test
public void testEnergyAdd_Normal() {
// 正常送礼增加能量
}
@Test
public void testEnergyAdd_Lucky() {
// 幸运礼物增加能量
}
@Test
public void testRocketLaunch_AutoTrigger() {
// 能量满自动发射
}
@Test
public void testRewardClaim_Contributor() {
// 贡献者领取奖励
}
@Test
public void testRewardClaim_Duplicate() {
// 重复领取防重
}
```
### 7.2 集成测试场景
1. **完整流程**: 送礼 → 发射 → 领取
2. **并发送礼**: 100人同时送礼
3. **分布式锁**: 高并发下的锁测试
4. **过期重置**: 领取过期自动重置
---
## 8. 部署说明
### 8.1 环境要求
- MongoDB 4.4+
- MySQL 8.0+
- Redis 6.0+
### 8.2 配置示例
```yaml
# application.yml
spring:
data:
mongodb:
uri: mongodb://localhost:27017/likei
datasource:
url: jdbc:mysql://localhost:3306/likei
username: root
password: password
rocket:
enabled: true
lucky-bonus-rate: 0.04
claim-expire-seconds: 60
```
### 8.3 启动顺序
1. 启动 MongoDB
2. 启动 MySQL
3. 启动 Redis
4. 执行数据库初始化脚本
5. 启动应用
---
## 9. 注意事项
### 9.1 幂等性
- 能量增加使用 `bizNo` 防重
- 奖励领取使用 MySQL 唯一索引防重
### 9.2 并发控制
- 使用 Redis 分布式锁
- 锁粒度:房间级别
### 9.3 数据一致性
- MongoDB 保存实时状态
- MySQL 保存领取记录
- 通过业务逻辑保证一致性
### 9.4 性能优化
- 热点房间使用 Redis 缓存
- 批量查询贡献者
- 异步推送消息
---
d
## 10. 联系方式
**技术支持**: system
**文档维护**: Leo
**最后更新**: 2025-01-15
---
## 附录:快速上手指南
### A. 快速测试流程
1. **初始化数据库**
```sql
-- 执行 MySQL 建表语句
-- 插入火箭配置数据
```
2. **创建 MongoDB 索引**
```javascript
use likei
db.room_rocket_status.createIndex({"room_id": 1, "date": 1}, {unique: true})
```
3. **启动应用**
```bash
cd other-start
mvn spring-boot:run
```
4. **测试接口**
```bash
# 查询状态
curl "http://localhost:8080/api/rocket/status?roomId=123456"
# 手动发射 (测试用)
curl -X POST "http://localhost:8080/api/rocket/manual-launch?roomId=123456"
# 领取奖励
curl -X POST "http://localhost:8080/api/rocket/claim" \
-H "Content-Type: application/json" \
-d '{"roomId":123456,"userId":789,"rocketHistoryId":"xxx"}'
```
### B. 常见问题
**Q: 如何手动触发能量增加?**
A: 调用 `RocketService.addEnergy(cmd)` 或监听送礼事件
**Q: 如何查看当前火箭状态?**
A: 访问 MongoDB `room_rocket_status` 集合或调用查询接口
**Q: 如何重置火箭?**
A: 等待每日00:00自动重置或手动调用重置方法
---
**祝开发顺利!🚀**