onlinetime.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package events
  2. import (
  3. "fmt"
  4. "os"
  5. "bufio"
  6. "io"
  7. "strings"
  8. "math"
  9. "box-gm/utils"
  10. "time"
  11. // "log"
  12. "github.com/tealeg/xlsx"
  13. "github.com/astaxie/beego"
  14. )
  15. // 玩家等级分布
  16. func OnlineTime_get_day_time_count(date string, minutes int, serverId string) (map[int]int, int) {
  17. var timeCount = make(map[int]int)
  18. f, err := os.Open(fmt.Sprintf("%s/logout-%s.log", utils.GetKeyConf("events", "path"), date))
  19. if err != nil {
  20. return timeCount, 0
  21. }
  22. defer f.Close()
  23. maxIndex := 0
  24. buff := bufio.NewReader(f)
  25. for {
  26. line, err := buff.ReadString('\n')
  27. if err != nil || io.EOF == err {
  28. break
  29. }
  30. line = strings.TrimSpace(line)
  31. arr := strings.Split(line, ";")
  32. if serverId == "0" || arr[1] == serverId {
  33. sec := utils.StringToInt(arr[3])
  34. index := int(math.Ceil(float64(sec)/float64(minutes*60)))
  35. timeCount[index] ++
  36. if index > maxIndex {
  37. maxIndex = index
  38. }
  39. }
  40. }
  41. return timeCount, maxIndex
  42. }
  43. func OnlineTime_get_range_day_time_count(days int, minutes int, serverId string) ([]*tgSeries, []string) {
  44. var series []*tgSeries
  45. currTime := int(time.Now().Unix())
  46. dayCount := 0
  47. maxCategories := 0
  48. for {
  49. tiEvent := currTime - 86400*dayCount
  50. date := time.Unix(int64(tiEvent), 0).Format("2006-01-02")
  51. // m, _ := time.ParseDuration("1m")
  52. item := &tgSeries{}
  53. item.Name = date
  54. glCount, maxIndex := OnlineTime_get_day_time_count(date, minutes, serverId)
  55. for i:=0; i <= maxIndex; i++ {
  56. item.Data = append(item.Data, glCount[i])
  57. }
  58. item.MapCount = glCount
  59. // log.Printf("item[%v]", item)
  60. series = append(series, item)
  61. if maxIndex > maxCategories {
  62. maxCategories = maxIndex
  63. }
  64. dayCount ++
  65. if dayCount > days {
  66. break
  67. }
  68. }
  69. var arrCate []string
  70. for i:=0; i < maxCategories + 5; i++ {
  71. arrCate = append(arrCate, fmt.Sprintf("%d分钟", i*minutes))
  72. }
  73. return series, arrCate
  74. }
  75. // 保存文件
  76. func Save_onlinetime_records(series []*tgSeries, minutes int, user string) string {
  77. var file *xlsx.File
  78. var sheet *xlsx.Sheet
  79. var row *xlsx.Row
  80. var err error
  81. file = xlsx.NewFile()
  82. sheet, err = file.AddSheet("在线时长")
  83. if err != nil {
  84. beego.Warn(err)
  85. return ""
  86. }
  87. row = sheet.AddRow()
  88. row.AddCell().Value = "日期"
  89. row.AddCell().Value = "时长"
  90. row.AddCell().Value = "人数"
  91. for i := 0; i < len(series); i++ {
  92. item := series[i]
  93. for k, v := range item.MapCount {
  94. row = sheet.AddRow()
  95. row.AddCell().SetString(item.Name)
  96. row.AddCell().SetString(fmt.Sprintf("%d分钟", k*minutes))
  97. row.AddCell().SetInt(v)
  98. }
  99. }
  100. name := fmt.Sprintf("./static/统计-在线时长-%s.xlsx", user)
  101. os.Remove(name)
  102. err = file.Save(name)
  103. if err != nil {
  104. beego.Warn(err)
  105. return ""
  106. }
  107. // log.Printf("Save_onlinetime_records minutes[%d]", minutes)
  108. return name
  109. }