retained.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. package events
  2. import (
  3. "fmt"
  4. "os"
  5. "bufio"
  6. "io"
  7. "time"
  8. "strings"
  9. // "log"
  10. "box-gm/utils"
  11. "github.com/tealeg/xlsx"
  12. "github.com/astaxie/beego"
  13. )
  14. var RetainedDays = []int{2,3,4,5,6,7,14,30}
  15. func is_match_retained_day(day int) bool {
  16. for _, v := range RetainedDays {
  17. if v == day {
  18. return true
  19. }
  20. }
  21. return false
  22. }
  23. func Retained_get_day_name(day int) string {
  24. if day == 2 {
  25. return "次留"
  26. }
  27. return fmt.Sprintf("%d留", day)
  28. }
  29. // 日留存分布
  30. func Retaied_get_day_count(date string , serverId string) map[int]int {
  31. var rdCount = make(map[int]int)
  32. var playerRegisterDays = make(map[int]int)
  33. f, err := os.Open(fmt.Sprintf("%s/login-%s.log", utils.GetKeyConf("events", "path"), date))
  34. if err != nil {
  35. return rdCount
  36. }
  37. defer f.Close()
  38. loc, _ := time.LoadLocation("Local")
  39. theTime, _ := time.ParseInLocation("2006-01-02 15:04:05", date + " 00:00:00", loc)
  40. buff := bufio.NewReader(f)
  41. for {
  42. line, err := buff.ReadString('\n')
  43. if err != nil || io.EOF == err {
  44. break
  45. }
  46. line = strings.TrimSpace(line)
  47. arr := strings.Split(line, ";")
  48. if serverId == "0" || arr[1] == serverId {
  49. uid := utils.StringToInt(arr[2])
  50. arrCnt := strings.Split(arr[3], ",")
  51. registeTime := utils.StringToInt(arrCnt[0])
  52. currTime := int(theTime.Unix())
  53. registeDay := utils.GetDiffDays(registeTime, currTime) + 1
  54. playerRegisterDays[uid] = registeDay
  55. }
  56. }
  57. // log.Printf("Retaied_get_day_count date[%s] playerRegisterDays[%v]", date, playerRegisterDays)
  58. // 留存分布
  59. for _, v := range RetainedDays {
  60. rdCount[v] = 0
  61. }
  62. for _, v := range playerRegisterDays {
  63. if is_match_retained_day(v) {
  64. rdCount[v] ++
  65. }
  66. }
  67. return rdCount
  68. }
  69. // 过往留存
  70. func Retained_get_range_count(days int, serverId string) ([]*tgSeries, []string) {
  71. var arrCate []string
  72. var mRdCount = make(map[int][]int)
  73. currTime := time.Now()
  74. d, _ := time.ParseDuration("-24h")
  75. startTime := int(currTime.Add(d * time.Duration(days)).Unix())
  76. dayCount := 0
  77. for {
  78. tiEvent := startTime + 86400*dayCount
  79. date := time.Unix(int64(tiEvent), 0).Format("2006-01-02")
  80. arrCate = append(arrCate, date)
  81. mDayCount := Retaied_get_day_count(date, serverId)
  82. for _, v := range RetainedDays {
  83. mRdCount[v] = append(mRdCount[v], mDayCount[v])
  84. }
  85. dayCount ++
  86. if dayCount > days {
  87. break
  88. }
  89. }
  90. var series []*tgSeries
  91. for k, v := range mRdCount {
  92. item := &tgSeries{}
  93. item.Name = Retained_get_day_name(k)
  94. item.Data = v
  95. series = append(series, item)
  96. }
  97. return series, arrCate
  98. }
  99. // 保存文件
  100. func Save_retained_records(series []*tgSeries, arrCate []string, user string) string {
  101. var file *xlsx.File
  102. var sheet *xlsx.Sheet
  103. var row *xlsx.Row
  104. var err error
  105. file = xlsx.NewFile()
  106. sheet, err = file.AddSheet("留存分布")
  107. if err != nil {
  108. beego.Warn(err)
  109. return ""
  110. }
  111. row = sheet.AddRow()
  112. row.AddCell().Value = "留存"
  113. row.AddCell().Value = "日期"
  114. row.AddCell().Value = "人数"
  115. for i := 0; i < len(series); i++ {
  116. item := series[i]
  117. for k, v := range item.Data {
  118. if v > 0 {
  119. row = sheet.AddRow()
  120. row.AddCell().SetString(item.Name)
  121. row.AddCell().SetString(arrCate[k])
  122. row.AddCell().SetInt(v)
  123. }
  124. }
  125. }
  126. name := fmt.Sprintf("./static/统计-留存-%s.xlsx", user)
  127. os.Remove(name)
  128. err = file.Save(name)
  129. if err != nil {
  130. beego.Warn(err)
  131. return ""
  132. }
  133. return name
  134. }