123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- package events
- import (
- "fmt"
- "os"
- "bufio"
- "io"
- "time"
- "strings"
- // "log"
- "box-gm/utils"
- "github.com/tealeg/xlsx"
- "github.com/astaxie/beego"
- )
- var RetainedDays = []int{2,3,4,5,6,7,14,30}
- func is_match_retained_day(day int) bool {
- for _, v := range RetainedDays {
- if v == day {
- return true
- }
- }
- return false
- }
- func Retained_get_day_name(day int) string {
- if day == 2 {
- return "次留"
- }
- return fmt.Sprintf("%d留", day)
- }
- // 日留存分布
- func Retaied_get_day_count(date string , serverId string) map[int]int {
- var rdCount = make(map[int]int)
- var playerRegisterDays = make(map[int]int)
-
- f, err := os.Open(fmt.Sprintf("%s/login-%s.log", utils.GetKeyConf("events", "path"), date))
- if err != nil {
- return rdCount
- }
- defer f.Close()
-
- loc, _ := time.LoadLocation("Local")
- theTime, _ := time.ParseInLocation("2006-01-02 15:04:05", date + " 00:00:00", loc)
- buff := bufio.NewReader(f)
- for {
- line, err := buff.ReadString('\n')
- if err != nil || io.EOF == err {
- break
- }
- line = strings.TrimSpace(line)
- arr := strings.Split(line, ";")
- if serverId == "0" || arr[1] == serverId {
- uid := utils.StringToInt(arr[2])
- arrCnt := strings.Split(arr[3], ",")
- registeTime := utils.StringToInt(arrCnt[0])
- currTime := int(theTime.Unix())
- registeDay := utils.GetDiffDays(registeTime, currTime) + 1
- playerRegisterDays[uid] = registeDay
- }
- }
- // log.Printf("Retaied_get_day_count date[%s] playerRegisterDays[%v]", date, playerRegisterDays)
- // 留存分布
- for _, v := range RetainedDays {
- rdCount[v] = 0
- }
- for _, v := range playerRegisterDays {
- if is_match_retained_day(v) {
- rdCount[v] ++
- }
- }
- return rdCount
- }
- // 过往留存
- func Retained_get_range_count(days int, serverId string) ([]*tgSeries, []string) {
- var arrCate []string
- var mRdCount = make(map[int][]int)
- currTime := time.Now()
- d, _ := time.ParseDuration("-24h")
- startTime := int(currTime.Add(d * time.Duration(days)).Unix())
- dayCount := 0
- for {
- tiEvent := startTime + 86400*dayCount
- date := time.Unix(int64(tiEvent), 0).Format("2006-01-02")
- arrCate = append(arrCate, date)
- mDayCount := Retaied_get_day_count(date, serverId)
- for _, v := range RetainedDays {
- mRdCount[v] = append(mRdCount[v], mDayCount[v])
- }
- dayCount ++
- if dayCount > days {
- break
- }
- }
-
- var series []*tgSeries
- for k, v := range mRdCount {
- item := &tgSeries{}
- item.Name = Retained_get_day_name(k)
- item.Data = v
-
- series = append(series, item)
- }
- return series, arrCate
- }
- // 保存文件
- func Save_retained_records(series []*tgSeries, arrCate []string, user string) string {
- var file *xlsx.File
- var sheet *xlsx.Sheet
- var row *xlsx.Row
- var err error
- file = xlsx.NewFile()
- sheet, err = file.AddSheet("留存分布")
- if err != nil {
- beego.Warn(err)
- return ""
- }
- row = sheet.AddRow()
- row.AddCell().Value = "留存"
- row.AddCell().Value = "日期"
- row.AddCell().Value = "人数"
- for i := 0; i < len(series); i++ {
- item := series[i]
- for k, v := range item.Data {
- if v > 0 {
- row = sheet.AddRow()
- row.AddCell().SetString(item.Name)
- row.AddCell().SetString(arrCate[k])
- row.AddCell().SetInt(v)
- }
- }
- }
- name := fmt.Sprintf("./static/统计-留存-%s.xlsx", user)
- os.Remove(name)
- err = file.Save(name)
- if err != nil {
- beego.Warn(err)
- return ""
- }
- return name
- }
|