|
@@ -1,8 +1,13 @@
|
|
package models
|
|
package models
|
|
|
|
|
|
import (
|
|
import (
|
|
|
|
+ "fmt"
|
|
mhayaTime "github.com/mhaya/extend/time"
|
|
mhayaTime "github.com/mhaya/extend/time"
|
|
"github.com/mhaya/game/game_cluster/internal/data"
|
|
"github.com/mhaya/game/game_cluster/internal/data"
|
|
|
|
+ "github.com/mhaya/game/game_cluster/internal/guid"
|
|
|
|
+ clog "github.com/mhaya/logger"
|
|
|
|
+ "math/rand"
|
|
|
|
+ "time"
|
|
)
|
|
)
|
|
|
|
|
|
type PlayerLevelStat struct {
|
|
type PlayerLevelStat struct {
|
|
@@ -28,46 +33,59 @@ type PlayerCountryStat struct {
|
|
}
|
|
}
|
|
|
|
|
|
type Preserve struct {
|
|
type Preserve struct {
|
|
- ID int64 `json:"id"`
|
|
|
|
- Num int `json:"num"`
|
|
|
|
- Ratio float64 `json:"ratio"`
|
|
|
|
|
|
+ ID int64 `json:"id"`
|
|
|
|
+ Num int `json:"num"`
|
|
|
|
+ Ratio string `json:"ratio"`
|
|
}
|
|
}
|
|
|
|
|
|
var preserveConfig = []int64{2, 3, 7, 15, 30}
|
|
var preserveConfig = []int64{2, 3, 7, 15, 30}
|
|
|
|
|
|
// GetPlayerPreserve 获取用户留存
|
|
// GetPlayerPreserve 获取用户留存
|
|
-func GetPlayerPreserve(startTime, EndTime int64) {
|
|
|
|
|
|
+func GetPlayerPreserve(startTime, EndTime int64) map[int64][]*Preserve {
|
|
if startTime > mhayaTime.Now().Unix() || EndTime > mhayaTime.Now().Unix() {
|
|
if startTime > mhayaTime.Now().Unix() || EndTime > mhayaTime.Now().Unix() {
|
|
- return
|
|
|
|
|
|
+ return nil
|
|
}
|
|
}
|
|
- sTime := mhayaTime.CreateFromTimestamp(startTime).DailyTOTimeStamp()
|
|
|
|
|
|
+ sTime := mhayaTime.CreateFromTimestamp(startTime).TOTimeStamp()
|
|
|
|
|
|
if EndTime > mhayaTime.Now().Unix() {
|
|
if EndTime > mhayaTime.Now().Unix() {
|
|
EndTime = mhayaTime.Now().Unix()
|
|
EndTime = mhayaTime.Now().Unix()
|
|
}
|
|
}
|
|
- eTime := mhayaTime.CreateFromTimestamp(EndTime).DailyTOTimeStamp()
|
|
|
|
- mhayaTime.CreateFromTimestamp(sTime).DiffInDays(mhayaTime.CreateFromTimestamp(eTime))
|
|
|
|
|
|
+ eTime := mhayaTime.CreateFromTimestamp(EndTime).TOTimeStamp()
|
|
|
|
+ day := mhayaTime.CreateFromTimestamp(sTime).DiffInDays(mhayaTime.CreateFromTimestamp(eTime))
|
|
|
|
+ if day > 7 {
|
|
|
|
+ return nil
|
|
|
|
+ }
|
|
|
|
+ var ret = make(map[int64][]*Preserve, 0)
|
|
|
|
+ for i := 0; i < int(day); i++ {
|
|
|
|
+ curTime := mhayaTime.CreateFromTimestamp(sTime).Add(time.Duration(i) * 24 * time.Hour).Unix()
|
|
|
|
+ ret[curTime] = PlayerPreserve(curTime)
|
|
|
|
+ }
|
|
|
|
+ return ret
|
|
}
|
|
}
|
|
|
|
|
|
-func PlayerPreserve(startTime, day int64) {
|
|
|
|
|
|
+func PlayerPreserve(startTime int64) []*Preserve {
|
|
var preserve []*Preserve
|
|
var preserve []*Preserve
|
|
- _, curNum := GetNewPlayerMap(startTime, DailyRecordNewRegistered)
|
|
|
|
- if curNum < 1 {
|
|
|
|
- return
|
|
|
|
- }
|
|
|
|
|
|
+ cur, curNum := GetNewPlayerMap(startTime, DailyRecordNewRegistered)
|
|
|
|
|
|
- preserve = append(preserve, &Preserve{ID: 1, Num: curNum, Ratio: 100})
|
|
|
|
|
|
+ preserve = append(preserve, &Preserve{ID: 1, Num: curNum, Ratio: "100%"})
|
|
|
|
|
|
for _, v := range preserveConfig {
|
|
for _, v := range preserveConfig {
|
|
- if day < v {
|
|
|
|
- preserve = append(preserve, &Preserve{ID: v, Num: 0, Ratio: 0})
|
|
|
|
|
|
+ nextTime := mhayaTime.CreateFromTimestamp(startTime).Add(time.Duration(v-1) * 24 * time.Hour).Unix()
|
|
|
|
+ next, nextNum := GetNewPlayerMap(nextTime, DailyRecordOldLogin)
|
|
|
|
+ if nextNum == 0 {
|
|
|
|
+ preserve = append(preserve, &Preserve{ID: v, Num: 0, Ratio: ""})
|
|
} else {
|
|
} else {
|
|
- // nextTime := mhayaTime.CreateFromTimestamp(startTime).AddDays(int(v) - 1)
|
|
|
|
- //next, nextNum := GetNewPlayerMap(startTime, DailyRecordOldLogin)
|
|
|
|
- preserve = append(preserve, &Preserve{ID: v, Num: 1, Ratio: 0})
|
|
|
|
|
|
+ var num int
|
|
|
|
+ for key, _ := range next {
|
|
|
|
+ if _, ok := cur[key]; ok {
|
|
|
|
+ num++
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ preserve = append(preserve, &Preserve{ID: v, Num: num, Ratio: fmt.Sprintf("%.2f", float64(num)/float64(curNum)*100)})
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
|
|
+ return preserve
|
|
}
|
|
}
|
|
|
|
|
|
func GetNewPlayerMap(startTime int64, op int) (map[string]struct{}, int) {
|
|
func GetNewPlayerMap(startTime int64, op int) (map[string]struct{}, int) {
|
|
@@ -92,3 +110,19 @@ func GetNewPlayerMap(startTime int64, op int) (map[string]struct{}, int) {
|
|
}
|
|
}
|
|
return user, len(user)
|
|
return user, len(user)
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+func TestPreserve(startTime int64, num int) {
|
|
|
|
+ sTime := mhayaTime.CreateFromTimestamp(startTime).TOTimeStamp()
|
|
|
|
+ for i := 0; i < num; i++ {
|
|
|
|
+ userID := guid.Next()
|
|
|
|
+ clog.Debugf("num=%v, user =%v", i, userID)
|
|
|
|
+ SetAppointDailyRecordNewUserRegisterHash("ios", "tg", userID, "1", sTime, DailyRecordNewRegistered)
|
|
|
|
+ for _, v := range preserveConfig {
|
|
|
|
+ r := rand.Intn(100)
|
|
|
|
+ if r < 80 {
|
|
|
|
+ nextTime := mhayaTime.CreateFromTimestamp(sTime).Add(time.Duration(v-1) * 24 * time.Hour).Unix()
|
|
|
|
+ SetAppointDailyRecordNewUserRegisterHash("ios", "tg", userID, "1", nextTime, DailyRecordOldLogin)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|