You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
3.2 KiB
100 lines
3.2 KiB
package guser |
|
|
|
import ( |
|
"fmt" |
|
"server/common" |
|
"server/db" |
|
"server/modules/backend/app" |
|
"server/modules/backend/models" |
|
utils "server/modules/backend/util" |
|
"server/modules/backend/values" |
|
"strconv" |
|
"time" |
|
|
|
"github.com/gin-gonic/gin" |
|
"github.com/liangdas/mqant/log" |
|
) |
|
|
|
func LostPlayerData(c *gin.Context) { |
|
a := app.NewApp(c) |
|
defer func() { |
|
a.Response() |
|
}() |
|
req := new(values.LostPlayerDataReq) |
|
if !a.S(req) { |
|
return |
|
} |
|
resp := values.LostPlayerDataResp{} |
|
|
|
su, eu := utils.GetQueryUnix(req.Start, req.End) |
|
var oneDay int64 = 24 * 60 * 60 |
|
now := time.Now().Unix() |
|
|
|
queryUser := " SELECT u.id, u.nick, u.bind_cash, u.cash, u.birth FROM users u LEFT JOIN (SELECT a.* FROM login_record a INNER JOIN ( SELECT uid, MAX( created_at ) created_at FROM login_record WHERE UNIX_TIMESTAMP(date) >= %d GROUP BY uid ) b ON a.uid = b.uid AND a.created_at = b.created_at WHERE a.uid = b.uid AND a.created_at = b.created_at AND UNIX_TIMESTAMP(a.date) >= %d) r ON u.id = r.uid WHERE " |
|
queryCount := " SELECT COUNT(DISTINCT(u.id)) FROM users u LEFT JOIN (SELECT a.* FROM login_record a INNER JOIN ( SELECT uid, MAX( created_at ) created_at FROM login_record WHERE UNIX_TIMESTAMP(date) >= %d GROUP BY uid ) b ON a.uid = b.uid AND a.created_at = b.created_at WHERE a.uid = b.uid AND a.created_at = b.created_at AND UNIX_TIMESTAMP(a.date) >= %d) r ON u.id = r.uid WHERE " |
|
|
|
str := fmt.Sprintf(" u.birth >= %d AND u.birth < %d ", su, eu) |
|
|
|
if req.Channel != nil { |
|
str += fmt.Sprintf(" AND u.channel_id = %d AND r.channel_id = %d", *req.Channel, *req.Channel) |
|
} |
|
|
|
// 三天未登录的用户 UNIX_TIMESTAMP('20210816') |
|
str += fmt.Sprintf(" AND (%d - UNIX_TIMESTAMP(r.date) > %d ) ", now, 3*oneDay) |
|
|
|
var count int64 |
|
err := db.Mysql().QueryBySql(fmt.Sprintf(queryCount+str, eu, eu), &count) |
|
if err != nil { |
|
log.Error(err.Error()) |
|
} |
|
|
|
str += " GROUP BY u.id " |
|
|
|
str += fmt.Sprintf(" LIMIT %d, %d ", (req.Page-1)*req.Num, req.Num) |
|
|
|
var users []common.PlayerDBInfo |
|
err = db.Mysql().QueryBySql(fmt.Sprintf(queryUser+str, eu, eu), &users) |
|
if err != nil { |
|
log.Error(err.Error()) |
|
} |
|
|
|
for i := 0; i < len(users); i++ { |
|
var lostPlayerData values.LostPlayerData |
|
lostPlayerData.Date = su |
|
lostPlayerData.Nick = users[i].Nick |
|
lostPlayerData.Uid = users[i].Id |
|
lostPlayerData.Birth = users[i].Birth |
|
|
|
var record common.LoginRecord |
|
err = db.Mysql().C().Model(&common.LoginRecord{}).Where(" uid = ?", users[i].Id).Last(&record).Error |
|
if err != nil { |
|
log.Error(err.Error()) |
|
} |
|
lostPlayerData.LastLogin = record.Time |
|
|
|
// 玩家退出金额 |
|
lostPlayerData.WithDrawAmount = models.GetWithdrawTotalByUid(&users[i].Id) |
|
|
|
// 玩家游戏局数 |
|
gameCount := make(map[string]int64) |
|
lostPlayerData.MostGameCount = gameCount |
|
|
|
// 最后三局游戏记录 |
|
event := int(common.CurrencyEventGameSettle) |
|
var balance []common.CurrencyBalance |
|
uid := strconv.Itoa(users[i].Id) |
|
_, err = models.QueryUserBalance(&uid, 0, 3, nil, nil, nil, nil, nil, req.Channel, &event, &balance) |
|
if err != nil { |
|
log.Error(err.Error()) |
|
return |
|
} |
|
for j := 0; j < len(balance); j++ { |
|
lostPlayerData.GameRecord = append(lostPlayerData.GameRecord, balance[j].Value) |
|
} |
|
|
|
resp.List = append(resp.List, lostPlayerData) |
|
} |
|
|
|
resp.Count = count |
|
a.Data = resp |
|
}
|
|
|