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.
395 lines
11 KiB
395 lines
11 KiB
package handler |
|
|
|
import ( |
|
"encoding/json" |
|
"fmt" |
|
"server/call" |
|
"server/common" |
|
"server/modules/backend/app" |
|
"server/modules/backend/bdb" |
|
"server/modules/backend/models" |
|
"server/modules/backend/util" |
|
"server/modules/backend/values" |
|
"strings" |
|
"time" |
|
|
|
utils "server/util" |
|
|
|
"github.com/gin-gonic/gin" |
|
"github.com/liangdas/mqant/log" |
|
"gorm.io/gorm" |
|
) |
|
|
|
var ( |
|
RechargerFee int64 = 10 |
|
WithdrawFee int64 = 5 |
|
ChangePer int64 = 95 |
|
) |
|
|
|
// ADConfig ad配置 |
|
func ADConfig(c *gin.Context) { |
|
a := app.NewApp(c) |
|
defer func() { |
|
a.Response() |
|
}() |
|
a.DB = bdb.BackDB |
|
path := c.Request.URL.Path |
|
path = strings.ReplaceAll(path, "/advertisement/config/", "") |
|
all := strings.Split(path, "/") |
|
if len(all) > 1 || len(all) == 0 { |
|
a.Code = values.CodeRetry |
|
return |
|
} |
|
opt := all[0] |
|
element := &values.ADConfig{} |
|
list := &[]values.ADConfig{} |
|
var resp interface{} |
|
if opt == "list" { |
|
req := &values.GMConfigCommonListReq{ |
|
Condition: map[string]interface{}{}, |
|
} |
|
a.S(req) |
|
count, pass := a.MGetSqlAll(element, list, req.Condition, req.Page, req.PageSize) |
|
if !pass { |
|
return |
|
} |
|
resp = values.GMConfigCommonListResp{ |
|
Config: list, |
|
Total: count, |
|
} |
|
} else if opt == "edit" { |
|
req := new(values.GMConfigCommonEditReq) |
|
if !a.S(req) { |
|
return |
|
} |
|
if !a.MUpdateAll(req.Config, element) { |
|
return |
|
} |
|
} else if opt == "del" { |
|
req := new(values.GMConfigCommonDelReq) |
|
if !a.S(req) { |
|
return |
|
} |
|
if !a.MDel(req.ID, element) { |
|
return |
|
} |
|
} |
|
a.Data = resp |
|
} |
|
|
|
func AdvertisementStats(c *gin.Context) { |
|
a := app.NewApp(c) |
|
defer func() { |
|
a.Response() |
|
}() |
|
req := new(values.ADReq) |
|
if !a.S(req) { |
|
return |
|
} |
|
su, eu := util.GetQueryUnix(req.Start, req.End) |
|
now := utils.GetZeroTime(time.Now()).Unix() |
|
if su >= now { // 不允许查今天 |
|
a.Code = values.CodeParam |
|
a.Msg = "只能查今天之前的数据" |
|
return |
|
} |
|
if eu >= now { |
|
eu = now |
|
} |
|
|
|
resp := &values.ADResp{} |
|
a.Data = resp |
|
resp.Count = (eu - su) / (24 * 60 * 60) |
|
cids := []*int{} |
|
// isSC := len(a.User.SChannels) > 0 |
|
if len(req.ChannelID) > 0 { |
|
cids = req.ChannelID |
|
} else if req.GroupID > 0 { |
|
adConfig := &values.ADConfig{ID: req.GroupID} |
|
bdb.BackDB.Get(adConfig) |
|
channels := []int{} |
|
json.Unmarshal([]byte(adConfig.Channels), &channels) |
|
if len(channels) == 0 { |
|
a.Code = values.CodeParam |
|
a.Msg = "该投放组未分配包" |
|
return |
|
} |
|
for _, v := range channels { |
|
one := v |
|
cids = append(cids, &one) |
|
} |
|
} |
|
// else if isSC { |
|
// for i := range a.User.SChannels { |
|
// cids = append(cids, &a.User.SChannels[i]) |
|
// } |
|
// } |
|
// 如果是查一天的情况,罗列所有包 |
|
if resp.Count == 1 { |
|
if len(cids) == 1 { |
|
one := &values.ADStats{Time: su, ChannelID: *cids[0]} |
|
bdb.BackDB.Get(one) |
|
if one.ID == 0 { |
|
one = GetOneAD(su, su+24*60*60, cids) |
|
if one.Time != now { |
|
bdb.BackDB.Create(one) |
|
} |
|
} |
|
CalStats(one) |
|
resp.List = append(resp.List, *one) |
|
one.ChannelID = 0 |
|
resp.Total = *one |
|
return |
|
} |
|
if len(cids) == 0 { |
|
channels := call.GetChannelListByShow(2) |
|
for _, v := range channels { |
|
cids = append(cids, &v.ChannelID) |
|
} |
|
} |
|
list := []*values.ADStats{} |
|
bdb.BackDB.QueryAll(fmt.Sprintf("time = %d", su), "", &values.ADStats{}, &list) |
|
|
|
for _, v := range cids { |
|
var one *values.ADStats |
|
for _, j := range list { |
|
if j.ChannelID == *v { |
|
one = j |
|
break |
|
} |
|
} |
|
if one == nil { |
|
one = GetOneAD(su, su+24*60*60, []*int{v}) |
|
if one.Time != now { |
|
bdb.BackDB.Create(one) |
|
} |
|
} |
|
CalStats(one) |
|
resp.List = append(resp.List, *one) |
|
} |
|
total := &values.ADStats{} |
|
for _, v := range resp.List { |
|
CalTotal(total, &v) |
|
} |
|
CalStats(total) |
|
resp.Total = *total |
|
return |
|
} |
|
|
|
listLen := req.Num |
|
if listLen > int(resp.Count) { |
|
listLen = int(resp.Count) |
|
} |
|
resp.List = make([]values.ADStats, listLen) |
|
list := []values.ADStats{} |
|
sql := fmt.Sprintf("time >= %d and time < %d", su, eu) |
|
if len(cids) == 0 { |
|
sql += " and channel_id = 0" |
|
} else if len(cids) == 1 { |
|
sql += fmt.Sprintf(" and channel_id = %d", *cids[0]) |
|
} |
|
bdb.BackDB.QueryAll(sql, "time desc", &values.ADStats{}, &list) |
|
|
|
index := -1 |
|
start := eu - 24*60*60 - int64((req.Page-1)*req.Num)*24*60*60 |
|
end := start - int64(req.Num-1)*24*60*60 |
|
if end < su { |
|
end = su |
|
} |
|
for i := start; i >= end; i -= 24 * 60 * 60 { |
|
index++ |
|
total := &values.ADStats{} |
|
if len(cids) == 0 { |
|
find := false |
|
for _, v := range list { |
|
if v.Time != i { |
|
continue |
|
} |
|
find = true |
|
CalTotal(total, &v) |
|
break |
|
} |
|
if !find { |
|
one := GetOneAD(i, i+24*60*60, nil) |
|
if one.Time != now { |
|
bdb.BackDB.Create(one) |
|
} |
|
CalTotal(total, one) |
|
} |
|
} else { |
|
for _, cid := range cids { |
|
find := false |
|
for _, v := range list { |
|
if v.ChannelID != *cid { |
|
continue |
|
} |
|
if v.Time != i { |
|
continue |
|
} |
|
find = true |
|
CalTotal(total, &v) |
|
if len(cids) == 1 { |
|
total.ID = v.ID |
|
} |
|
break |
|
} |
|
if !find { |
|
one := GetOneAD(i, i+24*60*60, []*int{cid}) |
|
if one.Time != now { |
|
bdb.BackDB.Create(one) |
|
} |
|
CalTotal(total, one) |
|
if len(cids) == 1 { |
|
total.ID = one.ID |
|
} |
|
} |
|
} |
|
} |
|
if len(cids) == 1 { |
|
total.ChannelID = *cids[0] |
|
} |
|
CalStats(total) |
|
resp.List[index] = *total |
|
} |
|
if index < listLen-1 { |
|
resp.List = resp.List[:index+1] |
|
} |
|
} |
|
|
|
func GetOneAD(start, end int64, cids []*int) *values.ADStats { |
|
one := &values.ADStats{ |
|
Time: start, |
|
Date: time.Unix(start, 0).Format("20060102"), |
|
} |
|
if len(cids) == 0 { |
|
one.Cost = bdb.BackDB.Sum(&values.ADStats{}, fmt.Sprintf("channel_id != 0 and time = %d", one.Time), "cost") |
|
one.TotalCost = bdb.BackDB.Sum(&values.ADStats{}, fmt.Sprintf("channel_id != 0 and time <= %d", one.Time), "cost") |
|
} else if len(cids) == 1 { |
|
one.ChannelID = *cids[0] |
|
one.TotalCost = bdb.BackDB.Sum(&values.ADStats{}, fmt.Sprintf("channel_id = %d and time < %d", one.ChannelID, one.Time), "cost") |
|
} |
|
// 需要查的数据 |
|
// 新增人数 |
|
one.NewPlayers = models.GetNewPlayerCountBySqls(start, end, cids...) |
|
// 总用户 |
|
oldPlayers := models.GetOldPlayerCountBySqls(start, end, cids...) |
|
one.TotalPlayers = one.NewPlayers + oldPlayers |
|
// 新增付费人数 |
|
one.NewPayPlayers = models.GetNewPayCountBySqls(start, end, cids...) |
|
// 新增付费金额 |
|
one.NewPay = models.GetNewPayAmountBySqls(start, end, common.CurrencyINR, cids...) |
|
// 活跃付费金额 |
|
one.ActivePay = models.GetOldPayAmountBySqls(start, end, common.CurrencyINR, cids...) |
|
// 活跃付费人数 |
|
one.ActivePayPlayers = models.GetOldPayCountBySqls(start, end, cids...) |
|
// 总付费 |
|
one.TotalPay = one.NewPay + one.ActivePay |
|
// 总退出 |
|
one.TotalWithdraw = models.GetWithdrawAmountTotalBySQLs(start, end, common.CurrencyINR, cids...) |
|
|
|
one.NewRegister = int(models.GetNewPlayerCountBySqls(start, end, cids...)) |
|
one.ActiveDevice = int(models.GetDownloadCounts(&start, &end, cids...)) |
|
one.NewWithdraw = models.GetNewWithdrawAmount(start, end, cids...) |
|
oldActiveUser := models.GetOldPlayerCountBySqls(start, end, cids...) |
|
one.ActiveUser = one.NewRegister + int(oldActiveUser) |
|
newPayCount := models.GetNewPayCountBySqls(start, end, cids...) |
|
oldPayCount := models.GetOldPayCountBySqls(start, end, cids...) |
|
one.RechargeUser = int(newPayCount + oldPayCount) |
|
// 以下为直接计算出来的数值 |
|
|
|
// 当日收益=当日充值金额*0.92-当日退出*1.05 |
|
one.Profit = one.TotalPay*(100-RechargerFee)/100 - one.TotalWithdraw*(100+WithdrawFee)/100 |
|
// 历史总收益=总充值*0.92-总退出*1.05 |
|
totalPay := models.GetAmountTotalBySQLs(0, end, cids...) |
|
totalWithdraw := models.GetWithdrawAmountTotalBySQLs(0, end, common.CurrencyINR, cids...) |
|
one.TotalProfit = totalPay*(100-RechargerFee)/100 - totalWithdraw*(100+WithdrawFee)/100 |
|
|
|
// one.WithdrawPer = util.GetPer(one.TotalWithdraw, one.TotalPay) |
|
|
|
// one.NewPayPer = util.GetPer(one.NewPayPlayers, one.NewPlayers) |
|
// one.NewPayUnit = util.GetPoint(one.NewPay, one.NewPlayers) |
|
// one.ARPU = util.GetPoint(one.ActivePay, one.ActivePayPlayers) |
|
return one |
|
} |
|
|
|
// 修改投入 |
|
func AdvertisementEdit(c *gin.Context) { |
|
a := app.NewApp(c) |
|
defer func() { |
|
a.Response() |
|
}() |
|
req := new(values.ADEditReq) |
|
if !a.S(req) { |
|
return |
|
} |
|
if req.Cost < 0 { |
|
a.Code = values.CodeParam |
|
a.Msg = "消耗不能小于0" |
|
return |
|
} |
|
one := &values.ADStats{ID: req.ID} |
|
err := bdb.BackDB.Get(one) |
|
if err != nil { |
|
log.Error("err:%v", err) |
|
a.Code = values.CodeParam |
|
return |
|
} |
|
diff := req.Cost - one.Cost |
|
if diff == 0 { |
|
a.Code = values.CodeParam |
|
a.Msg = "消耗无修改" |
|
return |
|
} |
|
|
|
one.Cost = req.Cost |
|
|
|
// one.NewCost = util.GetPoint(one.Cost, one.NewPlayers*100) |
|
// one.NewPayCost = util.GetPoint(one.Cost, one.NewPayPlayers*100) |
|
// one.NewROI = util.GetPer(one.Profit*100, one.Cost*93) |
|
// one.NewPayROI = util.GetPer(one.NewPay*100, one.Cost*93) |
|
|
|
// totalCost := bdb.BackDB.Sum(&values.ADStats{}, fmt.Sprintf("channel_id = %d and time < %d", one.ChannelID, one.Time), "cost") |
|
// totalCost += one.Cost |
|
// one.TotalROI = util.GetPer(one.TotalProfit*100, totalCost*93) |
|
|
|
bdb.BackDB.Update(&values.ADStats{ID: req.ID}, map[string]interface{}{"cost": one.Cost}) |
|
bdb.BackDB.UpdateW(&values.ADStats{}, map[string]interface{}{"cost": gorm.Expr("cost + ?", diff)}, |
|
fmt.Sprintf("channel_id = 0 and time = %d", one.Time)) |
|
bdb.BackDB.UpdateW(&values.ADStats{}, map[string]interface{}{"total_cost": gorm.Expr("total_cost + ?", diff)}, |
|
fmt.Sprintf("(channel_id = %d or channel_id = 0) and time >= %d", one.ChannelID, one.Time)) |
|
} |
|
|
|
func CalTotal(total, one *values.ADStats) { |
|
total.Time = one.Time |
|
total.Date = one.Date |
|
total.Cost += one.Cost |
|
total.NewPlayers += one.NewPlayers |
|
total.TotalPlayers += one.TotalPlayers |
|
total.NewPayPlayers += one.NewPayPlayers |
|
total.NewPay += one.NewPay |
|
total.ActivePay += one.ActivePay |
|
total.ActivePayPlayers += one.ActivePayPlayers |
|
total.TotalPay += one.TotalPay |
|
total.TotalWithdraw += one.TotalWithdraw |
|
total.Profit += one.Profit |
|
total.TotalProfit += one.TotalProfit |
|
total.TotalCost += one.TotalCost |
|
total.NewRegister += one.NewRegister |
|
total.ActiveDevice += one.ActiveDevice |
|
total.NewWithdraw += one.NewWithdraw |
|
total.ActiveUser += one.ActiveUser |
|
total.RechargeUser += one.RechargeUser |
|
} |
|
|
|
// 通过自己数据计算相应收益/roi等数据 |
|
func CalStats(one *values.ADStats) { |
|
one.NewCost = util.GetPoint(one.Cost, one.NewPlayers) |
|
one.NewPayCost = util.GetPoint(one.Cost, one.NewPayPlayers) |
|
one.NewPayPer = util.GetPer(one.NewPayPlayers, one.NewPlayers) |
|
one.NewPayUnit = util.GetPoint(one.NewPay, one.NewPlayers) |
|
one.ARPU = util.GetPoint(one.ActivePay, one.ActivePayPlayers) |
|
one.WithdrawPer = util.GetPer(one.TotalWithdraw, one.TotalPay) |
|
one.NewROI = util.GetPer(one.Profit*100, one.Cost*ChangePer) |
|
one.TotalROI = util.GetPer(one.TotalProfit*100, one.TotalCost*ChangePer) |
|
one.NewPayROI = util.GetPer(one.NewPay*100, one.Cost*ChangePer) |
|
}
|
|
|