# 红包功能实现方案 ## 功能概述 实现类似微信的抢红包功能,包括: - 发送红包(普通红包、拼手气红包) - 领取红包 - 查看红包详情和领取记录 - 红包过期处理 ## 需要修改的文件清单 ### 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. ✅ 测试和优化