复制项目
This commit is contained in:
208
docs/redpacket-implementation-plan.md
Normal file
208
docs/redpacket-implementation-plan.md
Normal file
@@ -0,0 +1,208 @@
|
||||
# 红包功能实现方案
|
||||
|
||||
## 功能概述
|
||||
实现类似微信的抢红包功能,包括:
|
||||
- 发送红包(普通红包、拼手气红包)
|
||||
- 领取红包
|
||||
- 查看红包详情和领取记录
|
||||
- 红包过期处理
|
||||
|
||||
## 需要修改的文件清单
|
||||
|
||||
### 1. 消息类型定义
|
||||
**文件**: `../protocol/constant/constant.go`
|
||||
- 添加 `RedPacket = 123` 消息类型常量
|
||||
- 在 `ContentType2PushContent` 映射中添加红包推送内容
|
||||
|
||||
### 2. 数据库模型
|
||||
**新建文件**: `pkg/common/storage/model/redpacket.go`
|
||||
- `RedPacket` - 红包主表
|
||||
- `RedPacketReceive` - 红包领取记录表
|
||||
|
||||
### 3. 数据库操作接口
|
||||
**新建文件**: `pkg/common/storage/database/redpacket.go`
|
||||
- 定义红包数据库操作接口
|
||||
|
||||
### 4. MongoDB实现
|
||||
**新建文件**: `pkg/common/storage/database/mgo/redpacket.go`
|
||||
- 实现红包数据库操作
|
||||
|
||||
### 5. RPC服务
|
||||
**新建目录**: `internal/rpc/redpacket/`
|
||||
- `redpacket.go` - 红包RPC服务实现
|
||||
- `server.go` - RPC服务注册
|
||||
|
||||
### 6. API接口
|
||||
**新建文件**: `internal/api/redpacket.go`
|
||||
- 发送红包接口
|
||||
- 领取红包接口
|
||||
- 查询红包详情接口
|
||||
- 查询红包领取记录接口
|
||||
|
||||
### 7. 消息类型处理
|
||||
**修改文件**:
|
||||
- `internal/api/msg.go` - 添加红包消息解析
|
||||
- `internal/rpc/msg/verify.go` - 添加红包消息封装
|
||||
- `pkg/apistruct/msg.go` - 添加红包消息结构体
|
||||
|
||||
### 8. 推送处理
|
||||
**修改文件**: `internal/push/offlinepush_handler.go`
|
||||
- 添加红包消息的离线推送内容
|
||||
|
||||
### 9. 路由注册
|
||||
**修改文件**: `internal/api/router.go`
|
||||
- 注册红包相关路由
|
||||
|
||||
## 数据库表设计
|
||||
|
||||
### red_packets 表
|
||||
```go
|
||||
type RedPacket struct {
|
||||
RedPacketID string `bson:"red_packet_id"` // 红包ID
|
||||
SendUserID string `bson:"send_user_id"` // 发送者ID
|
||||
GroupID string `bson:"group_id"` // 群ID(群红包)
|
||||
ConversationID string `bson:"conversation_id"` // 会话ID
|
||||
SessionType int32 `bson:"session_type"` // 会话类型
|
||||
RedPacketType int32 `bson:"red_packet_type"` // 红包类型:1-普通红包,2-拼手气红包
|
||||
TotalAmount int64 `bson:"total_amount"` // 总金额(分)
|
||||
TotalCount int32 `bson:"total_count"` // 总个数
|
||||
RemainAmount int64 `bson:"remain_amount"` // 剩余金额(分)
|
||||
RemainCount int32 `bson:"remain_count"` // 剩余个数
|
||||
Blessing string `bson:"blessing"` // 祝福语
|
||||
Status int32 `bson:"status"` // 状态:0-进行中,1-已领完,2-已过期
|
||||
ExpireTime time.Time `bson:"expire_time"` // 过期时间
|
||||
CreateTime time.Time `bson:"create_time"` // 创建时间
|
||||
Ex string `bson:"ex"` // 扩展字段
|
||||
}
|
||||
```
|
||||
|
||||
### red_packet_receives 表
|
||||
```go
|
||||
type RedPacketReceive struct {
|
||||
ReceiveID string `bson:"receive_id"` // 领取记录ID
|
||||
RedPacketID string `bson:"red_packet_id"` // 红包ID
|
||||
ReceiveUserID string `bson:"receive_user_id"` // 领取者ID
|
||||
Amount int64 `bson:"amount"` // 领取金额(分)
|
||||
ReceiveTime time.Time `bson:"receive_time"` // 领取时间
|
||||
Ex string `bson:"ex"` // 扩展字段
|
||||
}
|
||||
```
|
||||
|
||||
## API接口设计
|
||||
|
||||
### 1. 发送红包 ✅ 已实现
|
||||
```
|
||||
POST /redpacket/send_redpacket
|
||||
Request:
|
||||
{
|
||||
"groupID": "group123", // 群ID(必填)
|
||||
"redPacketType": 1, // 红包类型:1-普通红包,2-拼手气红包(必填)
|
||||
"totalAmount": 10000, // 总金额(分)(必填)
|
||||
"totalCount": 10, // 总个数(必填)
|
||||
"blessing": "恭喜发财" // 祝福语(可选)
|
||||
}
|
||||
Response:
|
||||
{
|
||||
"redPacketID": "rp123", // 红包ID
|
||||
"serverMsgID": "msg123", // 服务器消息ID
|
||||
"clientMsgID": "client123", // 客户端消息ID
|
||||
"sendTime": 1234567890 // 发送时间戳(毫秒)
|
||||
}
|
||||
```
|
||||
|
||||
**特性**:
|
||||
- 只支持群聊
|
||||
- 发送用户默认为群主(自动获取)
|
||||
- 自动创建数据库记录
|
||||
- 自动发送红包消息到群聊
|
||||
|
||||
### 2. 领取红包
|
||||
```
|
||||
POST /redpacket/receive
|
||||
Request:
|
||||
{
|
||||
"redPacketID": "rp123"
|
||||
}
|
||||
Response:
|
||||
{
|
||||
"amount": 1000, // 领取金额(分)
|
||||
"remainAmount": 9000,
|
||||
"remainCount": 9,
|
||||
"status": 0 // 0-进行中,1-已领完
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 查询红包详情
|
||||
```
|
||||
GET /redpacket/detail?redPacketID=rp123
|
||||
Response:
|
||||
{
|
||||
"redPacketID": "rp123",
|
||||
"sendUserID": "user123",
|
||||
"totalAmount": 10000,
|
||||
"totalCount": 10,
|
||||
"remainAmount": 9000,
|
||||
"remainCount": 9,
|
||||
"blessing": "恭喜发财",
|
||||
"status": 0,
|
||||
"receiveList": [...]
|
||||
}
|
||||
```
|
||||
|
||||
### 4. 查询红包领取记录
|
||||
```
|
||||
GET /redpacket/receives?redPacketID=rp123
|
||||
Response:
|
||||
{
|
||||
"total": 1,
|
||||
"receives": [
|
||||
{
|
||||
"receiveUserID": "user456",
|
||||
"amount": 1000,
|
||||
"receiveTime": "2024-01-01T10:00:00Z"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## 业务逻辑
|
||||
|
||||
### 发送红包流程
|
||||
1. 验证参数(金额、个数、类型)
|
||||
2. 创建红包记录
|
||||
3. 发送红包消息(ContentType=RedPacket)
|
||||
4. 返回红包ID和消息ID
|
||||
|
||||
### 领取红包流程
|
||||
1. 验证红包是否存在且可领取
|
||||
2. 检查用户是否已领取
|
||||
3. 计算领取金额(普通红包平均分配,拼手气红包随机)
|
||||
4. 更新红包记录(剩余金额、剩余个数)
|
||||
5. 创建领取记录
|
||||
6. 如果领完,更新红包状态
|
||||
7. 发送领取通知消息
|
||||
|
||||
### 红包过期处理
|
||||
- 建议使用定时任务检查过期红包
|
||||
- 过期红包状态更新为已过期
|
||||
- 剩余金额退回(如需要)
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. **并发控制**:领取红包需要使用分布式锁,防止重复领取
|
||||
2. **金额计算**:拼手气红包需要保证最后一个红包能领完剩余金额
|
||||
3. **消息推送**:红包消息需要特殊推送内容
|
||||
4. **数据一致性**:红包金额和领取记录需要事务保证一致性
|
||||
5. **性能优化**:红包详情查询需要缓存优化
|
||||
|
||||
## 实现步骤
|
||||
|
||||
1. ✅ 定义消息类型常量
|
||||
2. ✅ 创建数据库模型
|
||||
3. ✅ 实现数据库操作
|
||||
4. ✅ 实现RPC服务
|
||||
5. ✅ 实现API接口
|
||||
6. ✅ 添加消息类型处理
|
||||
7. ✅ 添加推送处理
|
||||
8. ✅ 测试和优化
|
||||
|
||||
Reference in New Issue
Block a user