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.
198 lines
6.1 KiB
198 lines
6.1 KiB
package statistics |
|
|
|
import ( |
|
"fmt" |
|
"server/common" |
|
"server/db" |
|
"server/modules/backend/app" |
|
"server/modules/backend/bdb" |
|
"server/modules/backend/models" |
|
utils "server/modules/backend/util" |
|
"server/modules/backend/values" |
|
"server/util" |
|
"sort" |
|
"sync" |
|
"time" |
|
|
|
"github.com/gin-gonic/gin" |
|
) |
|
|
|
// 数据总览 |
|
func PlatformData(c *gin.Context) { |
|
a := app.NewApp(c) |
|
defer func() { |
|
a.Response() |
|
}() |
|
req := new(values.PlatformDataReq) |
|
if !a.S(req) { |
|
return |
|
} |
|
resp := values.PlatformDataResp{} |
|
cids := []*int{} |
|
if req.Channel != nil { |
|
cids = []*int{req.Channel} |
|
} else if len(a.User.SChannels) > 0 { |
|
for i := range a.User.SChannels { |
|
cids = append(cids, &a.User.SChannels[i]) |
|
} |
|
} |
|
var oneDay int64 = 24 * 60 * 60 |
|
|
|
su, eu := utils.GetQueryUnix(req.Start, req.End) |
|
if eu-su > 60*oneDay { |
|
a.Code = values.CodeParam |
|
return |
|
} |
|
zeroTime := util.GetZeroTime(time.Now()).Unix() |
|
resp.Count = (eu - su) / (24 * 60 * 60) |
|
|
|
list := []*values.PlatformData{} |
|
cid := -1 |
|
if len(cids) == 0 { |
|
cid = 0 |
|
} else if len(cids) == 1 { |
|
cid = *cids[0] |
|
} |
|
if cid >= 0 { |
|
bdb.BackDB.QueryAll(fmt.Sprintf("Time >= %d and Time <= %d and PlatformID = %d", su, eu, cid), "", &values.PlatformData{}, &list) |
|
} |
|
// 协程并发查询 |
|
resp.PlatformData = make([]*values.PlatformData, resp.Count) |
|
step := 0 |
|
group := new(sync.WaitGroup) |
|
group.Add(int(resp.Count)) |
|
for i := su; i < eu; i += oneDay { |
|
tmp := step |
|
t := i |
|
util.Go(func() { |
|
var one *values.PlatformData |
|
if cid < 0 { |
|
one = GetPlatformData(t, t+oneDay, cids...) |
|
} else { |
|
for _, v := range list { |
|
if v.Time == t { |
|
one = v |
|
break |
|
} |
|
} |
|
tag := one == nil |
|
|
|
if tag || !one.Check { |
|
one = GetPlatformData(t, t+oneDay, &cid) |
|
one.Check = true |
|
// 当天数据不缓存 |
|
if t >= zeroTime { |
|
one.Check = false |
|
} |
|
if tag { |
|
bdb.BackDB.Create(one) |
|
} else { |
|
bdb.BackDB.UpdateW(&values.PlatformData{}, one, fmt.Sprintf("Time = %d and PlatformID = %d", t, cid)) |
|
} |
|
} |
|
} |
|
resp.PlatformData[tmp] = one |
|
group.Done() |
|
}) |
|
step++ |
|
} |
|
group.Wait() |
|
sort.Slice(resp.PlatformData, func(i, j int) bool { |
|
return resp.PlatformData[i].Time > resp.PlatformData[j].Time |
|
}) |
|
|
|
left := (req.Page - 1) * req.Num |
|
right := req.Page * req.Num |
|
if right > len(resp.PlatformData) { |
|
right = len(resp.PlatformData) |
|
} |
|
resp.PlatformData = resp.PlatformData[left:right] |
|
a.Data = resp |
|
} |
|
|
|
func GetPlatformData(start, end int64, platform ...*int) *values.PlatformData { |
|
ret := &values.PlatformData{} |
|
if len(platform) == 1 { |
|
ret.PlatformID = *platform[0] |
|
if ret.PlatformID == 0 { |
|
platform = []*int{} |
|
} |
|
} |
|
ret.Time = start |
|
ret.Date = time.Unix(start, 0).Format("20060102") |
|
|
|
// 新增安装数 |
|
ret.DownloadCount = models.GetDownloadCounts(&start, &end, platform...) |
|
// 完成注册数 |
|
ret.NewCount = models.GetNewPlayerCountBySqls(start, end, platform...) |
|
|
|
// 新增注册率 = 新增注册用户/新增安装用户 |
|
// 计算去重注册人数 |
|
sqlNew := fmt.Sprintf("SELECT count(DISTINCT(deviceid)) FROM users WHERE birth >= %v and birth < %v %v", start, end, models.PackChannels(platform...)) |
|
var disNewCount int64 |
|
db.Mysql().C().Raw(sqlNew).Scan(&disNewCount) |
|
ret.NewRegisterPer = utils.GetPer(disNewCount, ret.DownloadCount) |
|
// 新增付费人数 |
|
ret.NewPayCount = models.GetNewPayCountBySqls(start, end, platform...) |
|
// 新增付费复充人数 |
|
ret.NewPayRepeatCount = models.GetNewPayRepeatCountBySqls(start, end, platform...) |
|
// 新增付费率 = 新增付费人数/新增注册人数 |
|
ret.NewPayPer = utils.GetPer(ret.NewPayCount, ret.NewCount) |
|
// 新增付费次数 |
|
ret.NewPayCountAll = models.GetNewPayCounts(start, end, platform...) |
|
// 新户复充率 |
|
ret.NewPayMultiPer = utils.GetPer(models.GetNewMultiPayCountBySqls(start, end, platform...), ret.NewPayCount) |
|
// 新增充值总额 |
|
ret.NewPayAmount = models.GetNewPayAmountBySqls(start, end, common.CurrencyINR, platform...) |
|
// 新增arppu |
|
ret.NewPayARPPU = utils.GetPoint(ret.NewPayAmount, ret.NewPayCount*common.DecimalDigits) |
|
// 新增赠送人数 |
|
ret.NewWithdrawCount = models.GetNewWithdrawPlayerNum(start, end, platform...) |
|
// 新增赠送总额 |
|
ret.NewWithdrawTotal = models.GetNewWithdrawAmount(start, end, platform...) |
|
// 新增赠送比例 |
|
ret.NewWithdrawPer = utils.GetPer(ret.NewWithdrawTotal, ret.NewPayAmount) |
|
// 老用户付费人数 |
|
ret.OldPayCount = models.GetOldPayCountBySqls(start, end, platform...) |
|
// 老用户付费次数 |
|
ret.OldPayCountAll = models.GetOldPayCounts(start, end, platform...) |
|
// 老户复充率 |
|
ret.OldPayMultiPer = utils.GetPer(models.GetOldMultiPayCountBySqls(start, end, platform...), ret.OldPayCount) |
|
// 老用户付费金额 |
|
ret.OldPayAmount = models.GetOldPayAmountBySqls(start, end, common.CurrencyINR, platform...) |
|
// 老户ARPPU |
|
ret.OldPayARPPU = utils.GetPoint(ret.OldPayAmount, ret.OldPayCount*common.DecimalDigits) |
|
// 老户赠送人数 |
|
ret.OldWithdrawCount = models.GetOldWithdrawplayerNum(start, end, platform...) |
|
// 老户总赠送 |
|
ret.OldWithdrawTotal = models.GetOldWithdrawAmount(start, end, platform...) |
|
// 老户赠送比例 |
|
ret.OldWithdrawPer = utils.GetPer(ret.OldWithdrawTotal, ret.OldPayAmount) |
|
// 总付费人数 |
|
ret.PayCount = ret.NewPayCount + ret.OldPayCount |
|
// 总付费 |
|
ret.RechargeTotal = ret.NewPayAmount + ret.OldPayAmount |
|
// 总ARPPU |
|
ret.PayARPPU = utils.GetPoint(ret.RechargeTotal, ret.PayCount*common.DecimalDigits) |
|
// 总赠送人数 |
|
ret.WithdrawPlayerNum = ret.NewWithdrawCount + ret.OldWithdrawCount |
|
// 总赠送 |
|
ret.WithdrawTotal = ret.NewWithdrawTotal + ret.OldWithdrawTotal |
|
// 总赠送比例 |
|
ret.WithdrawPer = utils.GetPer(ret.WithdrawTotal, ret.RechargeTotal) |
|
// 总投注 |
|
ret.PlatformBet = models.GetGameInOut(start, end, 1, platform...) |
|
// 总返奖 |
|
ret.PlatformSettle = models.GetGameInOut(start, end, 2, platform...) |
|
// 厂商投注 |
|
ret.ProviderBet = ret.PlatformBet |
|
// 厂商返奖 |
|
ret.ProviderSettle = ret.PlatformSettle |
|
// 活跃留存 |
|
ret.ActiveKeep = models.GetKeepPer(1, ret.Date, start, platform...) |
|
// 总付费留存 |
|
ret.RechargeKeep = models.GetKeepPer(2, ret.Date, start, platform...) |
|
// 新增付费留存 |
|
ret.NewRechargeKeep = models.GetKeepPer(3, ret.Date, start, platform...) |
|
return ret |
|
}
|
|
|