From 2799b096b961e3f9daab7a91920361d474f7c5a6 Mon Sep 17 00:00:00 2001 From: 王家文 Date: Thu, 25 Apr 2024 15:53:26 +0800 Subject: [PATCH] feat✨:房间排行榜改为支持多个排行榜 --- service/roomrank/dto-record.go | 4 ++-- service/roomrank/dto-room.go | 3 ++- service/roomrank/handle.go | 16 ++++++++-------- service/roomrank/logic.go | 8 ++++---- service/roomrank/room.go | 19 ++++++++++--------- 5 files changed, 26 insertions(+), 24 deletions(-) diff --git a/service/roomrank/dto-record.go b/service/roomrank/dto-record.go index 375caa3..6e80550 100644 --- a/service/roomrank/dto-record.go +++ b/service/roomrank/dto-record.go @@ -38,7 +38,7 @@ func (d *RecordGetSettleAward) MysqlInfo(suffix string) *svmysql.MysqlInfo { tableName := svconst.MYSQL_TABLE_S_ROOMRANK_RECORD_SETTLEAWARD return &svmysql.MysqlInfo{ DbMysql: svconst.DbCommon, - TableName: fmt.Sprintf("%s_%s_%d", tableName, suffix, d.TopType), + TableName: fmt.Sprintf("%s_%s_%d_%d", tableName, suffix, d.TopType, d.ActivityId), } } @@ -62,7 +62,7 @@ func (d *RecordAddScore) MysqlInfo(suffix string) *svmysql.MysqlInfo { tableName := svconst.MYSQL_TABLE_S_ROOMRANK_RECORD_ADDSCORE return &svmysql.MysqlInfo{ DbMysql: svconst.DbCommon, - TableName: fmt.Sprintf("%s_%s_%d", tableName, suffix, d.TopType), + TableName: fmt.Sprintf("%s_%s_%d_%d", tableName, suffix, d.TopType, d.ActivityId), } } diff --git a/service/roomrank/dto-room.go b/service/roomrank/dto-room.go index ef9ee6d..13457ea 100644 --- a/service/roomrank/dto-room.go +++ b/service/roomrank/dto-room.go @@ -12,6 +12,7 @@ import ( // Room 房间排行持久数据 type Room struct { Id int64 `gorm:"column:id;primaryKey;comment:房间唯一ID"` + TopType int `gorm:"comment:排行榜类型"` ActivityId int64 `gorm:"comment:活动ID"` ConfigId int `gorm:"comment:房间配置ID"` @@ -30,7 +31,7 @@ func (d *Room) MysqlInfo(suffix string) *svmysql.MysqlInfo { tableName := svconst.MYSQL_TABLE_S_ROOMRANK_ROOM return &svmysql.MysqlInfo{ DbMysql: svconst.DbCommon, - TableName: fmt.Sprintf("%s_%s_%d", tableName, suffix, d.ActivityId), + TableName: fmt.Sprintf("%s_%s_%d_%d", tableName, suffix, d.TopType, d.ActivityId), } } diff --git a/service/roomrank/handle.go b/service/roomrank/handle.go index 23f0e76..6952aed 100644 --- a/service/roomrank/handle.go +++ b/service/roomrank/handle.go @@ -53,7 +53,7 @@ func HandleInfo(req *models.ReqRoomRankInfo) (code string, rsp models.RspRoomRan player.Icon = req.PlayerIcon // 采用分布式锁 - lockKey := getLockKey(gameId, config.Id) + lockKey := getLockKey(gameId, req.TopType, config.Id) opt := zredislock.GetOptionLimitRetry(RoomLockLinearBackoff, RoomLockMaxCount) lock := zredislock.Obtain(lockKey, RoomLockMillisecond, opt) if lock.Err != nil { @@ -63,7 +63,7 @@ func HandleInfo(req *models.ReqRoomRankInfo) (code string, rsp models.RspRoomRan defer lock.Release() // 尝试判断结算 - hasSettleChange := TrySettle(gameId, player, config) + hasSettleChange := TrySettle(gameId, req.TopType, player, config) if hasSettleChange { SavePlayer(gameId, player) @@ -80,7 +80,7 @@ func HandleInfo(req *models.ReqRoomRankInfo) (code string, rsp models.RspRoomRan } // 尝试加入房间 - room, hasRoom := TryGetRoom(gameId, player, config, playerLevel) + room, hasRoom := TryGetRoom(gameId, req.TopType, player, config, playerLevel) if !hasRoom { code = code_msg.RECODE_MERGE_CONFIG_ERROR @@ -115,7 +115,7 @@ func HandleGetSettleAward(req *models.ReqRoomRankGetSettleAward) (code string, r player.Icon = req.PlayerIcon // 采用分布式锁 - lockKey := getLockKey(gameId, config.Id) + lockKey := getLockKey(gameId, req.TopType, config.Id) opt := zredislock.GetOptionLimitRetry(RoomLockLinearBackoff, RoomLockMaxCount) lock := zredislock.Obtain(lockKey, RoomLockMillisecond, opt) if lock.Err != nil { @@ -125,7 +125,7 @@ func HandleGetSettleAward(req *models.ReqRoomRankGetSettleAward) (code string, r defer lock.Release() // 尝试判断结算 - _ = TrySettle(gameId, player, config) + _ = TrySettle(gameId, req.TopType, player, config) if !player.SettleHas() { code = code_msg.RECODE_MERGE_ROOMRANK_NOTHASSETTLE_ERROR return @@ -171,7 +171,7 @@ func HandleAddScore(req *models.ReqRoomRankAddScore) (code string, rsp models.Rs player.Icon = req.PlayerIcon // 采用分布式锁 - lockKey := getLockKey(gameId, config.Id) + lockKey := getLockKey(gameId, req.TopType, config.Id) opt := zredislock.GetOptionLimitRetry(RoomLockLinearBackoff, RoomLockMaxCount) lock := zredislock.Obtain(lockKey, RoomLockMillisecond, opt) if lock.Err != nil { @@ -181,7 +181,7 @@ func HandleAddScore(req *models.ReqRoomRankAddScore) (code string, rsp models.Rs defer lock.Release() // 尝试判断结算 - hasSettleChange := TrySettle(gameId, player, config) + hasSettleChange := TrySettle(gameId, req.TopType, player, config) if hasSettleChange { SavePlayer(gameId, player) } @@ -199,7 +199,7 @@ func HandleAddScore(req *models.ReqRoomRankAddScore) (code string, rsp models.Rs } // 尝试加入房间 - room, hasRoom := TryGetRoom(gameId, player, config, playerLevel) + room, hasRoom := TryGetRoom(gameId, req.TopType, player, config, playerLevel) // 房间排行增加积分 oldScore, newScore := ChangePlayerScore(room, player, req.AddScore) diff --git a/service/roomrank/logic.go b/service/roomrank/logic.go index 664960f..ab91bfd 100644 --- a/service/roomrank/logic.go +++ b/service/roomrank/logic.go @@ -8,12 +8,12 @@ import ( "fmt" ) -func getLockKey(gameId string, activityId int64) string { - return fmt.Sprintf("%s:lock:roomrank:%s:%d", svconst.REDIS_CACHEP_REFIX, gameId, activityId) +func getLockKey(gameId string, topType int, activityId int64) string { + return fmt.Sprintf("%s:lock:roomrank:%s:%d:%d", svconst.REDIS_CACHEP_REFIX, gameId, topType, activityId) } // TrySettle 尝试判断结算 -func TrySettle(gameId string, player *Player, config *confroomrank.ActivityConfig) (hasChange bool) { +func TrySettle(gameId string, topType int, player *Player, config *confroomrank.ActivityConfig) (hasChange bool) { hasChange = false if player.SettleActivityId == config.Id { return @@ -26,7 +26,7 @@ func TrySettle(gameId string, player *Player, config *confroomrank.ActivityConfi } fmt.Println(zjson.Str(player)) // 查找玩家所在的房间 - room, hasRoom := LoadRoom(gameId, player.ActivityId, player.RoomUid) + room, hasRoom := LoadRoom(gameId, topType, player.ActivityId, player.RoomUid) if !hasRoom { return } diff --git a/service/roomrank/room.go b/service/roomrank/room.go index 53563b9..5240bd4 100644 --- a/service/roomrank/room.go +++ b/service/roomrank/room.go @@ -29,8 +29,8 @@ func SaveRoom(gameId string, room *Room) { } // LoadRoom 获取数据 -func LoadRoom(gameId string, activityId int64, roomUid int64) (room *Room, has bool) { - room = &Room{Id: roomUid, ActivityId: activityId} +func LoadRoom(gameId string, topType int, activityId int64, roomUid int64) (room *Room, has bool) { + room = &Room{Id: roomUid, TopType: topType, ActivityId: activityId} if roomUid == 0 { has = false return @@ -48,8 +48,9 @@ func LoadRoom(gameId string, activityId int64, roomUid int64) (room *Room, has b return } -func CreateRoom(gameId string, activityId int64, roomConfigId int) (room *Room, has bool) { +func CreateRoom(gameId string, topType int, activityId int64, roomConfigId int) (room *Room, has bool) { room = new(Room) + room.TopType = topType room.ActivityId = activityId room.ConfigId = roomConfigId room.Closed = false @@ -69,8 +70,8 @@ func CreateRoom(gameId string, activityId int64, roomConfigId int) (room *Room, } // FindRoom 查找 -func FindRoom(gameId string, activityId int64, roomConfigId int) (rooms []*Room, has bool) { - roomDemo := &Room{ActivityId: activityId} +func FindRoom(gameId string, topType int, activityId int64, roomConfigId int) (rooms []*Room, has bool) { + roomDemo := &Room{TopType: topType, ActivityId: activityId} tryInitRoom(gameId, roomDemo) info := roomDemo.MysqlInfo(gameId) @@ -84,14 +85,14 @@ func FindRoom(gameId string, activityId int64, roomConfigId int) (rooms []*Room, } // TryGetRoom 尝试获取房间 -func TryGetRoom(gameId string, player *Player, config *confroomrank.ActivityConfig, playerLevel int) (room *Room, hasRoom bool) { +func TryGetRoom(gameId string, topType int, player *Player, config *confroomrank.ActivityConfig, playerLevel int) (room *Room, hasRoom bool) { hasRoom = false if player.ActivityId != config.Id { player.ActivityId = config.Id player.RoomUid = 0 } // 查找玩家所在的房间 - room, hasRoom = LoadRoom(gameId, config.Id, player.RoomUid) + room, hasRoom = LoadRoom(gameId, topType, config.Id, player.RoomUid) if hasRoom { if confRoom, hasConfRoom := config.Room[room.ConfigId]; hasConfRoom { TryCloseRoom(gameId, room, confRoom) @@ -115,7 +116,7 @@ func TryGetRoom(gameId string, player *Player, config *confroomrank.ActivityConf return } // 数据库查找合适条件的房间列表 - rooms, has := FindRoom(gameId, config.Id, roomConfigId) + rooms, has := FindRoom(gameId, topType, config.Id, roomConfigId) if has { for i := 0; i < len(rooms); i++ { roomTemp := rooms[i] @@ -137,7 +138,7 @@ func TryGetRoom(gameId string, player *Player, config *confroomrank.ActivityConf PlayerJoinRoom(room, player) } else { // 如果没有合适条件的房间 创建一个 - roomCreate, hasCreate := CreateRoom(gameId, config.Id, roomConfigId) + roomCreate, hasCreate := CreateRoom(gameId, topType, config.Id, roomConfigId) if hasCreate { room = roomCreate -- libgit2 0.21.0