331 lines
10 KiB
Go
331 lines
10 KiB
Go
package walletser
|
|
|
|
import (
|
|
"91porn-server/common/constant/redisconst"
|
|
"encoding/json"
|
|
"fmt"
|
|
"strconv"
|
|
"sync"
|
|
"time"
|
|
|
|
"91porn-server/app/appg"
|
|
"91porn-server/common"
|
|
"91porn-server/common/log"
|
|
"91porn-server/common/timeutil"
|
|
"91porn-server/models/commod"
|
|
"91porn-server/models/v/proxymod"
|
|
"91porn-server/models/v/txnmod"
|
|
"91porn-server/models/v/usermod"
|
|
"91porn-server/models/v/walletmod"
|
|
|
|
"github.com/shopspring/decimal"
|
|
)
|
|
|
|
// UserInviteAmountInfo 用户账户信息
|
|
type UserInviteAmountInfo struct {
|
|
TotalAmount string `json:"totalAmount" bson:"totalAmount"` // 可提现收益
|
|
TotalIncomeAmount string `json:"totalIncomeAmount" bson:"totalIncomeAmount"` // 累计收益总额
|
|
TotalPayUserCount string `json:"totalPayUserCount" bson:"totalPayUserCount"` // 累计付费用户
|
|
TotalInviteUserCount string `json:"totalInviteUserCount" bson:"totalInviteUserCount"` // 累计推广用户
|
|
TodayInviteUserCount string `json:"todayInviteUserCount" bson:"todayInviteUserCount"` // 今日推广用户
|
|
MonthInviteUserCount string `json:"monthInviteUserCount" bson:"monthInviteUserCount"` // 当月推广用户
|
|
TodayIncomeAmount string `json:"todayIncomeAmount" bson:"todayIncomeAmount"` // 今日推广收益金币
|
|
MonthIncomeAmount string `json:"monthIncomeAmount" bson:"monthIncomeAmount"` // 当月推广收益金币
|
|
}
|
|
|
|
type VideoIncomeListRes struct {
|
|
TotalVideoAmount string `json:"totalVideoAmount"`
|
|
TodayTodayAmount string `json:"todayTodayAmount"`
|
|
YesterdayAmount string `json:"yesterdayAmount"`
|
|
MounthAmount string `json:"mounthAmount"`
|
|
HasNext bool `json:"hasNext"`
|
|
List []VideoIncomeInfo `json:"list"`
|
|
}
|
|
|
|
type VideoIncomeInfo struct {
|
|
Title string `json:"Title"` // 金币
|
|
IncomeAmount string `json:"incomeAmount"` // 收入金币
|
|
IncomeType int `json:"incomeType"` // 收入类型
|
|
IncomeTime time.Time `json:"incomeTime"` // 时间
|
|
}
|
|
|
|
func GetUserAmount(uid uint64) (resp *UserInviteAmountInfo, err error) {
|
|
data := UserInviteAmountInfo{}
|
|
str, err := appg.Redis.Get(redisconst.InviteCacheKey(uid))
|
|
if err != nil {
|
|
return
|
|
}
|
|
if str != nil {
|
|
if err = json.Unmarshal([]byte(*str), &data); err == nil {
|
|
return &data, nil
|
|
}
|
|
log.Warn(fmt.Sprintf("用户ID:%d;解析缓存数据异常:%v", uid, err))
|
|
}
|
|
|
|
var (
|
|
income string
|
|
todayInviteAmount float64
|
|
monthInviteAmount float64
|
|
proxyTotalIncome float64
|
|
monthInviteUserCount int64
|
|
toadyInviteUserCount int64
|
|
totalInviteUserCount int64
|
|
totalPayUserCount int64
|
|
)
|
|
nowTime := time.Now()
|
|
startD, endD := timeutil.EarlyLastDay(nowTime)
|
|
monthStartTime, _ := timeutil.EarlyLastMonth(nowTime)
|
|
var wg sync.WaitGroup
|
|
wg.Add(7)
|
|
common.Go(func() {
|
|
defer wg.Done()
|
|
w, _ := walletmod.GetWallet(uid)
|
|
if w == nil {
|
|
return
|
|
}
|
|
income = (decimal.NewFromInt(w.Income).Add(decimal.NewFromFloat(w.IncomePot))).Div(decimal.NewFromInt(10)).String()
|
|
//vidTotalIncome = w.VidIncome
|
|
proxyTotalIncome = w.ProxyIncome
|
|
})
|
|
common.Go(func() {
|
|
defer wg.Done()
|
|
totalInviteUserCount, err = proxymod.CountByUID(uid)
|
|
if err != nil {
|
|
return
|
|
}
|
|
})
|
|
common.Go(func() {
|
|
defer wg.Done()
|
|
totalPayUserCount, err = proxymod.CountPayUserByUID(uid)
|
|
if err != nil {
|
|
return
|
|
}
|
|
})
|
|
common.Go(func() {
|
|
defer wg.Done()
|
|
monthInviteUserCount, err = proxymod.CountByUIDAndTime(uid, monthStartTime)
|
|
if err != nil {
|
|
return
|
|
}
|
|
})
|
|
common.Go(func() {
|
|
defer wg.Done()
|
|
toadyInviteUserCount, err = proxymod.CountByUIDAndTime(uid, startD)
|
|
if err != nil {
|
|
return
|
|
}
|
|
})
|
|
|
|
common.Go(func() {
|
|
defer wg.Done()
|
|
// 今日成功推广金额
|
|
todayInviteAmount, _, _ = txnmod.GetIncomeByType(uid, txnmod.ProxyIncome, startD, endD)
|
|
})
|
|
common.Go(func() {
|
|
defer wg.Done()
|
|
// 当月成功推广金额
|
|
monthInviteAmount, _, _ = txnmod.GetIncomeByType(uid, txnmod.ProxyIncome, monthStartTime, endD)
|
|
})
|
|
|
|
wg.Wait()
|
|
data.TotalAmount = income
|
|
data.TotalIncomeAmount = strconv.FormatFloat(proxyTotalIncome/10, 'f', 2, 64)
|
|
data.TotalPayUserCount = strconv.FormatInt(totalPayUserCount, 10)
|
|
data.TotalInviteUserCount = strconv.FormatInt(totalInviteUserCount, 10)
|
|
data.TodayInviteUserCount = strconv.FormatInt(toadyInviteUserCount, 10)
|
|
data.MonthInviteUserCount = strconv.FormatInt(monthInviteUserCount, 10)
|
|
data.TodayIncomeAmount = strconv.FormatFloat(todayInviteAmount/10, 'f', 2, 64)
|
|
data.MonthIncomeAmount = strconv.FormatFloat(monthInviteAmount/10, 'f', 2, 64)
|
|
|
|
// 加入缓存
|
|
common.Go(func() {
|
|
dataInfo, err := json.Marshal(&data)
|
|
if err != nil {
|
|
log.Warn(fmt.Sprintf("用户ID:%d;json序列化缓存数据异常:%v", uid, err))
|
|
return
|
|
}
|
|
if err = appg.Redis.Set(redisconst.InviteCacheKey(uid), dataInfo, 2*time.Minute); err != nil {
|
|
log.Warn(fmt.Sprintf("用户ID:%d;保存缓存数据异常:%v", uid, err))
|
|
}
|
|
})
|
|
return &data, nil
|
|
}
|
|
|
|
func GetVideoIncomelist(uid, pageNumber, pageSize uint64) (resp VideoIncomeListRes, err error) {
|
|
var vidIncomeToday float64
|
|
var vidIncomeMonth float64
|
|
var vidTotalIncome float64
|
|
var vidYesterdayIncome float64
|
|
now := time.Now()
|
|
resp = VideoIncomeListRes{
|
|
List: make([]VideoIncomeInfo, 0),
|
|
}
|
|
startM, endM := timeutil.EarlyLastMonth(now)
|
|
startD, endD := timeutil.EarlyLastDay(now)
|
|
startY, endY := timeutil.YesterdayDay(now)
|
|
var wg sync.WaitGroup
|
|
wg.Add(5)
|
|
common.Go(func() { //1
|
|
defer wg.Done()
|
|
w, _ := walletmod.GetWallet(uid)
|
|
if w == nil {
|
|
return
|
|
}
|
|
vidTotalIncome = w.VidIncome
|
|
})
|
|
common.Go(func() { //2
|
|
defer wg.Done()
|
|
vidIncomeToday, _, _ = txnmod.GetIncomeByType(uid, txnmod.WorksIncome, startD, endD)
|
|
|
|
})
|
|
common.Go(func() { //3
|
|
defer wg.Done()
|
|
vidIncomeMonth, _, _ = txnmod.GetIncomeByType(uid, txnmod.WorksIncome, startM, endM)
|
|
|
|
})
|
|
common.Go(func() { //4
|
|
defer wg.Done()
|
|
vidYesterdayIncome, _, _ = txnmod.GetIncomeByType(uid, txnmod.WorksIncome, startY, endY)
|
|
|
|
})
|
|
common.Go(func() { //5
|
|
defer wg.Done()
|
|
videoList, hasNext, _ := txnmod.WorksIncomebills(uid, pageNumber, pageSize)
|
|
resp.HasNext = hasNext
|
|
for _, videotran := range videoList {
|
|
tmp := VideoIncomeInfo{
|
|
Title: videotran.Desc,
|
|
IncomeAmount: strconv.FormatFloat(videotran.ActualAmount, 'f', 2, 64),
|
|
IncomeTime: videotran.CreatedAt,
|
|
}
|
|
resp.List = append(resp.List, tmp)
|
|
}
|
|
})
|
|
wg.Wait()
|
|
resp.TotalVideoAmount = strconv.FormatFloat(vidTotalIncome, 'f', 2, 64)
|
|
resp.TodayTodayAmount = strconv.FormatFloat(vidIncomeToday, 'f', 2, 64)
|
|
resp.YesterdayAmount = strconv.FormatFloat(vidYesterdayIncome, 'f', 2, 64)
|
|
resp.MounthAmount = strconv.FormatFloat(vidIncomeMonth, 'f', 2, 64)
|
|
return resp, nil
|
|
}
|
|
|
|
type UserInviteIncomeListRes struct {
|
|
//总邀请数
|
|
TotalInvites int64 `json:"totalInvites"`
|
|
//今日邀请
|
|
TodayInvites int64 `json:"todayInvites"`
|
|
//总邀请充值
|
|
TotalInviteAmount float64 `json:"totalInviteAmount"`
|
|
//今日充值
|
|
TodayInviteAmount float64 `json:"todayInviteAmount"`
|
|
//列表总数
|
|
Total int64 `json:"total"`
|
|
//是否还有下一页
|
|
HasNext bool `json:"hasNext"`
|
|
//列表
|
|
List []UserInviteIncomeInfo `json:"list"`
|
|
}
|
|
|
|
type UserInviteIncomeInfo struct {
|
|
// 充值用户
|
|
UserName string `json:"userName"`
|
|
// 收入金币
|
|
IncomeAmount float64 `json:"incomeAmount" bson:"incomeAmount"`
|
|
// 充值时间
|
|
RechargeAt time.Time `json:"rechargeAt"`
|
|
}
|
|
|
|
func GetInviteIncomelist(uid, pageNumber, pageSize uint64) (resp UserInviteIncomeListRes, err error) {
|
|
//分页查询收益详情
|
|
txnList, hasNext, _ := txnmod.BuyProductLogWithPage(uid, txnmod.ProxyIncome, commod.Page{
|
|
PageNumber: pageNumber,
|
|
PageSize: pageSize,
|
|
})
|
|
resp.HasNext = hasNext
|
|
txnListLen := len(txnList)
|
|
uids := make([]uint64, txnListLen)
|
|
for i, tran := range txnList {
|
|
uids[i] = tran.RechargeId
|
|
}
|
|
resList := make([]UserInviteIncomeInfo, 0)
|
|
if len(uids) > 0 {
|
|
//批量查询用户信息
|
|
m, uErr := usermod.FindUsersMapByUID(uids)
|
|
if uErr == nil && len(m) > 0 {
|
|
resList = make([]UserInviteIncomeInfo, txnListLen)
|
|
for i, tran := range txnList {
|
|
tmp := UserInviteIncomeInfo{
|
|
IncomeAmount: tran.ActualAmount / 10,
|
|
RechargeAt: tran.CreatedAt,
|
|
}
|
|
if m[tran.RechargeId] != nil {
|
|
tmp.UserName = m[tran.RechargeId].Name
|
|
}
|
|
resList[i] = tmp
|
|
}
|
|
}
|
|
}
|
|
//从缓存获取其他数据
|
|
redisKey := "Get-Invite-Income-" + strconv.FormatUint(uid, 10)
|
|
str, err := appg.Redis.Get(redisKey)
|
|
if err != nil { // redis 错误不向上报告
|
|
log.Error("GetInviteIncomelist redisc.Get", log.Any("uid", uid), log.Any("redisKey", redisKey), log.E(err))
|
|
}
|
|
if str != nil {
|
|
if err = json.Unmarshal([]byte(*str), &resp); err == nil {
|
|
resp.List = resList
|
|
resp.HasNext = hasNext
|
|
return resp, nil
|
|
}
|
|
// json.Unmarshal的错误不向上报告,而是尝试去DB获取数据
|
|
log.Error("GetInviteIncomelist json.Unmarshal", log.Any("uid", uid), log.Any("redisKey", redisKey), log.E(err))
|
|
}
|
|
resp.List = resList
|
|
resp.HasNext = hasNext
|
|
now := time.Now()
|
|
resp = UserInviteIncomeListRes{
|
|
List: make([]UserInviteIncomeInfo, 0),
|
|
}
|
|
startD, endD := timeutil.EarlyLastDay(now)
|
|
var wg sync.WaitGroup
|
|
wg.Add(4)
|
|
common.Go(func() { //1
|
|
defer wg.Done()
|
|
w, _ := walletmod.GetWallet(uid)
|
|
if w == nil {
|
|
return
|
|
}
|
|
resp.TotalInviteAmount = w.ProxyIncome / 10
|
|
})
|
|
common.Go(func() { //2
|
|
defer wg.Done()
|
|
//成功推广数
|
|
resp.TotalInvites, _ = proxymod.CountByUID(uid)
|
|
//成功推广数 = 总数
|
|
resp.Total = resp.TotalInvites
|
|
})
|
|
common.Go(func() { //3
|
|
defer wg.Done()
|
|
//今日成功推广数
|
|
resp.TodayInvites, _ = proxymod.CountByUIDAndTime(uid, startD)
|
|
})
|
|
common.Go(func() { //4
|
|
defer wg.Done()
|
|
//今日成功推广金额
|
|
resp.TodayInviteAmount, _, _ = txnmod.GetIncomeByType(uid, txnmod.ProxyIncome, startD, endD)
|
|
resp.TodayInviteAmount = resp.TodayInviteAmount / 10
|
|
})
|
|
wg.Wait()
|
|
common.Go(func() {
|
|
jsonBytes, err := json.Marshal(resp)
|
|
if err != nil {
|
|
log.Error("GetInviteIncomelist json.Marshal", log.Any("uid", uid), log.E(err))
|
|
return
|
|
}
|
|
if err := appg.Redis.Set(redisKey, string(jsonBytes), 15*time.Minute); err != nil {
|
|
log.Error("GetInviteIncomelist redisc.Set", log.Any("uid", uid), log.Any("redisKey", redisKey), log.E(err))
|
|
}
|
|
})
|
|
return resp, nil
|
|
}
|