428 lines
14 KiB
Go
428 lines
14 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"sort"
|
|
"time"
|
|
|
|
"github.com/spf13/viper"
|
|
"mongo.games.com/goserver/core/logger"
|
|
"mongo.games.com/goserver/core/mongox"
|
|
"mongo.games.com/goserver/core/mysqlx"
|
|
"mongo.games.com/goserver/core/viperx"
|
|
|
|
"mongo.games.com/game/statistics/task/gamefree"
|
|
"mongo.games.com/game/statistics/task/task"
|
|
)
|
|
|
|
const (
|
|
ExcelTypeNewPlayerBankrupt = iota // 新用户游戏破产率
|
|
ExcelTypeGameTimeAvg // 新用户平均游戏时长
|
|
ExcelTypeGameCountAvg // 新用户平均局数
|
|
ExcelTypeGameRate // 平均倍数
|
|
ExcelTypeActiveRate // 活跃破产率
|
|
ExcelTypeCtrlWinRate // 控输赢胜率
|
|
ExcelTypeRobotWinRate // 机器人胜率
|
|
ExcelTypeCoinAvg // 人均获得金币
|
|
ExcelTypeBankruptOffline // 破产后离线
|
|
ExcelTypeOfflineCoin // 充值当天最后金币
|
|
)
|
|
|
|
var VP *viper.Viper
|
|
|
|
func main() {
|
|
defer func() {
|
|
logger.Logger.Flush()
|
|
logger.Logger.Close()
|
|
}()
|
|
VP = viperx.GetViper("config", "yaml")
|
|
// mongo
|
|
vp := viperx.GetViper("mongo", "yaml")
|
|
// mongo初始化
|
|
conf := &mongox.Config{}
|
|
err := vp.Unmarshal(conf)
|
|
if err != nil {
|
|
panic(fmt.Errorf("mongo config error: %v", err))
|
|
}
|
|
mongox.Init(conf)
|
|
defer mongox.Close()
|
|
|
|
// mysql
|
|
vp = viperx.GetViper("mysql", "yaml")
|
|
myConf := &mysqlx.Config{}
|
|
err = vp.Unmarshal(myConf)
|
|
if err != nil {
|
|
panic(fmt.Errorf("mysql config error: %v", err))
|
|
}
|
|
mysqlx.Init(myConf)
|
|
defer mysqlx.Close()
|
|
|
|
startTime, err := time.Parse(time.RFC3339, VP.GetString("StartTime"))
|
|
if err != nil {
|
|
panic(fmt.Sprintf("time.Parse err: %v", err))
|
|
return
|
|
}
|
|
endTime, err := time.Parse(time.RFC3339, VP.GetString("EndTime"))
|
|
if err != nil {
|
|
panic(fmt.Sprintf("time.Parse err: %v", err))
|
|
return
|
|
}
|
|
|
|
mgr := NewExcelMgr()
|
|
mgr.Register(ExcelTypeNewPlayerBankrupt, []string{"日期", "场次id", "破产人数", "参与人数", "破产率"})
|
|
mgr.Register(ExcelTypeGameTimeAvg, []string{"日期", "场次id", "参与人数", "平均游戏时长"})
|
|
mgr.Register(ExcelTypeGameCountAvg, []string{"日期", "场次id", "参与人数", "平均局数"})
|
|
mgr.Register(ExcelTypeGameRate, []string{"日期", "场次id", "总局数", "平均倍数", "有炸弹分局数", "炸弹分平均倍数", "2留在手里的局数"})
|
|
mgr.Register(ExcelTypeActiveRate, []string{"日期", "场次id", "破产人数", "参与人数", "破产率"})
|
|
mgr.Register(ExcelTypeCtrlWinRate, []string{"日期", "场次id", "总局数", "平均倍数", "有炸弹分局数", "炸弹分平均倍数", "2留在手里的局数"})
|
|
mgr.Register(ExcelTypeCtrlWinRate*10, []string{"日期", "场次id", "总局数", "平均倍数", "有炸弹分局数", "炸弹分平均倍数", "2留在手里的局数"})
|
|
mgr.Register(ExcelTypeRobotWinRate, []string{"日期", "场次id", "总局数", "平均倍数", "有炸弹分局数", "炸弹分平均倍数", "2留在手里的局数"})
|
|
mgr.Register(ExcelTypeCoinAvg, []string{"日期", "场次id", "参与人数", "人均获得金币"})
|
|
mgr.Register(ExcelTypeBankruptOffline, []string{"日期", "场次id", "破产人数", "参与人数", "破产率"})
|
|
mgr.Register(ExcelTypeOfflineCoin, []string{"日期", "场次id", "破产人数", "参与人数", "破产率"})
|
|
switchArr := VP.GetIntSlice("Switch")
|
|
|
|
for {
|
|
if startTime.Unix() >= endTime.Unix() {
|
|
break
|
|
}
|
|
startTimeStr := startTime.Format(time.RFC3339)
|
|
et := startTime.AddDate(0, 0, 1)
|
|
endTimeStr := et.Format(time.RFC3339)
|
|
logger.Logger.Infof("startTime: %v endTime: %v", startTimeStr, endTimeStr)
|
|
|
|
if switchArr[ExcelTypeNewPlayerBankrupt] == 1 {
|
|
// 新用户游戏破产率
|
|
mgr.GenNewPlayerBankruptRateExcel("1", startTimeStr, endTimeStr)
|
|
}
|
|
if switchArr[ExcelTypeGameTimeAvg] == 1 {
|
|
// 新用户平均游戏时长
|
|
mgr.GenNewPlayerGameTimeAvgExcel("1", startTimeStr, endTimeStr)
|
|
}
|
|
if switchArr[ExcelTypeGameCountAvg] == 1 {
|
|
// 新用户平均局数
|
|
mgr.GenGameCountExcel("1", startTimeStr, endTimeStr)
|
|
}
|
|
if switchArr[ExcelTypeGameRate] == 1 {
|
|
// 平均倍数
|
|
mgr.GenGameRateExcel("1", startTimeStr, endTimeStr)
|
|
}
|
|
if switchArr[ExcelTypeActiveRate] == 1 {
|
|
// 活跃破产率
|
|
mgr.GenActiveBankruptRateExcel("1", startTimeStr, endTimeStr)
|
|
}
|
|
if switchArr[ExcelTypeCtrlWinRate] == 1 {
|
|
// 控赢胜率
|
|
mgr.GenCtrlWinRateExcel("1", startTimeStr, endTimeStr)
|
|
}
|
|
if switchArr[ExcelTypeRobotWinRate] == 1 {
|
|
// 机器人胜率
|
|
mgr.GenRobotWinRateExcel("1", startTimeStr, endTimeStr)
|
|
}
|
|
if switchArr[ExcelTypeCoinAvg] == 1 {
|
|
// 人均获得金币
|
|
mgr.GenCoinAvgExcel("1", startTimeStr, endTimeStr)
|
|
}
|
|
if switchArr[ExcelTypeBankruptOffline] == 1 {
|
|
// 破产后离线
|
|
mgr.GenBankruptOfflineExcel("1", startTimeStr, endTimeStr)
|
|
}
|
|
if switchArr[ExcelTypeOfflineCoin] == 1 {
|
|
// 离线金币
|
|
mgr.GenOfflineCoinExcel("1", startTimeStr, endTimeStr)
|
|
}
|
|
|
|
startTime = et
|
|
}
|
|
|
|
mgr.SaveAll(VP.GetString("StartTime")[:10], endTime.AddDate(0, 0, -1).Format(time.DateOnly))
|
|
}
|
|
|
|
func (e *ExcelMgr) SaveAll(startTime, endTime string) {
|
|
switchArr := VP.GetIntSlice("Switch")
|
|
if switchArr[ExcelTypeNewPlayerBankrupt] == 1 {
|
|
e.Save(ExcelTypeNewPlayerBankrupt, fmt.Sprintf("新用户破产率_%s_%s.xlsx", startTime, endTime))
|
|
}
|
|
if switchArr[ExcelTypeGameTimeAvg] == 1 {
|
|
e.Save(ExcelTypeGameTimeAvg, fmt.Sprintf("新用户平局游戏时长_%s_%s.xlsx", startTime, endTime))
|
|
}
|
|
if switchArr[ExcelTypeGameCountAvg] == 1 {
|
|
e.Save(ExcelTypeGameCountAvg, fmt.Sprintf("新用户平均局数_%s_%s.xlsx", startTime, endTime))
|
|
}
|
|
if switchArr[ExcelTypeGameRate] == 1 {
|
|
e.Save(ExcelTypeGameRate, fmt.Sprintf("平均倍数_%s_%s.xlsx", startTime, endTime))
|
|
}
|
|
if switchArr[ExcelTypeActiveRate] == 1 {
|
|
e.Save(ExcelTypeActiveRate, fmt.Sprintf("活跃破产率_%s_%s.xlsx", startTime, endTime))
|
|
}
|
|
if switchArr[ExcelTypeCtrlWinRate] == 1 {
|
|
e.Save(ExcelTypeCtrlWinRate, fmt.Sprintf("控赢胜率_%s_%s.xlsx", startTime, endTime))
|
|
e.Save(ExcelTypeCtrlWinRate*10, fmt.Sprintf("控输胜率_%s_%s.xlsx", startTime, endTime))
|
|
}
|
|
if switchArr[ExcelTypeRobotWinRate] == 1 {
|
|
e.Save(ExcelTypeRobotWinRate, fmt.Sprintf("机器人输率_%s_%s.xlsx", startTime, endTime))
|
|
}
|
|
if switchArr[ExcelTypeCoinAvg] == 1 {
|
|
e.Save(ExcelTypeCoinAvg, fmt.Sprintf("人均获得金币_%s_%s.xlsx", startTime, endTime))
|
|
}
|
|
if switchArr[ExcelTypeBankruptOffline] == 1 {
|
|
e.Save(ExcelTypeBankruptOffline, fmt.Sprintf("破产后离线_%s_%s.xlsx", startTime, endTime))
|
|
}
|
|
if switchArr[ExcelTypeOfflineCoin] == 1 {
|
|
e.Save(ExcelTypeOfflineCoin, fmt.Sprintf("离线金币_%s_%s.xlsx", startTime, endTime))
|
|
}
|
|
}
|
|
|
|
func GetGameFreeName(id int) string {
|
|
d := gamefree.PBDB_GameFreeMgr.GetData(int32(id))
|
|
return fmt.Sprintf("%s_%s", d.Name, d.Title)
|
|
}
|
|
|
|
func (e *ExcelMgr) GenNewPlayerBankruptRateExcel(plt string, startTime, endTime string) {
|
|
for _, v := range VP.GetIntSlice("Gamefreeids") {
|
|
_, a, b, err := task.NewPlayerBankruptRate(plt, startTime, endTime, v)
|
|
if err != nil {
|
|
logger.Logger.Errorf("NewPlayerBankruptRate get StartTime:%v EndTime:%v GameFreeId:%v err: %v", startTime, endTime, v, err)
|
|
continue
|
|
}
|
|
ex := e.Get(ExcelTypeNewPlayerBankrupt)
|
|
ex.NewLine()
|
|
ex.SetCell(startTime[:10])
|
|
ex.SetCell(GetGameFreeName(v))
|
|
ex.SetCell(a)
|
|
ex.SetCell(b)
|
|
if b > 0 {
|
|
ex.SetCell(float64(a) / float64(b))
|
|
} else {
|
|
ex.SetCell(0)
|
|
}
|
|
logger.Logger.Tracef("NewPlayerBankruptRate GameFreeId: %v rate: %v", v, float64(a)/float64(b))
|
|
}
|
|
}
|
|
|
|
func (e *ExcelMgr) GenNewPlayerGameTimeAvgExcel(plt string, startTime, endTime string) {
|
|
for _, v := range VP.GetIntSlice("Gamefreeids") {
|
|
a, b, err := task.NewPlayerGameTimeAvg(plt, startTime, endTime, v)
|
|
if err != nil {
|
|
logger.Logger.Errorf("NewPlayerGameTimeAvg get StartTime:%v EndTime:%v GameFreeId:%v err: %v", startTime, endTime, v, err)
|
|
continue
|
|
}
|
|
ex := e.Get(ExcelTypeGameTimeAvg)
|
|
ex.NewLine()
|
|
ex.SetCell(startTime[:10])
|
|
ex.SetCell(GetGameFreeName(v))
|
|
ex.SetCell(a)
|
|
if a > 0 {
|
|
avg := float64(b) / float64(a)
|
|
show := fmt.Sprintf("%v", time.Second*time.Duration(avg))
|
|
ex.SetCell(show)
|
|
} else {
|
|
ex.SetCell(0)
|
|
}
|
|
logger.Logger.Tracef("NewPlayerGameTimeAvg GameFreeId: %v avg: %v", v, float64(b)/float64(a))
|
|
}
|
|
}
|
|
|
|
func (e *ExcelMgr) GenGameCountExcel(plt string, startTime, endTime string) {
|
|
for _, v := range VP.GetIntSlice("Gamefreeids") {
|
|
a, b, err := task.NewPlayerGameCountAvg(plt, startTime, endTime, v)
|
|
if err != nil {
|
|
logger.Logger.Errorf("NewPlayerGameCountAvg get StartTime:%v EndTime:%v GameFreeId:%v err: %v", startTime, endTime, v, err)
|
|
continue
|
|
}
|
|
ex := e.Get(ExcelTypeGameCountAvg)
|
|
ex.NewLine()
|
|
ex.SetCell(startTime[:10])
|
|
ex.SetCell(GetGameFreeName(v))
|
|
ex.SetCell(a)
|
|
if a > 0 {
|
|
ex.SetCell(float64(b) / float64(a))
|
|
} else {
|
|
ex.SetCell(0)
|
|
}
|
|
logger.Logger.Tracef("NewPlayerGameCountAvg GameFreeId: %v avg: %v", v, float64(b)/float64(a))
|
|
}
|
|
}
|
|
|
|
func (e *ExcelMgr) GenGameRateExcel(plt string, startTime, endTime string) {
|
|
for _, v := range VP.GetIntSlice("Gamefreeids") {
|
|
total, bombTotal, remain2Total, rateAvg, bombRateAvg, err := task.PlayerGameRate(plt, startTime, endTime, v)
|
|
if err != nil {
|
|
logger.Logger.Errorf("PlayerGameRate get StartTime:%v EndTime:%v GameFreeId:%v err: %v", startTime, endTime, v, err)
|
|
continue
|
|
}
|
|
ex := e.Get(ExcelTypeGameRate)
|
|
ex.NewLine()
|
|
ex.SetCell(startTime[:10])
|
|
ex.SetCell(GetGameFreeName(v))
|
|
ex.SetCell(total)
|
|
ex.SetCell(rateAvg)
|
|
ex.SetCell(bombTotal)
|
|
ex.SetCell(bombRateAvg)
|
|
ex.SetCell(remain2Total)
|
|
logger.Logger.Tracef("PlayerGameRate GameFreeId: %v total: %v rateAvg: %v bombTotal: %v bombRateAvg: %v remain2Total: %v",
|
|
v, total, rateAvg, bombTotal, bombRateAvg, remain2Total)
|
|
}
|
|
}
|
|
|
|
func (e *ExcelMgr) GenActiveBankruptRateExcel(plt string, startTime, endTime string) {
|
|
for _, v := range VP.GetIntSlice("Gamefreeids") {
|
|
b, t, err := task.ActivePlayerBankruptRate(plt, startTime, endTime, v)
|
|
if err != nil {
|
|
logger.Logger.Errorf("ActivePlayerBankruptRate get StartTime:%v EndTime:%v GameFreeId:%v err: %v", startTime, endTime, v, err)
|
|
continue
|
|
}
|
|
|
|
ex := e.Get(ExcelTypeActiveRate)
|
|
ex.NewLine()
|
|
ex.SetCell(startTime[:10])
|
|
ex.SetCell(GetGameFreeName(v))
|
|
ex.SetCell(b)
|
|
ex.SetCell(t)
|
|
if t > 0 {
|
|
if b > t {
|
|
b = t
|
|
}
|
|
ex.SetCell(float64(b) / float64(t))
|
|
} else {
|
|
ex.SetCell(0)
|
|
}
|
|
logger.Logger.Tracef("ActivePlayerBankruptRate GameFreeId: %v rate: %v", v, float64(b)/float64(t))
|
|
}
|
|
}
|
|
|
|
func (e *ExcelMgr) GenCtrlWinRateExcel(plt string, startTime, endTime string) {
|
|
for _, v := range append(VP.GetIntSlice("Tienlen")) {
|
|
ret, err := task.GameDetailWinRate(plt, startTime, endTime, v)
|
|
if err != nil {
|
|
logger.Logger.Errorf("GameDetailWinRate get StartTime:%v EndTime:%v GameFreeId:%v err: %v", startTime, endTime, v, err)
|
|
continue
|
|
}
|
|
if len(ret) > 0 {
|
|
ex := e.Get(ExcelTypeCtrlWinRate)
|
|
ex.NewLine()
|
|
ex.SetCell(startTime[:10])
|
|
ex.SetCell(GetGameFreeName(v))
|
|
ex.SetCell(ret[0].First)
|
|
ex.SetCell(ret[0].Second)
|
|
ex.SetCell(ret[0].Third)
|
|
ex.SetCell(ret[0].Total)
|
|
if ret[0].Total > 0 {
|
|
ex.SetCell(float64(ret[0].First+ret[0].Second) / float64(ret[0].Total))
|
|
} else {
|
|
ex.SetCell(0)
|
|
}
|
|
logger.Logger.Tracef("GameDetailWinRate GameFreeId:%v %+v", v, ret[0])
|
|
}
|
|
if len(ret) > 1 {
|
|
ex := e.Get(ExcelTypeCtrlWinRate * 10)
|
|
ex.NewLine()
|
|
ex.SetCell(startTime[:10])
|
|
ex.SetCell(GetGameFreeName(v))
|
|
ex.SetCell(ret[1].First)
|
|
ex.SetCell(ret[1].Second)
|
|
ex.SetCell(ret[1].Third)
|
|
ex.SetCell(ret[1].Total)
|
|
if ret[1].Total > 0 {
|
|
ex.SetCell(float64(ret[1].First+ret[1].Second) / float64(ret[1].Total))
|
|
} else {
|
|
ex.SetCell(0)
|
|
}
|
|
logger.Logger.Tracef("GameDetailWinRate GameFreeId:%v %+v", v, ret[1])
|
|
}
|
|
}
|
|
}
|
|
|
|
func (e *ExcelMgr) GenRobotWinRateExcel(plt string, startTime, endTime string) {
|
|
for _, v := range append(VP.GetIntSlice("Tienlen"), VP.GetIntSlice("Thirteen")...) {
|
|
a, b, err := task.RobotWinRate(plt, startTime, endTime, v)
|
|
if err != nil {
|
|
logger.Logger.Errorf("RobotWinRate get StartTime:%v EndTime:%v GameFreeId:%v err: %v", startTime, endTime, v, err)
|
|
continue
|
|
}
|
|
|
|
ex := e.Get(ExcelTypeRobotWinRate)
|
|
ex.NewLine()
|
|
ex.SetCell(startTime[:10])
|
|
ex.SetCell(GetGameFreeName(v))
|
|
ex.SetCell(a)
|
|
ex.SetCell(b)
|
|
if b > 0 {
|
|
ex.SetCell(float64(b-a) / float64(b))
|
|
} else {
|
|
ex.SetCell(0)
|
|
}
|
|
logger.Logger.Tracef("RobotWinRate GameFreeId: %v rate: %v", v, float64(a)/float64(b))
|
|
}
|
|
}
|
|
|
|
func (e *ExcelMgr) GenCoinAvgExcel(plt string, startTime, endTime string) {
|
|
type KV struct {
|
|
K int
|
|
V string
|
|
}
|
|
|
|
var list []KV
|
|
for k, v := range task.CoinName {
|
|
list = append(list, KV{K: k, V: v})
|
|
}
|
|
|
|
sort.Slice(list, func(i, j int) bool {
|
|
return list[i].K < list[j].K
|
|
})
|
|
|
|
for _, item := range list {
|
|
k, v := item.K, item.V
|
|
a, b, err := task.CoinAvg(plt, startTime, endTime, k)
|
|
if err != nil {
|
|
logger.Logger.Errorf("CoinAvg get StartTime:%v EndTime:%v tp:%v err: %v", startTime, endTime, k, err)
|
|
continue
|
|
}
|
|
ex := e.Get(ExcelTypeCoinAvg)
|
|
ex.NewLine()
|
|
ex.SetCell(startTime[:10])
|
|
ex.SetCell(v)
|
|
ex.SetCell(a)
|
|
ex.SetCell(b)
|
|
if a > 0 {
|
|
ex.SetCell(float64(b) / float64(a))
|
|
} else {
|
|
ex.SetCell(0)
|
|
}
|
|
logger.Logger.Tracef("CoinAvg tp: %v rate: %v", k, float64(b)/float64(a))
|
|
}
|
|
}
|
|
|
|
func (e *ExcelMgr) GenBankruptOfflineExcel(plt string, startTime, endTime string) {
|
|
res, err := task.BankruptOffline(plt, startTime, endTime)
|
|
if err != nil {
|
|
logger.Logger.Errorf("BankruptOffline get StartTime:%v EndTime:%v err: %v", startTime, endTime, err)
|
|
return
|
|
}
|
|
ex := e.Get(ExcelTypeBankruptOffline)
|
|
ex.NewLine()
|
|
ex.SetCell(startTime[:10])
|
|
ex.SetCell(res.One)
|
|
ex.SetCell(res.Two)
|
|
ex.SetCell(res.Three)
|
|
ex.SetCell(res.Recharge)
|
|
ex.SetCell(fmt.Sprintf("%v", res.D))
|
|
logger.Logger.Tracef("BankruptOffline %+v", res)
|
|
}
|
|
|
|
func (e *ExcelMgr) GenOfflineCoinExcel(plt string, startTime, endTime string) {
|
|
res, err := task.OfflineCoin(plt, startTime, endTime)
|
|
if err != nil {
|
|
logger.Logger.Errorf("OfflineCoin get StartTime:%v EndTime:%v err: %v", startTime, endTime, err)
|
|
return
|
|
}
|
|
for _, v := range res {
|
|
ex := e.Get(ExcelTypeOfflineCoin)
|
|
ex.NewLine()
|
|
ex.SetCell(startTime[:10])
|
|
ex.SetCell(v.Snid)
|
|
ex.SetCell(v.Coin)
|
|
}
|
|
logger.Logger.Tracef("OfflineCoin %+v", res)
|
|
}
|