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.
192 lines
6.4 KiB
192 lines
6.4 KiB
|
1 year ago
|
package statistics
|
||
|
|
|
||
|
|
import (
|
||
|
|
"fmt"
|
||
|
|
"server/common"
|
||
|
|
"server/db"
|
||
|
|
"server/modules/backend/app"
|
||
|
|
"server/modules/backend/models"
|
||
|
|
utils "server/modules/backend/util"
|
||
|
|
"server/modules/backend/values"
|
||
|
|
"server/util"
|
||
|
|
"strconv"
|
||
|
|
"time"
|
||
|
|
|
||
|
|
"github.com/gin-gonic/gin"
|
||
|
|
"github.com/liangdas/mqant/log"
|
||
|
|
"github.com/olivere/elastic/v7"
|
||
|
|
)
|
||
|
|
|
||
|
|
// rechargeFrequency 充值频率
|
||
|
|
func RechargeFrequency(c *gin.Context) {
|
||
|
|
a := app.NewApp(c)
|
||
|
|
defer func() {
|
||
|
|
a.Response()
|
||
|
|
}()
|
||
|
|
req := new(values.RechargeFrequencyReq)
|
||
|
|
if !a.S(req) {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
var oneDay int64 = 24 * 60 * 60
|
||
|
|
var resp values.RechargeFrequencyResp
|
||
|
|
su, eu := utils.GetQueryUnix(req.Start, req.End)
|
||
|
|
|
||
|
|
e := eu - int64(((req.Page-1)*req.Num)*24*60*60)
|
||
|
|
s := e - int64((req.Num-1)*24*60*60)
|
||
|
|
if s < su {
|
||
|
|
s = su
|
||
|
|
}
|
||
|
|
resp.Count = (eu - su) / (24 * 60 * 60)
|
||
|
|
|
||
|
|
var channelId int
|
||
|
|
if req.Channel != nil {
|
||
|
|
channelId = *req.Channel
|
||
|
|
}
|
||
|
|
|
||
|
|
// 今天的数据直接从缓存读取
|
||
|
|
now := util.GetZeroTime(time.Now()).Unix()
|
||
|
|
if su >= now {
|
||
|
|
one := values.GetRechargeFrequencyData(su, channelId)
|
||
|
|
if one == nil {
|
||
|
|
one = GetRechargeFrequency(su, req.Channel)
|
||
|
|
}
|
||
|
|
resp.List = append(resp.List, one)
|
||
|
|
} else {
|
||
|
|
one := &values.RechargeFrequency{}
|
||
|
|
q := elastic.NewBoolQuery()
|
||
|
|
q.Must(elastic.NewMatchQuery("Channel", channelId))
|
||
|
|
q.Must(elastic.NewMatchQuery("Date", su))
|
||
|
|
db.ES().QueryOne(common.ESIndexBackRechargeFrequency, q, &one)
|
||
|
|
// 两种情况需要重新拉取 1没有数据 2订单总数有变动的时候
|
||
|
|
if len(one.List) == 0 {
|
||
|
|
one = GetRechargeFrequency(su, req.Channel)
|
||
|
|
id := fmt.Sprintf("%v_%v", su, channelId)
|
||
|
|
db.ES().InsertToESByIDGO(common.ESIndexBackRechargeFrequency, id, one)
|
||
|
|
} else {
|
||
|
|
var total int64
|
||
|
|
for _, v := range one.List {
|
||
|
|
total += v.RechargeOrderCount + v.RechargeSuccessOrderCount
|
||
|
|
}
|
||
|
|
newTotal := models.GetNewRechargeOrderCountBySql2(req.Channel, su, su+oneDay) + models.GetNewRechargeSuccessOrderCountBySql2(req.Channel, su, su+oneDay)
|
||
|
|
if newTotal != total {
|
||
|
|
var hour int64 = 60 * 60
|
||
|
|
channel := req.Channel
|
||
|
|
for i := 0; i < 24; i++ {
|
||
|
|
detail := one.List[i]
|
||
|
|
// 充值玩家数量
|
||
|
|
detail.RechargePlayerCount = models.GetRechargeSuPlayerCountBySql(channel, su+int64(i)*hour, su+(int64(i)+1)*hour)
|
||
|
|
var err error
|
||
|
|
// 超过24小时的老数据不会改变
|
||
|
|
if time.Now().Unix()-(su+int64(i)*hour) < 24*hour {
|
||
|
|
// 玩家24小时内付费金额
|
||
|
|
detail.PayAmount24 = models.Get24HourNewPlayerRechargeAmount(channel, su+int64(i)*hour, su+(int64(i)+1)*hour)
|
||
|
|
// 玩家24小时付费率
|
||
|
|
point2 := utils.GetPoint2(models.Get24HourNewPlayerPayCount(channel, su+int64(i)*hour, su+(int64(i)+1)*hour), detail.RegisterPlayerCount)
|
||
|
|
detail.PayAmount24Per, err = strconv.ParseFloat(point2, 64)
|
||
|
|
if err != nil {
|
||
|
|
log.Error(err.Error())
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 玩家总付费金额
|
||
|
|
detail.PayAmountTotal = models.GetNewPlayerRechargeAmount(channel, su+int64(i)*hour, su+(int64(i)+1)*hour)
|
||
|
|
// 玩家总付费率
|
||
|
|
point3 := utils.GetPoint2(detail.RechargePlayerCount, detail.RegisterPlayerCount)
|
||
|
|
detail.PayAmountTotalPer, err = strconv.ParseFloat(point3, 64)
|
||
|
|
if err != nil {
|
||
|
|
log.Error(err.Error())
|
||
|
|
}
|
||
|
|
|
||
|
|
// 充值成功订单数
|
||
|
|
detail.RechargeSuccessOrderCount = models.GetNewRechargeSuccessOrderCountBySql2(channel, su+int64(i)*hour, su+(int64(i)+1)*hour)
|
||
|
|
// 玩家充值总订单数
|
||
|
|
detail.RechargeOrderCount = models.GetNewRechargeOrderCountBySql2(channel, su+int64(i)*hour, su+(int64(i)+1)*hour)
|
||
|
|
// 支付成功率
|
||
|
|
detail.RechargeSuccessPer, err = strconv.ParseFloat(utils.GetPoint2(detail.RechargeSuccessOrderCount, detail.RechargeOrderCount), 5)
|
||
|
|
if err != nil {
|
||
|
|
log.Error(err.Error())
|
||
|
|
}
|
||
|
|
one.List[i] = detail
|
||
|
|
}
|
||
|
|
id := fmt.Sprintf("%v_%v", su, channelId)
|
||
|
|
db.ES().DeleteByID(common.ESIndexBackRechargeFrequency, id)
|
||
|
|
db.ES().InsertToESByIDGO(common.ESIndexBackRechargeFrequency, id, one)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
resp.List = append(resp.List, one)
|
||
|
|
}
|
||
|
|
|
||
|
|
a.Data = resp
|
||
|
|
}
|
||
|
|
|
||
|
|
func GetRechargeFrequency(su int64, channel *int) *values.RechargeFrequency {
|
||
|
|
var recharge values.RechargeFrequency
|
||
|
|
var hour int64 = 60 * 60
|
||
|
|
recharge.Date = su
|
||
|
|
now := util.GetZeroTime(time.Now()).Unix()
|
||
|
|
recharge.List = make([]values.RechargeFrequencyDetail, 24)
|
||
|
|
nowHour := time.Now().Hour() + 1
|
||
|
|
recharge.Channel = 0
|
||
|
|
if channel != nil {
|
||
|
|
recharge.Channel = *channel
|
||
|
|
}
|
||
|
|
for i := 0; i < 24; i++ {
|
||
|
|
detail := values.RechargeFrequencyDetail{}
|
||
|
|
// 时间
|
||
|
|
detail.Date = su + (int64(i)+1)*hour - 30*60
|
||
|
|
|
||
|
|
// 查询今日的
|
||
|
|
if now == su && i > nowHour {
|
||
|
|
break
|
||
|
|
}
|
||
|
|
|
||
|
|
// 玩家注册数量
|
||
|
|
detail.RegisterPlayerCount = models.GetNewPlayerCountBySqlT(channel, su+int64(i)*hour, su+(int64(i)+1)*hour)
|
||
|
|
|
||
|
|
// 充值玩家数量
|
||
|
|
detail.RechargePlayerCount = models.GetRechargeSuPlayerCountBySql(channel, su+int64(i)*hour, su+(int64(i)+1)*hour)
|
||
|
|
|
||
|
|
// 当天玩家付费率
|
||
|
|
point := utils.GetPoint2(models.GetNewPlayerPayDisCount(channel, su+int64(i)*hour, su+(int64(i)+1)*hour, su+24*hour), detail.RegisterPlayerCount)
|
||
|
|
res, err := strconv.ParseFloat(point, 64)
|
||
|
|
if err != nil {
|
||
|
|
log.Error(err.Error())
|
||
|
|
}
|
||
|
|
// 新用户付费率
|
||
|
|
detail.NewPlayerRechargePer = res
|
||
|
|
|
||
|
|
// 玩家24小时内付费金额
|
||
|
|
detail.PayAmount24 = models.Get24HourNewPlayerRechargeAmount(channel, su+int64(i)*hour, su+(int64(i)+1)*hour)
|
||
|
|
// 玩家24小时付费率
|
||
|
|
point2 := utils.GetPoint2(models.Get24HourNewPlayerPayCount(channel, su+int64(i)*hour, su+(int64(i)+1)*hour), detail.RegisterPlayerCount)
|
||
|
|
detail.PayAmount24Per, err = strconv.ParseFloat(point2, 64)
|
||
|
|
if err != nil {
|
||
|
|
log.Error(err.Error())
|
||
|
|
}
|
||
|
|
|
||
|
|
// 玩家总付费金额
|
||
|
|
detail.PayAmountTotal = models.GetNewPlayerRechargeAmount(channel, su+int64(i)*hour, su+(int64(i)+1)*hour)
|
||
|
|
// 玩家总付费率
|
||
|
|
point3 := utils.GetPoint2(detail.RechargePlayerCount, detail.RegisterPlayerCount)
|
||
|
|
detail.PayAmountTotalPer, err = strconv.ParseFloat(point3, 64)
|
||
|
|
if err != nil {
|
||
|
|
log.Error(err.Error())
|
||
|
|
}
|
||
|
|
|
||
|
|
// 充值成功订单数
|
||
|
|
detail.RechargeSuccessOrderCount = models.GetNewRechargeSuccessOrderCountBySql2(channel, su+int64(i)*hour, su+(int64(i)+1)*hour)
|
||
|
|
// 玩家充值总订单数
|
||
|
|
detail.RechargeOrderCount = models.GetNewRechargeOrderCountBySql2(channel, su+int64(i)*hour, su+(int64(i)+1)*hour)
|
||
|
|
// 支付成功率
|
||
|
|
detail.RechargeSuccessPer, err = strconv.ParseFloat(utils.GetPoint2(detail.RechargeSuccessOrderCount, detail.RechargeOrderCount), 5)
|
||
|
|
if err != nil {
|
||
|
|
log.Error(err.Error())
|
||
|
|
}
|
||
|
|
|
||
|
|
recharge.List[i] = detail
|
||
|
|
}
|
||
|
|
|
||
|
|
return &recharge
|
||
|
|
}
|