diff --git a/statistics/task/etc/config.yaml b/statistics/task/etc/config.yaml index dc134c6..8b39ca9 100644 --- a/statistics/task/etc/config.yaml +++ b/statistics/task/etc/config.yaml @@ -1,17 +1,18 @@ -StartTime: "2024-11-26T00:00:00+08:00" -EndTime: "2024-11-27T00:00:00+08:00" +StartTime: "2024-12-19T00:00:00+08:00" +EndTime: "2024-12-20T00:00:00+08:00" Switch: # 1: open, 0: close - 0 # 新用户游戏破产率 - 0 # 新用户平均游戏时长 + - 1 # 用户平均游戏时长 - 0 # 新用户平均局数 - 0 # 平均倍数 - - 1 # 活跃破产率 - - 1 # 控输赢胜率 - - 1 # 机器人胜率 - - 1 # 人均获得金币 - - 1 # 破产后离线 - - 1 # 充值玩家金币余额 + - 0 # 活跃破产率 + - 0 # 控输赢胜率 + - 0 # 机器人胜率 + - 0 # 人均获得金币 + - 0 # 破产后离线 + - 0 # 充值玩家金币余额 Gamefreeids: - 2070001 diff --git a/statistics/task/main.go b/statistics/task/main.go index bb555b8..6d7f433 100644 --- a/statistics/task/main.go +++ b/statistics/task/main.go @@ -18,6 +18,7 @@ import ( const ( ExcelTypeNewPlayerBankrupt = iota // 新用户游戏破产率 ExcelTypeGameTimeAvg // 新用户平均游戏时长 + ExcelTypeGameTimeAllAvg // 用户平均游戏时长 ExcelTypeGameCountAvg // 新用户平均局数 ExcelTypeGameRate // 平均倍数 ExcelTypeActiveRate // 活跃破产率 @@ -71,6 +72,7 @@ func main() { mgr := NewExcelMgr() mgr.Register(ExcelTypeNewPlayerBankrupt, []string{"日期", "场次id", "破产人数", "参与人数", "破产率"}) mgr.Register(ExcelTypeGameTimeAvg, []string{"日期", "场次id", "参与人数", "平均游戏时长"}) + mgr.Register(ExcelTypeGameTimeAllAvg, []string{"日期", "场次id", "参与人数", "平均游戏时长"}) mgr.Register(ExcelTypeGameCountAvg, []string{"日期", "场次id", "参与人数", "平均局数"}) mgr.Register(ExcelTypeGameRate, []string{"日期", "场次id", "总局数", "平均倍数", "有炸弹分局数", "炸弹分平均倍数", "2留在手里的局数"}) mgr.Register(ExcelTypeActiveRate, []string{"日期", "场次id", "破产人数", "参与人数", "破产率"}) @@ -99,6 +101,10 @@ func main() { // 新用户平均游戏时长 mgr.GenNewPlayerGameTimeAvgExcel("1", startTimeStr, endTimeStr) } + if switchArr[ExcelTypeGameTimeAllAvg] == 1 { + // 用户平均游戏时长 + mgr.GenPlayerGameTimeAvgExcel("1", startTimeStr, endTimeStr) + } if switchArr[ExcelTypeGameCountAvg] == 1 { // 新用户平均局数 mgr.GenGameCountExcel("1", startTimeStr, endTimeStr) @@ -144,7 +150,10 @@ func (e *ExcelMgr) SaveAll(startTime, endTime string) { e.Save(ExcelTypeNewPlayerBankrupt, fmt.Sprintf("新用户破产率_%s_%s.xlsx", startTime, endTime)) } if switchArr[ExcelTypeGameTimeAvg] == 1 { - e.Save(ExcelTypeGameTimeAvg, fmt.Sprintf("新用户平局游戏时长_%s_%s.xlsx", startTime, endTime)) + e.Save(ExcelTypeGameTimeAvg, fmt.Sprintf("新用户平均游戏时长_%s_%s.xlsx", startTime, endTime)) + } + if switchArr[ExcelTypeGameTimeAllAvg] == 1 { + e.Save(ExcelTypeGameTimeAllAvg, fmt.Sprintf("用户平均游戏时长_%s_%s.xlsx", startTime, endTime)) } if switchArr[ExcelTypeGameCountAvg] == 1 { e.Save(ExcelTypeGameCountAvg, fmt.Sprintf("新用户平均局数_%s_%s.xlsx", startTime, endTime)) @@ -223,6 +232,29 @@ func (e *ExcelMgr) GenNewPlayerGameTimeAvgExcel(plt string, startTime, endTime s } } +func (e *ExcelMgr) GenPlayerGameTimeAvgExcel(plt string, startTime, endTime string) { + for _, v := range VP.GetIntSlice("Gamefreeids") { + a, b, err := task.PlayerGameTimeAvg(plt, startTime, endTime, v) + if err != nil { + logger.Logger.Errorf("PlayerGameTimeAvg get StartTime:%v EndTime:%v GameFreeId:%v err: %v", startTime, endTime, v, err) + continue + } + ex := e.Get(ExcelTypeGameTimeAllAvg) + 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("PlayerGameTimeAvg 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) diff --git a/statistics/task/task/bankruptcy.go b/statistics/task/task/bankruptcy.go index ea4212d..b1d144a 100644 --- a/statistics/task/task/bankruptcy.go +++ b/statistics/task/task/bankruptcy.go @@ -45,6 +45,37 @@ func GetNewPayerIds(plt string, startTime, endTime string) ([]int, error) { return ret, nil } +func GetPayerIds(plt string, startTime, endTime string) ([]int, error) { + s, e := common.StrRFC3339TimeToTime(startTime), common.StrRFC3339TimeToTime(endTime) + c, err := mymongo.GetLogCollection(plt, mongomodel.LogGamePlayerListLog) + if err != nil { + return nil, err + } + + var res []struct{ Snid int } + dd, err := c.Aggregate(context.TODO(), bson.A{ + bson.M{"$match": bson.M{"time": bson.M{"$gte": s, "$lt": e}}}, + bson.M{"$group": bson.M{"_id": "$snid", "snid": bson.M{"$first": "$snid"}}}, + }) + if err != nil { + if errors.Is(err, mongo.ErrNoDocuments) { + return nil, nil + } + logger.Logger.Errorf("find game player snid get err: %v", err) + return nil, err + } + if err := dd.All(context.TODO(), &res); err != nil { + logger.Logger.Errorf("find game player snid decode err: %v", err) + return nil, err + } + var ret []int + for _, v := range res { + ret = append(ret, v.Snid) + } + logger.Logger.Tracef("find game player snid: %v", ret) + return ret, nil +} + // 场次破产总人数 func GameFreeIdBankruptPlayerCount(plt string, ids []int, startTime, endTime string, gamefreeid int) (int, error) { s, e := common.StrRFC3339TimeToTime(startTime), common.StrRFC3339TimeToTime(endTime) diff --git a/statistics/task/task/gametime.go b/statistics/task/task/gametime.go index 3c184c7..cc73a3b 100644 --- a/statistics/task/task/gametime.go +++ b/statistics/task/task/gametime.go @@ -102,3 +102,33 @@ func NewPlayerGameTimeAvg(plt string, startTime, endTime string, gamefreeid int) } return b, a, err } + +func PlayerGameTimeAvg(plt string, startTime, endTime string, gamefreeid int) (int, int, error) { + s, e := common.StrRFC3339TimeToTime(startTime), common.StrRFC3339TimeToTime(endTime) + if s.IsZero() || e.IsZero() { + return 0, 0, fmt.Errorf("time format error") + } + ids, err := GetPayerIds(plt, startTime, endTime) + if err != nil { + return 0, 0, err + } + if len(ids) == 0 { + return 0, 0, nil + } + a, _, err := NewPlayerGameTime(plt, ids, startTime, endTime, gamefreeid) + if err != nil { + return 0, 0, err + } + if len(ids) == 0 { + return 0, 0, nil + } + + b, err := PlayingGameCount(plt, ids, startTime, endTime, gamefreeid) + if err != nil { + return 0, 0, err + } + if b == 0 { + return 0, 0, nil + } + return b, a, err +}