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 }