印度包网
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

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
}