You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
578 lines
18 KiB
578 lines
18 KiB
package v2 |
|
|
|
import ( |
|
"context" |
|
"math" |
|
"strconv" |
|
|
|
"go-common/app/service/live/third_api/bvc" |
|
"go-common/library/sync/errgroup" |
|
|
|
"github.com/pkg/errors" |
|
|
|
v2pb "go-common/app/interface/live/app-interface/api/http/v2" |
|
"go-common/app/interface/live/app-interface/conf" |
|
"go-common/app/interface/live/app-interface/dao" |
|
relationV1 "go-common/app/interface/live/app-interface/service/v1" |
|
relationT "go-common/app/interface/live/app-interface/service/v1/relation" |
|
avV1 "go-common/app/service/live/av/api/liverpc/v1" |
|
relationRpcV1 "go-common/app/service/live/relation/api/liverpc/v1" |
|
roomV1 "go-common/app/service/live/room/api/liverpc/v1" |
|
accountM "go-common/app/service/main/account/model" |
|
actmdl "go-common/app/service/main/account/model" |
|
account "go-common/app/service/main/account/rpc/client" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
) |
|
|
|
// RelationService struct |
|
type RelationService struct { |
|
conf *conf.Config |
|
accountRPC *account.Service3 |
|
} |
|
|
|
const ( |
|
relationPageSize = 4 |
|
app536relationPageSize = 2 |
|
) |
|
|
|
// CheckLiveAnchorParams ... implementation |
|
// [app端关注首页]入参校验 |
|
func CheckLiveAnchorParams(ctx context.Context, page int64) (uid int64, relationPage int64, err error) { |
|
mid := relationT.GetUIDFromHeader(ctx) |
|
relationPage = page |
|
err = nil |
|
if mid == 0 { |
|
err = errors.WithMessage(ecode.NeedLogIn, "GET SEA PATROL FAIL") |
|
return |
|
} |
|
if page <= 0 { |
|
err = errors.WithMessage(ecode.ResourceParamErr, "GET SEA PATROL FAIL") |
|
return |
|
} |
|
return mid, relationPage, err |
|
} |
|
|
|
// LiveAnchorHomePage ... implementation |
|
// [app端关注首页]正在直播接口 |
|
func (s *IndexService) LiveAnchorHomePage(ctx context.Context, relationPage int64, build int64, platform string, quality int64) (Resp []*v2pb.MMyIdol) { |
|
List := make([]*v2pb.MyIdolItem, 0) |
|
ExtraInfo := &v2pb.MyIdolExtra{CardType: relationT.App533CardType} |
|
Resp = make([]*v2pb.MMyIdol, 0) |
|
s.MakeLiveAnchorDefaultResult(Resp, ExtraInfo) |
|
uid, relationPage, err := CheckLiveAnchorParams(ctx, relationPage) |
|
if err != nil && uid != 0 { |
|
log.Error("[LiveAnchorHomePage]CheckParamsError,uid:%d,relationPage:%d", uid, relationPage) |
|
return |
|
} |
|
wg, _ := errgroup.WithContext(ctx) |
|
relationInfo, groupList, mapUfos2Rolaids, mapRoomID2UID, AllRoomID, err := relationV1.GetAttentionListAndGroup(ctx) |
|
if err != nil { |
|
log.Error("[LiveAnchorHomePage]get_attentionList_rpc_error") |
|
return |
|
} |
|
// 获取全量room信息,不过滤 |
|
roomParams := &roomV1.RoomGetStatusInfoByUidsReq{Uids: groupList["all"], FilterOffline: 0, NeedBroadcastType: 1} |
|
// room |
|
roomResp := make(map[int64]*roomV1.RoomGetStatusInfoByUidsResp_RoomInfo) |
|
userResp := make(map[int64]*accountM.Card) |
|
roomCornerResp := make(map[int64]*roomV1.RoomPendantGetPendantByIdsResp_Result) |
|
pkResp := make(map[string]int64) |
|
wg.Go(func() error { |
|
roomResp, err = s.GetRoomInfo(ctx, roomParams) |
|
return err |
|
}) |
|
if err = wg.Wait(); nil != err { |
|
log.Error("[LiveAnchorHomePage][first_step]get_room_rpc_error") |
|
return |
|
} |
|
livingUfos := make([]int64, 0) |
|
livingRolaids := make([]int64, 0) |
|
livingRoomInfo := GetLivingRooms(roomResp) |
|
// 没有人直播 |
|
if len(livingRoomInfo) == 0 { |
|
GetLastLiveAnchorInfo(ctx, roomResp, AllRoomID, mapRoomID2UID, ExtraInfo) |
|
moduleInfoMap := s.GetAllModuleInfoMapFromCache(ctx) |
|
for _, m := range moduleInfoMap[_feedType] { |
|
Resp = append(Resp, &v2pb.MMyIdol{ModuleInfo: m, List: List, ExtraInfo: ExtraInfo}) |
|
} |
|
return |
|
} |
|
wgHasLive := &errgroup.Group{} |
|
wgHasLive, _ = errgroup.WithContext(ctx) |
|
for k, v := range livingRoomInfo { |
|
livingUfos = append(livingUfos, k) |
|
livingRolaids = append(livingRolaids, v.RoomId) |
|
} |
|
// user信息 |
|
wgHasLive.Go(func() error { |
|
userResp, err = s.GetUserInfo(ctx, livingUfos) |
|
return err |
|
}) |
|
// room |
|
roomPendentParams := &roomV1.RoomPendantGetPendantByIdsReq{Ids: livingRolaids, Type: relationT.PendentMobileBadge, Position: relationT.PendentPosition} |
|
wgHasLive.Go(func() error { |
|
roomCornerResp, err = s.GetRoomPendantInfo(ctx, roomPendentParams) |
|
return err |
|
}) |
|
// pk_id |
|
pkParams := &avV1.PkGetPkIdsByRoomIdsReq{RoomIds: livingRolaids, Platform: platform} |
|
wgHasLive.Go(func() error { |
|
pkResp, err = s.GetPkID(ctx, pkParams) |
|
return err |
|
}) |
|
if err = wgHasLive.Wait(); nil != err { |
|
log.Error("[LiveAnchorHomePage][second_step]room/main.account/pkID/rpc_error") |
|
return |
|
} |
|
attentionRoomListPlayURLMap := dao.BvcApi.GetPlayUrlMulti(ctx, livingRolaids, 0, quality, build, platform) |
|
// 下游数据收集完成 |
|
mapSp := make([]int64, 0) |
|
normalSp := make([]int64, 0) |
|
mapSp = append(mapSp, groupList["special"]...) |
|
normalSp = append(normalSp, groupList["normal"]...) |
|
List = AdaptLivingField(livingRoomInfo, roomCornerResp, userResp, relationInfo, pkResp, attentionRoomListPlayURLMap, mapSp, normalSp, mapUfos2Rolaids) |
|
ExtraInfo.TotalCount = int64(len(List)) |
|
|
|
// 注释原因:app536灰度策略,需要恢复2卡样式(之前在535已全量4卡,但是需求变了)产品:古月 |
|
// https://www.tapd.cn/20082211/prong/stories/view/1120082211001104459 |
|
|
|
// userExtParams := &userExV1.GrayRuleGetByMarkReq{Mark: relationT.App536GrayRule} |
|
// grayRule, err := relationT.GetGrayRule(ctx, userExtParams) |
|
// var UserExApp536Rule string |
|
// if err != nil { |
|
// log.Error("[LiveAnchorHomePage]get_GrayRule_rpc_error") |
|
// UserExApp536Rule = "" |
|
// } else if grayRule != nil { |
|
// UserExApp536Rule = grayRule.Content |
|
// } |
|
SliceList, page := s.SliceForHomePage(List, relationPage, uid, platform) |
|
ExtraInfo.RelationPage = page |
|
var result v2pb.MMyIdol |
|
result.ExtraInfo = ExtraInfo |
|
result.List = SliceList |
|
moduleInfoMap := s.GetAllModuleInfoMapFromCache(ctx) |
|
for _, m := range moduleInfoMap[_feedType] { |
|
Resp = append(Resp, &v2pb.MMyIdol{ModuleInfo: m, List: result.List, ExtraInfo: result.ExtraInfo}) |
|
} |
|
|
|
return |
|
} |
|
|
|
// AdaptLivingField ... implementation |
|
// [app端关注首页]填充数据 |
|
func AdaptLivingField(roomInfo map[int64]*roomV1.RoomGetStatusInfoByUidsResp_RoomInfo, |
|
roomPendentInfo map[int64]*roomV1.RoomPendantGetPendantByIdsResp_Result, |
|
userResult map[int64]*accountM.Card, |
|
relationInfo map[int64]*relationRpcV1.BaseInfoGetFollowTypeResp_UidInfo, |
|
pkIDInfo map[string]int64, playURLInfo map[int64]*bvc.PlayUrlItem, specialUID []int64, normalUID []int64, |
|
mapUfos2Rolaids map[int64]int64) (resp []*v2pb.MyIdolItem) { |
|
|
|
resp = make([]*v2pb.MyIdolItem, 0) |
|
normalResp := make([]*v2pb.MyIdolItem, 0) |
|
resp = make([]*v2pb.MyIdolItem, 0) |
|
if len(specialUID) > 0 { |
|
item := LiveFireField(roomInfo, roomPendentInfo, userResult, pkIDInfo, playURLInfo, relationInfo, specialUID, mapUfos2Rolaids) |
|
resp = AppSortRuleOnline(item) |
|
} |
|
if len(normalUID) > 0 { |
|
tempResp := LiveFireField(roomInfo, roomPendentInfo, userResult, pkIDInfo, playURLInfo, relationInfo, normalUID, mapUfos2Rolaids) |
|
normalResp = AppSortRuleOnline(tempResp) |
|
} |
|
if len(normalResp) > 0 { |
|
resp = append(resp, normalResp...) |
|
} |
|
return |
|
} |
|
|
|
// SliceForHomePage ... implementation |
|
// app534规则 [app端关注首页]首页slice逻辑,客户端只显示偶数个数,为兼容推荐去重,当个数为3时返回2 |
|
// https://www.tapd.cn/20082211/prong/stories/view/1120082211001067961 |
|
// https://www.tapd.cn/20082211/prong/stories/view/1120082211001085685 |
|
// |
|
// app536规则 https://www.tapd.cn/20082211/prong/stories/view/1120082211001104459 |
|
func (s *IndexService) SliceForHomePage(input []*v2pb.MyIdolItem, page int64, uid int64, platform string) (resp []*v2pb.MyIdolItem, relationPage int64) { |
|
resp = make([]*v2pb.MyIdolItem, 0) |
|
grayRule := s.App536ABTest(uid, platform) |
|
relationPage = page |
|
if len(input) <= 0 { |
|
return |
|
} |
|
count := int64(len(input)) |
|
|
|
// 536规则 |
|
if grayRule == 1 { |
|
|
|
switch count { |
|
case 1: |
|
{ |
|
resp = input[:] |
|
relationPage = 1 |
|
return |
|
} |
|
case 2: |
|
{ |
|
resp = input[:] |
|
relationPage = 1 |
|
return |
|
} |
|
} |
|
var pageSize int64 |
|
pageSize = page |
|
if page < 1 { |
|
pageSize = 1 |
|
} |
|
start := (pageSize - 1) * app536relationPageSize |
|
end := int64(start + app536relationPageSize) |
|
// 正常slice |
|
if end <= count { |
|
resp = input[start:end] |
|
} else { |
|
// 回环逻辑,最后一页不足pagesize时返回第一页 |
|
relationPage = 1 |
|
startIndex := 0 |
|
var startCount int64 |
|
if count > app536relationPageSize { |
|
startCount = app536relationPageSize |
|
} else { |
|
startCount = count |
|
} |
|
resp = input[startIndex:startCount] |
|
} |
|
return |
|
} |
|
|
|
// 536之前4卡逻辑 |
|
switch count { |
|
case 1: |
|
{ |
|
resp = input[:] |
|
relationPage = 1 |
|
return |
|
} |
|
case 2: |
|
{ |
|
resp = input[:] |
|
relationPage = 1 |
|
return |
|
} |
|
case 3: |
|
{ |
|
resp = input[0:2] |
|
relationPage = 1 |
|
return |
|
} |
|
} |
|
var pageSize int64 |
|
pageSize = page |
|
if page < 1 { |
|
pageSize = 1 |
|
} |
|
start := (pageSize - 1) * relationPageSize |
|
end := int64(start + relationPageSize) |
|
if end <= count { |
|
resp = input[start:end] |
|
} else { |
|
relationPage = 1 |
|
startIndex := 0 |
|
var startCount int64 |
|
if count > relationPageSize { |
|
startCount = relationPageSize |
|
} else { |
|
startCount = count |
|
} |
|
resp = input[startIndex:startCount] |
|
} |
|
return |
|
} |
|
|
|
// LiveFireField ... implementation |
|
// [app端关注首页]填充数据 |
|
func LiveFireField(roomInfo map[int64]*roomV1.RoomGetStatusInfoByUidsResp_RoomInfo, |
|
roomPendentInfo map[int64]*roomV1.RoomPendantGetPendantByIdsResp_Result, |
|
userResult map[int64]*accountM.Card, |
|
pkIDInfo map[string]int64, playURLInfo map[int64]*bvc.PlayUrlItem, |
|
relationInfo map[int64]*relationRpcV1.BaseInfoGetFollowTypeResp_UidInfo, |
|
ufos []int64, mapUfos2Rolaids map[int64]int64) (resp []*v2pb.MyIdolItem) { |
|
for _, v := range ufos { |
|
item := v2pb.MyIdolItem{} |
|
roomID, roomIDExist := mapUfos2Rolaids[v] |
|
if !roomIDExist { |
|
continue |
|
} |
|
roomItem := roomInfo[v] |
|
roomPendentItem := roomPendentInfo[roomID] |
|
userItem := userResult[v] |
|
relationItem := relationInfo[v] |
|
pkItem := pkIDInfo[strconv.Itoa(int(roomID))] |
|
playURLItem := playURLInfo[roomID] |
|
if roomItem == nil || userItem == nil || relationItem == nil { |
|
continue |
|
} |
|
PlayURL := "" |
|
PlayURL265 := "" |
|
PlayURLAcc := make([]int64, 0) |
|
PlayURLCur := 0 |
|
PendentRu := "" |
|
PendentRuColor := "" |
|
PendentRuPic := "" |
|
if playURLItem != nil { |
|
PlayURL = playURLItem.Url["h264"] |
|
PlayURL265 = playURLItem.Url["h265"] |
|
PlayURLAcc = playURLItem.AcceptQuality |
|
PlayURLCur = int(playURLItem.CurrentQuality) |
|
} |
|
if roomPendentItem != nil { |
|
PendentRu = roomPendentItem.Value |
|
PendentRuColor = roomPendentItem.BgColor |
|
PendentRuPic = roomPendentItem.BgPic |
|
} |
|
item.Roomid = roomItem.RoomId |
|
item.Uid = roomItem.Uid |
|
item.Uname = userItem.Name |
|
item.Face = userItem.Face |
|
item.Title = roomItem.Title |
|
item.LiveTagName = roomItem.AreaV2Name |
|
item.LiveTime = roomItem.LiveTime |
|
item.Online = roomItem.Online |
|
item.PlayUrl = PlayURL |
|
item.PlayUrlH265 = PlayURL265 |
|
item.AcceptQuality = PlayURLAcc |
|
item.CurrentQuality = int64(PlayURLCur) |
|
item.PkId = pkItem |
|
item.Area = roomItem.Area |
|
item.AreaName = roomItem.AreaName |
|
item.AreaV2Id = roomItem.AreaV2Id |
|
item.AreaV2Name = roomItem.AreaV2Name |
|
item.AreaV2ParentId = roomItem.AreaV2ParentId |
|
item.AreaV2ParentName = roomItem.AreaV2ParentName |
|
item.BroadcastType = roomItem.BroadcastType |
|
item.Link = relationT.LiveDomain + strconv.Itoa(int(roomID)) + relationT.BoastURL + strconv.Itoa(int(item.BroadcastType)) |
|
item.OfficialVerify = int64(RoleMap(userItem.Official.Role)) |
|
item.SpecialAttention = relationItem.Special |
|
item.PendentRu = PendentRu |
|
item.PendentRuColor = PendentRuColor |
|
item.PendentRuPic = PendentRuPic |
|
if len(roomItem.CoverFromUser) == 0 { |
|
item.Cover = roomItem.Keyframe |
|
} else { |
|
item.Cover = roomItem.CoverFromUser |
|
} |
|
resp = append(resp, &item) |
|
} |
|
return |
|
} |
|
|
|
// MakeLiveAnchorDefaultResult ... |
|
// 正在直播默认返回 |
|
func (s *IndexService) MakeLiveAnchorDefaultResult(Resp []*v2pb.MMyIdol, ExtraInfo *v2pb.MyIdolExtra) { |
|
if ExtraInfo != nil { |
|
ExtraInfo.TotalCount = 0 |
|
ExtraInfo.TagsDesc = "" |
|
ExtraInfo.UnameDesc = "" |
|
ExtraInfo.TimeDesc = "" |
|
// [历史原因]cardType只能为1,否则客户端报错,见 https://www.tapd.cn/20082211/prong/stories/view/1120082211001086997 |
|
ExtraInfo.CardType = 1 |
|
ExtraInfo.RelationPage = 1 |
|
} |
|
moduleInfoMap := s.GetAllModuleInfoMapFromCache(context.TODO()) |
|
for _, m := range moduleInfoMap[_feedType] { |
|
Resp = append(Resp, &v2pb.MMyIdol{ModuleInfo: m, List: []*v2pb.MyIdolItem{}, ExtraInfo: ExtraInfo}) |
|
} |
|
} |
|
|
|
// GetLivingRooms ... implementation |
|
// [app端关注首页]获取正在直播房间 |
|
func GetLivingRooms(roomResult map[int64]*roomV1.RoomGetStatusInfoByUidsResp_RoomInfo) (liveRoom map[int64]*roomV1.RoomGetStatusInfoByUidsResp_RoomInfo) { |
|
liveRoom = make(map[int64]*roomV1.RoomGetStatusInfoByUidsResp_RoomInfo) |
|
if len(roomResult) == 0 { |
|
return |
|
} |
|
for k, v := range roomResult { |
|
if v.LiveStatus == relationV1.RoomStatusLive { |
|
liveRoom[k] = v |
|
} |
|
} |
|
return |
|
} |
|
|
|
// CheckLiveAnchorParams implementation |
|
// 入参校验 |
|
func (s *IndexService) CheckLiveAnchorParams(ctx context.Context, req *v2pb.GetAllListReq) (uid int64, relationPage int64, err error) { |
|
if req == nil { |
|
err = ecode.LiveAnchorReqV2ParamsNil |
|
return |
|
} |
|
uid = relationT.GetUIDFromHeader(ctx) |
|
if uid == 0 { |
|
err = errors.WithMessage(ecode.NeedLogIn, "GET SEA PATROL FAIL") |
|
return |
|
} |
|
if req.RelationPage <= 0 { |
|
log.Error("CallRelationLiveAnchorV2ParamsCheckError|relationPage:%d", req.RelationPage) |
|
err = errors.WithMessage(ecode.LiveAnchorReqV2ParamsError, "GET SEA PATROL FAIL") |
|
return |
|
} |
|
return |
|
} |
|
|
|
// GetLastLiveAnchorInfo ... implementation |
|
// [app端关注首页]获取最新一次直播信息 |
|
func GetLastLiveAnchorInfo(ctx context.Context, roomResult map[int64]*roomV1.RoomGetStatusInfoByUidsResp_RoomInfo, |
|
RoomIDs []int64, RoomID2UID map[int64]int64, ExtraInfo *v2pb.MyIdolExtra) (uid int64, relationPage int64, err error) { |
|
if len(roomResult) == 0 || len(RoomIDs) == 0 || len(RoomID2UID) == 0 { |
|
return |
|
} |
|
lastLiveTime, _ := relationT.GetLastLiveTime(ctx, RoomIDs) |
|
_, _, sorted := relationV1.GetLastAnchorLiveTime(lastLiveTime) |
|
var firstRoom int64 |
|
var firstValue int64 |
|
if sorted.Len() > 0 { |
|
for _, v := range sorted { |
|
firstRoom = int64(v.Key) |
|
firstValue = int64(v.Value) |
|
break |
|
} |
|
firstUID := int64(RoomID2UID[firstRoom]) |
|
tempTime := make(map[int64]int64) |
|
if firstValue > 0 { |
|
tempTime[firstUID] = firstValue |
|
if roomItem, exist := roomResult[firstUID]; exist { |
|
ExtraInfo.UnameDesc = roomItem.Uname |
|
ExtraInfo.TagsDesc = roomItem.AreaV2Name |
|
liveDesc, _ := relationV1.TimeLineRule(tempTime, nil) |
|
ExtraInfo.TimeDesc = liveDesc[firstUID] |
|
} |
|
} |
|
} |
|
return |
|
} |
|
|
|
// GetUserInfoData ... |
|
// 调用account grpc接口cards获取用户信息 |
|
func (s *RelationService) GetUserInfoData(ctx context.Context, UIDs []int64) (userResult map[int64]*accountM.Card, err error) { |
|
|
|
rpcChunkSize, RPCTimeout, err := relationT.GetChunkInfo(relationT.AccountGRPC) |
|
params := relationT.ChunkCallInfo{ParamsName: "ufos", URLName: relationT.AccountGRPC, ChunkSize: rpcChunkSize, RPCTimeout: RPCTimeout} |
|
userResult = make(map[int64]*accountM.Card) |
|
lens := len(UIDs) |
|
if lens <= 0 { |
|
return |
|
} |
|
// 批次 |
|
params.ChunkNum = int64(math.Ceil(float64(lens) / float64(params.ChunkSize))) |
|
chunkResult := make([]map[int64]*accountM.Card, params.ChunkNum) |
|
wg, _ := errgroup.WithContext(ctx) |
|
|
|
for i := int64(1); i <= params.ChunkNum; i++ { |
|
x := i |
|
wg.Go(func() error { |
|
chunkUfosIds := make([]int64, 20) |
|
if x == params.ChunkNum { |
|
chunkUfosIds = UIDs[(x-1)*params.ChunkSize:] |
|
} else { |
|
chunkUfosIds = UIDs[(x-1)*params.ChunkSize : x*params.ChunkSize] |
|
} |
|
ret, err := s.accountRPC.Cards3(ctx, &actmdl.ArgMids{Mids: chunkUfosIds}) |
|
if err != nil { |
|
err = errors.WithMessage(ecode.AccountGRPCError, "GET SEA PATROL FAIL") |
|
log.Error("Call main.Account.Cards Error.Infos(%+v) error(%+v)", chunkUfosIds, err) |
|
} |
|
chunkResult[x-1] = ret |
|
return nil |
|
}) |
|
} |
|
if err := wg.Wait(); err != nil { |
|
erelongInfo := relationT.ErrLogStrut{} |
|
erelongInfo.ErrType = "GoRoutingWaitError" |
|
erelongInfo.URLName = relationT.AccountGRPC |
|
erelongInfo.ErrDesc = relationT.GoRoutingErr |
|
erelongInfo.Code = 1003001 |
|
erelongInfo.RPCTimeout = params.RPCTimeout |
|
erelongInfo.ErrorPtr = &err |
|
log.Error(erelongInfo.ErrType+"|"+erelongInfo.URLName+"|error:%+v"+"|Code:%d"+"|Msg:%s"+"|RPCTimeout:%d"+"|ChunkSize:%d"+"|ChunkNum:%d"+"|ParamsName:%s", |
|
*erelongInfo.ErrorPtr, erelongInfo.Code, erelongInfo.Msg, erelongInfo.RPCTimeout, erelongInfo.ChunkSize, erelongInfo.ChunkNum, params.ParamsName) |
|
err = errors.WithMessage(ecode.AccountGRPCFrameError, "GET SEA PATROL FAIL") |
|
return nil, err |
|
} |
|
// 整理数据 |
|
for _, chunkItemList := range chunkResult { |
|
for _, item := range chunkItemList { |
|
if item != nil { |
|
userResult[item.Mid] = item |
|
} |
|
} |
|
} |
|
return |
|
} |
|
|
|
// App536ABTest ... hard code配置 |
|
// ABTest |
|
func (s *IndexService) App536ABTest(mid int64, platform string) (grayType int64) { |
|
// 因为ipad屏幕尺寸较大,展示2卡会影响体验,故如果是ipad客户端则使用4卡样式,产品:tianyumo |
|
if platform == "ipad" { |
|
return 0 |
|
} |
|
mUID := mid % 100 |
|
if mUID >= 0 && mUID <= 89 { |
|
// 4卡 |
|
return 0 |
|
} |
|
return 1 |
|
} |
|
|
|
// 后台配置 |
|
// // App536ABTest ... |
|
// // ABTest |
|
// func (s *IndexService) App536ABTest(content string, mid int64) (grayType int64) { |
|
// if len(content) == 0 { |
|
// grayType = 0 |
|
// return |
|
// } |
|
// resultMap := make(map[string]int64) |
|
// resultMap["app536_4card_type"] = 0 |
|
// resultMap["app536_2card_type"] = 1 |
|
// typeMap := make([]string, 0) |
|
// mr := &[]GrayRule{} |
|
// if err := json.Unmarshal([]byte(content), mr); err != nil { |
|
// grayType = 0 |
|
// return |
|
// } |
|
// ruleArr := *mr |
|
// scoreMap := make(map[string]int) |
|
// |
|
// for _, v := range ruleArr { |
|
// scoreMap[v.Mark] = int(RParseInt(v.Value, 100)) |
|
// } |
|
// sortedScore := SortMapByValue(scoreMap) |
|
// scoreEnd := make([]int, 0) |
|
// for _, v := range sortedScore { |
|
// scoreEnd = append(scoreEnd, v.Value) |
|
// typeMap = append(typeMap, v.Key) |
|
// } |
|
// score1 := scoreEnd[0] |
|
// score2 := 100 |
|
// section1 := make(map[int]bool) |
|
// section2 := make(map[int]bool) |
|
// for section1Loop := 0; section1Loop < score1; section1Loop++ { |
|
// section1[section1Loop] = true |
|
// } |
|
// for sectionLoop2 := score1; sectionLoop2 < score2; sectionLoop2++ { |
|
// section2[sectionLoop2] = true |
|
// } |
|
// result := int(mid % 100) |
|
// if scoreEnd[0] != 0 { |
|
// if _, exist := section1[result]; exist { |
|
// grayType = resultMap[typeMap[0]] |
|
// return |
|
// } |
|
// } |
|
// if scoreEnd[1] != 0 { |
|
// if _, exist := section2[result]; exist { |
|
// grayType = resultMap[typeMap[1]] |
|
// return |
|
// } |
|
// } |
|
// grayType = 0 |
|
// return |
|
// }
|
|
|