mirror of
https://github.com/duanhf2012/origin.git
synced 2026-05-19 23:57:28 +08:00
新增排行榜服务
This commit is contained in:
195
sysservice/rankservice/RankService.go
Normal file
195
sysservice/rankservice/RankService.go
Normal file
@@ -0,0 +1,195 @@
|
||||
package rankservice
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/duanhf2012/origin/log"
|
||||
"github.com/duanhf2012/origin/node"
|
||||
"github.com/duanhf2012/origin/rpc"
|
||||
"github.com/duanhf2012/origin/service"
|
||||
)
|
||||
|
||||
func init() {
|
||||
node.Setup(&RankService{})
|
||||
}
|
||||
|
||||
const PreMapRankSkipLen = 10
|
||||
const ManualAddRankSkip = "RPC_ManualAddRankSkip"
|
||||
const UpsetRank = "RPC_UpsetRank"
|
||||
const DeleteRankDataByKey = "RPC_DeleteRankDataByKey"
|
||||
const FindRankDataByKey = "RPC_FindRankDataByKey"
|
||||
const FindRankDataByPos = "RPC_FindRankDataByPos"
|
||||
const FindRankDataListStartTo = "RPC_FindRankDataListStartTo"
|
||||
|
||||
type RankService struct {
|
||||
service.Service
|
||||
|
||||
mapRankSkip map[uint64]*RankSkip
|
||||
rankModule IRankModule
|
||||
}
|
||||
|
||||
func (rs *RankService) OnInit() error {
|
||||
rs.mapRankSkip = make(map[uint64]*RankSkip, PreMapRankSkipLen)
|
||||
err := rs.dealCfg()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if rs.rankModule != nil {
|
||||
_, err = rs.AddModule(rs.rankModule)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
rs.AddModule(&DefaultRankModule{})
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (rs *RankService) OnStart() {
|
||||
rs.rankModule.OnStart(rs.mapRankSkip)
|
||||
}
|
||||
|
||||
func (rs *RankService) OnRelease() {
|
||||
rs.rankModule.OnStop(rs.mapRankSkip)
|
||||
}
|
||||
|
||||
// 安装排行模块
|
||||
func (rs *RankService) SetupRankModule(rankModule IRankModule) {
|
||||
rs.rankModule = rankModule
|
||||
}
|
||||
|
||||
// RPC_ManualAddRankSkip 提供手动添加排行榜
|
||||
func (rs *RankService) RPC_ManualAddRankSkip(addInfo *rpc.AddRankList, addResult *rpc.RankResult) error {
|
||||
addList := make([]uint64, 0, PreMapRankSkipLen)
|
||||
for _, addRankListData := range addInfo.AddList {
|
||||
if addRankListData.RankId == 0 {
|
||||
rs.deleteRankList(addList)
|
||||
return fmt.Errorf("RPC_AddRankSkip must has rank id")
|
||||
}
|
||||
|
||||
newSkip := NewRankSkip(addRankListData.IsDec, transformLevel(addRankListData.SkipListLevel), addRankListData.MaxRank)
|
||||
rs.mapRankSkip[addRankListData.RankId] = newSkip
|
||||
addList = append(addList, addRankListData.RankId)
|
||||
}
|
||||
|
||||
addResult.AddCount = 1
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// RPC_UpsetRank 更新排行榜
|
||||
func (rs *RankService) RPC_UpsetRank(upsetInfo *rpc.UpsetRankData, upsetResult *rpc.RankResult) error {
|
||||
rankSkip, ok := rs.mapRankSkip[upsetInfo.RankId]
|
||||
if ok == false || rankSkip == nil {
|
||||
return fmt.Errorf("RPC_UpsetRank[", upsetInfo.RankId, "] no this rank id")
|
||||
}
|
||||
|
||||
addCount, updateCount := rankSkip.UpsetRank(upsetInfo.RankDataList)
|
||||
upsetResult.AddCount = addCount
|
||||
upsetResult.ModifyCount = updateCount
|
||||
return nil
|
||||
}
|
||||
|
||||
// RPC_DeleteRankDataByKey 按排行的key进行删除
|
||||
func (rs *RankService) RPC_DeleteRankDataByKey(delInfo *rpc.DeleteByKey, delResult *rpc.RankResult) error {
|
||||
rankSkip, ok := rs.mapRankSkip[delInfo.RankId]
|
||||
if ok == false || rankSkip == nil {
|
||||
return fmt.Errorf("RPC_DeleteRankDataByKey[", delInfo.RankId, "] no this rank type")
|
||||
}
|
||||
|
||||
removeCount := rankSkip.DeleteRankData(delInfo.KeyList)
|
||||
if removeCount == 0 {
|
||||
log.SError("remove count is zero")
|
||||
}
|
||||
|
||||
delResult.RemoveCount = removeCount
|
||||
return nil
|
||||
}
|
||||
|
||||
// RPC_FindRankDataByKey 按key查找
|
||||
func (rs *RankService) RPC_FindRankDataByKey(findInfo *rpc.FindRankDataByKey, findResult *rpc.RankPosData) error {
|
||||
rankObj, ok := rs.mapRankSkip[findInfo.RankId]
|
||||
if ok == false || rankObj == nil {
|
||||
return fmt.Errorf("RPC_FindRankDataByKey[", findInfo.RankId, "] no this rank type")
|
||||
}
|
||||
|
||||
findRankData, rankPos := rankObj.GetRankNodeData(findInfo.Key)
|
||||
if findRankData != nil {
|
||||
findResult.Data = findRankData.Data
|
||||
findResult.Key = findRankData.Key
|
||||
findResult.SortData = findRankData.SortData
|
||||
findResult.RankPos = rankPos
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// RPC_FindRankDataByPos 按pos查找
|
||||
func (rs *RankService) RPC_FindRankDataByPos(findInfo *rpc.FindRankDataByPos, findResult *rpc.RankPosData) error {
|
||||
rankObj, ok := rs.mapRankSkip[findInfo.RankId]
|
||||
if ok == false || rankObj == nil {
|
||||
return fmt.Errorf("RPC_FindRankDataByKey[", findInfo.RankId, "] no this rank type")
|
||||
}
|
||||
|
||||
findRankData, rankPos := rankObj.GetRankNodeDataByPos(findInfo.Pos)
|
||||
if findRankData != nil {
|
||||
findResult.Data = findRankData.Data
|
||||
findResult.Key = findRankData.Key
|
||||
findResult.SortData = findRankData.SortData
|
||||
findResult.RankPos = rankPos
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// RPC_FindRankDataListStartTo 按pos查找,start开始count个排行数据
|
||||
func (rs *RankService) RPC_FindRankDataListStartTo(findInfo *rpc.FindRankDataListStartTo, findResult *rpc.RankDataList) error {
|
||||
rankObj, ok := rs.mapRankSkip[findInfo.RankId]
|
||||
if ok == false || rankObj == nil {
|
||||
return fmt.Errorf("RPC_FindRankDataListStartTo[", findInfo.RankId, "] no this rank type")
|
||||
}
|
||||
|
||||
findResult.RankDataCount = rankObj.GetRankLen()
|
||||
return rankObj.GetRankDataFromToLimit(findInfo.StartPos, findInfo.Count, findResult)
|
||||
}
|
||||
|
||||
func (rs *RankService) deleteRankList(delIdList []uint64) {
|
||||
if rs.mapRankSkip == nil {
|
||||
return
|
||||
}
|
||||
|
||||
for _, id := range delIdList {
|
||||
delete(rs.mapRankSkip, id)
|
||||
}
|
||||
}
|
||||
|
||||
func (rs *RankService) dealCfg() error {
|
||||
mapDBServiceCfg, ok := rs.GetServiceCfg().(map[string]interface{})
|
||||
if ok == false {
|
||||
return nil
|
||||
}
|
||||
|
||||
cfgList, okList := mapDBServiceCfg["SortCfg"].([]interface{})
|
||||
if okList == false {
|
||||
return fmt.Errorf("RankService SortCfg must be list")
|
||||
}
|
||||
|
||||
for _, cfg := range cfgList {
|
||||
mapCfg, okCfg := cfg.(map[string]interface{})
|
||||
if okCfg == false {
|
||||
return fmt.Errorf("RankService SortCfg data must be map or struct")
|
||||
}
|
||||
|
||||
rankId, okId := mapCfg["RankID"].(float64)
|
||||
if okId == false {
|
||||
return fmt.Errorf("RankService SortCfg data must has RankID[number]")
|
||||
}
|
||||
|
||||
level, _ := mapCfg["SkipListLevel"].(float64)
|
||||
isDec, _ := mapCfg["IsDec"].(bool)
|
||||
maxRank, _ := mapCfg["MaxRank"].(float64)
|
||||
|
||||
newSkip := NewRankSkip(isDec, transformLevel(int32(level)), uint64(maxRank))
|
||||
rs.mapRankSkip[uint64(rankId)] = newSkip
|
||||
}
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user