game_sync/statistics/task/main.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)
}