Files
2026-05-20 16:13:58 +08:00

618 lines
27 KiB
Go

package statSer
import (
"bytes"
"context"
"fmt"
"stat/api/proto"
"stat/models/appInfoMod"
"stat/models/channelmod"
"stat/models/dailyhourstatmod"
"stat/models/dailystatmod"
"strconv"
"github.com/360EntSecGroup-Skylar/excelize"
"go.mongodb.org/mongo-driver/bson"
)
type RuleMap map[string]*channelmod.ChannelDeductionRule
func (c RuleMap) GetRule(channel string, appId int32) *channelmod.ChannelDeductionRule {
key := fmt.Sprintf("%s %d", channel, appId)
return c[key]
}
func (c RuleMap) SetRule(rule *channelmod.ChannelDeductionRule) {
key := fmt.Sprintf("%s %d", rule.Channel, rule.AppId)
c[key] = rule
}
func MakeRuleMap(ctx context.Context, channels []string) (RuleMap, error) {
ruleMap := make(RuleMap)
m := make(map[string]struct{})
for _, s := range channels {
m[s] = struct{}{}
}
channels = make([]string, 0, len(m))
for k := range m {
channels = append(channels, k)
}
rules, err := channelmod.FindManyChannelDeductionRule(ctx, bson.M{channelmod.FN.ChannelDeductionRule.Channel: bson.M{"$in": channels}})
if err != nil {
return ruleMap, err
}
for _, item := range rules {
ruleMap.SetRule(item)
}
return ruleMap, nil
}
func MakeAppInfosMapByIds(ctx context.Context, appIds []int32) (map[int32]*appInfoMod.AppInfo, error) {
r := make(map[int32]*appInfoMod.AppInfo)
if len(appIds) == 0 {
return r, nil
}
appList, err := appInfoMod.GetAppInfosByAppIds(ctx, appIds)
if err != nil {
return r, err
}
for _, v := range appList {
_v := v
r[v.AppId] = &_v
}
return r, nil
}
func ExportDailyHourStat(transInfos []*proto.DailyHourStatInfo) (*bytes.Buffer, error) {
f := excelize.NewFile()
cell := func(row, col int) string { // row start form 0, col start form 0
return fmt.Sprintf("%s%d", excelize.ToAlphaString(col), row+1)
}
sheetName := "Sheet1"
row0 := []string{0: "记录时间", 1: "APP名称", 2: "总充值", 3: "总新增", 4: "新增", 11: "充值", 19: "访问数", 21: "VIP", 24: "订单", 27: "落地页", 29: ""}
row1 := []string{4: "直推", 5: "裂变", 6: "安卓", 7: "IOS", 8: "自然", 9: "H5", 10: "扣量", 11: "直推", 12: "裂变", 13: "自然",
14: "新增", 15: "老用户", 16: "复充", 17: "游戏充值", 18: "游戏提现", 19: "直推", 20: "裂变", 21: "余额", 22: "人民币", 23: "复充",
24: "成功", 25: "拉起", 26: "成功率", 27: "安卓", 28: "商店包", 29: "企业签"}
// 设置列宽
f.SetColWidth("Sheet1", excelize.ToAlphaString(0), excelize.ToAlphaString(1), 16)
f.SetColWidth("Sheet1", excelize.ToAlphaString(2), excelize.ToAlphaString(3), 10)
f.SetColWidth("Sheet1", excelize.ToAlphaString(4), excelize.ToAlphaString(len(row0)-1), 8)
// 设置表头行高
f.SetRowHeight("Sheet1", 1, 30)
// 设置表头样式
headStyleID, _ := f.NewStyle(`{
"font":{
"color":"#333333",
"bold":true,
"size":16,
"family":"arial"
},
"alignment":{
"vertical":"center",
"horizontal":"center"
}
}`)
f.SetCellStyle("Sheet1", cell(0, 0), cell(0, len(row0)-1), headStyleID)
idx := f.NewSheet(sheetName)
// set main title
for col, name := range row0 {
f.SetCellValue(sheetName, cell(0, col), name)
}
// merge some title
var mergeCells = map[string]string{
cell(0, 4): cell(0, 10),
cell(0, 11): cell(0, 18),
cell(0, 19): cell(0, 20),
cell(0, 21): cell(0, 23),
cell(0, 24): cell(0, 26),
cell(0, 27): cell(0, 29),
}
for hcell, vcell := range mergeCells {
f.MergeCell(sheetName, hcell, vcell)
}
// set sub title
for col, name := range row1 {
f.SetCellValue(sheetName, cell(1, col), name)
}
// set cell data
for k, v := range transInfos {
col := 0
row := k + 2
axis := func() string {
ret := cell(row, col)
col++
return ret
}
fmtW := func(v int64) string {
return fmt.Sprintf("%.4f", float64(v)/float64(10000))
}
f.SetCellValue(sheetName, axis(), v.SumDate.Local().Format("2006-01-02 15:04:05")) //记录时间
f.SetCellValue(sheetName, axis(), v.AppName) //APP名称
f.SetCellValue(sheetName, axis(), fmtW(v.DirectAmount+v.FissionAmount)) //总充值
f.SetCellValue(sheetName, axis(), v.NewDirectCount+v.NewFissionCount) //总新增
// Group 1 : E1-K1 = 7
f.SetCellValue(sheetName, axis(), v.NewDirectCount) //新增-直推
f.SetCellValue(sheetName, axis(), v.NewFissionCount) //新增-裂变
f.SetCellValue(sheetName, axis(), v.NewAndroidCount) //新增-安卓
f.SetCellValue(sheetName, axis(), v.NewIosCount) //新增-IOS
f.SetCellValue(sheetName, axis(), v.NewNaturalCount) //新增-自然
f.SetCellValue(sheetName, axis(), v.NewH5Count) //新增-H5
f.SetCellValue(sheetName, axis(), v.NewDeductionCount) //新增-扣量
//Group 2 : L1-S1 = 8
f.SetCellValue(sheetName, axis(), fmtW(v.DirectAmount)) //充值-直推
f.SetCellValue(sheetName, axis(), fmtW(v.FissionAmount)) //充值-裂变
f.SetCellValue(sheetName, axis(), fmtW(v.NaturalAmount)) //充值-自然
f.SetCellValue(sheetName, axis(), fmtW(v.NewRechargeAmount)) //充值-新增
f.SetCellValue(sheetName, axis(), fmtW(v.DirectAmount+v.FissionAmount-v.NewRechargeAmount)) //充值-老用户
f.SetCellValue(sheetName, axis(), fmtW(v.RepeatAmount)) //充值-复充
f.SetCellValue(sheetName, axis(), fmtW(v.GameRechageAmount)) //充值-游戏充值
f.SetCellValue(sheetName, axis(), fmtW(v.GameWithdrawAmount)) //充值-游戏提现
//Group 3 : T1-U1 = 2
f.SetCellValue(sheetName, axis(), v.DirectVisitCount) //访问数-直推
f.SetCellValue(sheetName, axis(), v.FissionVisitCount) //访问数-裂变
//Group 4 : V1-X1 = 3
f.SetCellValue(sheetName, axis(), fmtW(v.VipPayByAmount)) //VIP-余额
f.SetCellValue(sheetName, axis(), fmtW(v.VipPayByMoney)) //VIP-人民币
f.SetCellValue(sheetName, axis(), fmtW(v.VipRepeatAmount)) //VIP-复充
//Group 5 : Y1-AA1 = 3
f.SetCellValue(sheetName, axis(), v.SuccessRechargeOrder) //订单-成功
f.SetCellValue(sheetName, axis(), v.TotalRechargeOrder) //订单-拉起
f.SetCellValue(sheetName, axis(), v.RechargeSuccessRate) //订单-成功率
//Group 6 : AB1-AD1 = 3
f.SetCellValue(sheetName, axis(), v.LandpageAndroidClick) //落地页-安卓
f.SetCellValue(sheetName, axis(), v.LandpageIosAppstoreClick) //落地页-商店包
f.SetCellValue(sheetName, axis(), v.LandpageIosAthorClick) //落地页-企业签
}
f.SetActiveSheet(idx)
buf := new(bytes.Buffer)
if err := f.Write(buf); err != nil {
return nil, err
}
return buf, nil
}
func DailyStatInfoAccumulate(base, value *proto.DailyStatInfo) {
base.TotalNewCount += value.TotalNewCount
base.NewDirectCount += value.NewDirectCount
base.NewFissionCount += value.NewFissionCount
base.NewDeductionCount += value.NewDeductionCount
base.NewNaturalCount += value.NewNaturalCount
base.NewWebCount += value.NewWebCount
base.NewDistrictCount += value.NewDistrictCount
base.NewNormalCount += value.NewNormalCount
base.AndroidAddCount += value.AndroidAddCount
base.IosAddCount += value.IosAddCount
base.H5FormalCount += value.H5FormalCount
base.H5AddCount += value.H5AddCount
base.H5PcAddCount += value.H5PcAddCount
base.H5IosAddCount += value.H5IosAddCount
base.H5AndroidAddCount += value.H5AndroidAddCount
base.TotalVisitCount += value.TotalVisitCount
base.DirectVisitCount += value.DirectVisitCount
base.FissionVisitCount += value.FissionVisitCount
base.NaturalVisitCount += value.NaturalVisitCount
base.TodayDistrictVisitCount += value.TodayDistrictVisitCount
base.TodayWebVisitCount += value.TodayWebVisitCount
base.TodayNormalVisitCount += value.TodayNormalVisitCount
base.TodayIosVisitCount += value.TodayIosVisitCount
base.TodayAndroidVisitCount += value.TodayAndroidVisitCount
base.TodayH5VisitCount += value.TodayH5VisitCount
base.TodayH5PcVisitCount += value.TodayH5PcVisitCount
base.TodayH5IosVisitCount += value.TodayH5IosVisitCount
base.TodayH5AndroidVisitCount += value.TodayH5AndroidVisitCount
base.LightVisitCount += value.LightVisitCount
base.LightDirectVisitCount += value.LightDirectVisitCount
base.LightFissionVisitCount += value.LightFissionVisitCount
base.LightDeductionVisitCount += value.LightDeductionVisitCount
base.LightNaturalVisitCount += value.LightNaturalVisitCount
base.LightWebVisitCount += value.LightWebVisitCount
base.LightDistrictVisitCount += value.LightDistrictVisitCount
base.LightNormalVisitCount += value.LightNormalVisitCount
base.LightAddCount += value.LightAddCount
base.LightGuestAddCount += value.LightGuestAddCount
base.LightFormalAddCount += value.LightFormalAddCount
base.LightDirectCount += value.LightDirectCount
base.LightFissionCount += value.LightFissionCount
base.LightDeductionCount += value.LightDeductionCount
base.LightNaturalCount += value.LightNaturalCount
base.LightWebCount += value.LightWebCount
base.LightDistrictCount += value.LightDistrictCount
base.LightNormalCount += value.LightNormalCount
base.TotalAmount += value.TotalAmount
base.DirectAmount += value.DirectAmount
base.FissionAmount += value.FissionAmount
base.DeductionAmount += value.DeductionAmount
base.NaturalAmount += value.NaturalAmount
base.TodayDistrictRecharge += value.TodayDistrictRecharge
base.TodayWebRecharge += value.TodayWebRecharge
base.TodayNormalRecharge += value.TodayNormalRecharge
base.TodayAndroidRecharge += value.TodayAndroidRecharge
base.TodayIosRecharge += value.TodayIosRecharge
base.LightRechargeCount += value.LightRechargeCount
base.LightDirectRechargeCount += value.LightDirectRechargeCount
base.LightFissionRechargeCount += value.LightFissionRechargeCount
base.LightDeductionRechargeCount += value.LightDeductionRechargeCount
base.LightNaturalRechargeCount += value.LightNaturalRechargeCount
base.LightWebRechargeCount += value.LightWebRechargeCount
base.LightDistrictRechargeCount += value.LightDistrictRechargeCount
base.LightNormalRechargeCount += value.LightNormalRechargeCount
base.LightRechargeAmount += value.LightRechargeAmount
base.LightDirectRechargeAmount += value.LightDirectRechargeAmount
base.LightFissionRechargeAmount += value.LightFissionRechargeAmount
base.LightDeductionRechargeAmount += value.LightDeductionRechargeAmount
base.LightNaturalRechargeAmount += value.LightNaturalRechargeAmount
base.LightWebRechargeAmount += value.LightWebRechargeAmount
base.LightDistrictRechargeAmount += value.LightDistrictRechargeAmount
base.LightNormalRechargeAmount += value.LightNormalRechargeAmount
base.TodayH5Recharge += value.TodayH5Recharge
base.TodayH5FormalRecharge += value.TodayH5FormalRecharge
base.TodayH5PcRecharge += value.TodayH5PcRecharge
base.TodayH5IosRecharge += value.TodayH5IosRecharge
base.TodayH5AndroidRecharge += value.TodayH5AndroidRecharge
base.VipPayByMoney += value.VipPayByMoney
base.PayForAthor += value.TotalAmount - value.VipPayByMoney
base.RepeatAmount += value.RepeatAmount
base.RepeatVipMoney += value.RepeatVipMoney
base.GameRechageAmount += value.GameRechageAmount
base.GameWithdrawAmount += value.GameWithdrawAmount
base.OldRechargeAmount += value.OldRechargeAmount
base.OldVipRecharge += value.OldVipRecharge
base.OldCoinRecharge += value.OldCoinRecharge
base.NewRechargeCount += value.NewRechargeCount
base.NewRechargeAmount += value.NewRechargeAmount
base.NewVipRecharge += value.NewVipRecharge
base.NewCoinRecharge += value.NewCoinRecharge
base.SuccessRechargeOrder += value.SuccessRechargeOrder
base.TotalRechargeOrder += value.TotalRechargeOrder
base.Day1RetainRate += value.Day1RetainRate
base.Day3RetainRate += value.Day3RetainRate
base.Day7RetainRate += value.Day7RetainRate
base.LandpageAndroidClick += value.LandpageAndroidClick
base.LandpageIosAppstoreClick += value.LandpageIosAppstoreClick
base.LandpageIosAthorClick += value.LandpageIosAthorClick
base.LandpageIosH5Click += value.LandpageIosH5Click
if base.NewCoinRecharge < 0 {
base.NewCoinRecharge = 0
}
if base.OldVipRecharge < 0 {
base.OldVipRecharge = 0
}
if base.OldCoinRecharge < 0 {
base.OldCoinRecharge = 0
}
if base.TotalRechargeOrder > 0 {
base.RechargeSuccessRate = fmt.Sprintf("%.3f", float64(base.SuccessRechargeOrder)/float64(base.TotalRechargeOrder))
}
if base.TotalNewCount != 0 {
base.NewRechargeRate, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", (float64(base.NewRechargeCount)/float64(base.TotalNewCount))*100), 64)
}
if base.TotalVisitCount != 0 {
base.VisitRechargeRate, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", (float64(base.SuccessRechargeOrder)/float64(base.TotalVisitCount))*100), 64)
}
if base.SuccessRechargeOrder != 0 {
base.ARPPU = base.TotalAmount / base.SuccessRechargeOrder // 金额
}
if base.TotalNewCount != 0 {
base.ARPU = base.TotalAmount / base.TotalNewCount // 金额
}
}
func DailyStatToInfo(src *dailystatmod.DailyStatMod) *proto.DailyStatInfo {
src.CorrectValidData()
ret := &proto.DailyStatInfo{
SumDate: src.SumDate,
AppId: src.AppId,
AppName: "", // 外面赋值
TotalNewCount: src.NewTotalCount,
NewDirectCount: src.NewDirectCount,
NewFissionCount: src.NewFissionCount,
NewDeductionCount: src.NewDeductionCount,
NewNaturalCount: src.NewNaturalCount,
NewWebCount: src.NewWebCount,
NewDistrictCount: src.NewDistrictCount,
NewNormalCount: src.NewNormalCount,
LightAddCount: src.LightAddCount,
LightGuestAddCount: src.LightGuestAddCount,
LightFormalAddCount: src.LightFormalAddCount,
LightDirectCount: src.LightDirectCount,
LightFissionCount: src.LightFissionCount,
LightDeductionCount: src.LightDeductionCount,
LightNaturalCount: src.LightNaturalCount,
LightWebCount: src.LightWebCount,
LightDistrictCount: src.LightDistrictCount,
LightNormalCount: src.LightNormalCount,
AndroidAddCount: src.AndroidAddCount,
IosAddCount: src.IosAddCount,
H5FormalCount: src.H5FormalCount,
H5AddCount: src.H5AddCount,
H5PcAddCount: src.H5PcAddCount,
H5IosAddCount: src.H5IosAddCount,
H5AndroidAddCount: src.H5AndroidAddCount,
TotalVisitCount: src.TotalVisitCount,
DirectVisitCount: src.DirectVisitCount,
FissionVisitCount: src.FissionVisitCount,
NaturalVisitCount: src.NaturalVisitCount,
TodayDistrictVisitCount: src.TodayDistrictVisitCount,
TodayWebVisitCount: src.TodayWebVisitCount,
TodayNormalVisitCount: src.TodayNormalVisitCount,
TodayIosVisitCount: src.TodayIosVisitCount,
TodayAndroidVisitCount: src.TodayAndroidVisitCount,
LightVisitCount: src.LightVisitCount,
LightDirectVisitCount: src.LightDirectVisitCount,
LightFissionVisitCount: src.LightFissionVisitCount,
LightDeductionVisitCount: src.LightDeductionVisitCount,
LightNaturalVisitCount: src.LightNaturalVisitCount,
LightWebVisitCount: src.LightWebVisitCount,
LightDistrictVisitCount: src.LightDistrictVisitCount,
LightNormalVisitCount: src.LightNormalVisitCount,
TodayH5VisitCount: src.TodayH5VisitCount,
TodayH5PcVisitCount: src.TodayH5PcVisitCount,
TodayH5IosVisitCount: src.TodayH5IosVisitCount,
TodayH5AndroidVisitCount: src.TodayH5AndroidVisitCount,
TotalAmount: src.TotalAmount,
DirectAmount: src.DirectAmount,
FissionAmount: src.FissionAmount,
DeductionAmount: src.DeductionAmount,
NaturalAmount: src.NaturalAmount,
TodayDistrictRecharge: src.TodayDistrictRecharge,
TodayWebRecharge: src.TodayWebRecharge,
TodayNormalRecharge: src.TodayNormalRecharge,
TodayAndroidRecharge: src.TodayAndroidRecharge,
TodayIosRecharge: src.TodayIosRecharge,
LightRechargeCount: src.LightRechargeCount,
LightDirectRechargeCount: src.LightDirectRechargeCount,
LightFissionRechargeCount: src.LightFissionRechargeCount,
LightDeductionRechargeCount: src.LightDeductionRechargeCount,
LightNaturalRechargeCount: src.LightNaturalRechargeCount,
LightWebRechargeCount: src.LightWebRechargeCount,
LightDistrictRechargeCount: src.LightDistrictRechargeCount,
LightNormalRechargeCount: src.LightNormalRechargeCount,
LightRechargeAmount: src.LightRechargeAmount,
LightDirectRechargeAmount: src.LightDirectRechargeAmount,
LightFissionRechargeAmount: src.LightFissionRechargeAmount,
LightDeductionRechargeAmount: src.LightDeductionRechargeAmount,
LightNaturalRechargeAmount: src.LightNaturalRechargeAmount,
LightWebRechargeAmount: src.LightWebRechargeAmount,
LightDistrictRechargeAmount: src.LightDistrictRechargeAmount,
LightNormalRechargeAmount: src.LightNormalRechargeAmount,
TodayH5Recharge: src.TodayH5Recharge,
TodayH5FormalRecharge: src.TodayH5FormalRecharge,
TodayH5PcRecharge: src.TodayH5PcRecharge,
TodayH5IosRecharge: src.TodayH5IosRecharge,
TodayH5AndroidRecharge: src.TodayH5AndroidRecharge,
ARPU: 0, // 下面赋值
ARPPU: 0, // 下面赋值
VipPayByMoney: src.VipPayByMoney,
PayForAthor: 0, // 下面赋值
RepeatAmount: src.RepeatAmount,
RepeatVipMoney: src.RepeatVipMoney,
GameRechageAmount: src.GameRechageAmount,
GameWithdrawAmount: src.GameWithdrawAmount,
OldRechargeAmount: 0, // 下面赋值
OldVipRecharge: 0, // 下面赋值
OldCoinRecharge: 0, // 下面赋值
NewRechargeCount: src.NewRechargeCount,
NewRechargeAmount: src.NewRechargeAmount,
NewVipRecharge: src.NewVipPayMoney,
NewCoinRecharge: 0, // 下面赋值
NewRechargeRate: 0, // 下面赋值
VisitRechargeRate: 0, // 下面赋值
SuccessRechargeOrder: src.SuccessRechargeOrder,
TotalRechargeOrder: src.TotalRechargeOrder,
RechargeSuccessRate: "", //下面赋值
Day1RetainRate: src.Day1RetainRate,
Day3RetainRate: src.Day3RetainRate,
Day7RetainRate: src.Day7RetainRate,
LandpageAndroidClick: src.LandpageAndroidClick,
LandpageIosAppstoreClick: src.LandpageIosAppstoreClick,
LandpageIosAthorClick: src.LandpageIosAthorClick,
LandpageIosH5Click: src.LandpageIosH5Click,
UpdatedAt: src.UpdatedAt,
}
if ret.TotalNewCount == 0 {
ret.TotalNewCount = ret.NewDirectCount + ret.NewFissionCount + ret.NewDeductionCount
}
if ret.TotalVisitCount == 0 {
ret.TotalVisitCount = ret.DirectVisitCount + ret.FissionVisitCount + ret.DeductionVisitCount
}
if ret.TotalAmount == 0 {
ret.TotalAmount = ret.DirectAmount + ret.FissionAmount + ret.DeductionAmount
}
ret.PayForAthor = ret.TotalAmount - ret.VipPayByMoney
ret.OldRechargeAmount = ret.TotalAmount - ret.NewRechargeAmount
ret.OldVipRecharge = ret.VipPayByMoney - ret.NewVipRecharge
ret.OldCoinRecharge = ret.OldRechargeAmount - ret.OldVipRecharge
ret.NewCoinRecharge = ret.NewRechargeAmount - ret.NewVipRecharge
if ret.NewCoinRecharge < 0 {
ret.NewCoinRecharge = 0
}
if ret.OldVipRecharge < 0 {
ret.OldVipRecharge = 0
}
if ret.OldCoinRecharge < 0 {
ret.OldCoinRecharge = 0
}
if ret.TotalRechargeOrder > 0 {
ret.RechargeSuccessRate = fmt.Sprintf("%.3f", float64(ret.SuccessRechargeOrder)/float64(ret.TotalRechargeOrder))
}
if ret.TotalNewCount != 0 {
ret.ARPU = ret.TotalAmount / ret.TotalNewCount // 金额
ret.NewRechargeRate, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", (float64(ret.NewRechargeCount)/float64(ret.TotalNewCount))*100), 64)
}
if ret.TotalVisitCount != 0 {
ret.VisitRechargeRate, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", (float64(ret.SuccessRechargeOrder)/float64(ret.TotalVisitCount))*100), 64)
}
if ret.SuccessRechargeOrder != 0 {
ret.ARPPU = ret.TotalAmount / ret.SuccessRechargeOrder // 金额
}
return ret
}
func DailyHourStatToInfo(src *dailyhourstatmod.DailyHourStat) *proto.DailyHourStatInfo {
src.CorrectValidData()
ret := &proto.DailyHourStatInfo{
SumDate: src.SumDate,
AppId: src.AppId,
SumHour: src.SumHour,
AppName: "",
NewTotalCount: src.NewTotalCount,
NewDirectCount: src.NewDirectCount,
NewFissionCount: src.NewFissionCount,
NewDeductionCount: src.NewDeductionCount,
NewNaturalCount: src.NewNaturalCount,
NewWebCount: src.NewWebCount,
NewNormalCount: src.NewNormalCount,
NewDistrictCount: src.NewDistrictCount,
NewAndroidCount: src.NewAndroidCount,
NewIosCount: src.NewIosCount,
NewLightCount: src.NewLightCount,
NewLightGuestCount: src.NewLightGuestCount,
NewLightFormalCount: src.NewLightFormalCount,
NewLightDirectCount: src.NewLightDirectCount,
NewLightFissionCount: src.NewLightFissionCount,
NewLightDeductionCount: src.NewLightDeductionCount,
NewLightNaturalCount: src.NewLightNaturalCount,
NewLightWebCount: src.NewLightWebCount,
NewLightNormalCount: src.NewLightNormalCount,
NewLightDistrictCount: src.NewLightDistrictCount,
NewH5Count: src.NewH5Count,
NewH5FormalCount: src.NewH5FormalCount,
NewH5PcCount: src.NewH5PcCount,
NewH5IosCount: src.NewH5IosCount,
NewH5AndroidCount: src.NewH5AndroidCount,
TotalVisitCount: src.TotalVisitCount,
DirectVisitCount: src.DirectVisitCount,
FissionVisitCount: src.FissionVisitCount,
NaturalVisitCount: src.NaturalVisitCount,
WebVisitCount: src.WebVisitCount,
NormalVisitCount: src.NormalVisitCount,
DistrictVisitCount: src.DistrictVisitCount,
IosVisitCount: src.IosVisitCount,
AndroidVisitCount: src.AndroidVisitCount,
LightVisitCount: src.LightVisitCount,
LightVisitDirectCount: src.LightVisitDirectCount,
LightVisitFissionCount: src.LightVisitFissionCount,
LightVisitDeductionCount: src.LightVisitDeductionCount,
LightVisitNaturalCount: src.LightVisitNaturalCount,
LightVisitWebCount: src.LightVisitWebCount,
LightVisitNormalCount: src.LightVisitNormalCount,
LightVisitDistrictCount: src.LightVisitDistrictCount,
H5VisitCount: src.H5VisitCount,
H5PcVisitCount: src.H5PcVisitCount,
H5IosVisitCount: src.H5IosVisitCount,
H5AndroidVisitCount: src.H5AndroidVisitCount,
TotalAmount: src.TotalAmount,
SuccessRechargeOrder: src.SuccessRechargeOrder,
DirectAmount: src.DirectAmount,
DirectAmountCount: src.DirectAmountCount,
FissionAmount: src.FissionAmount,
FissionAmountCount: src.FissionAmountCount,
NaturalAmount: src.NaturalAmount,
NaturalAmountCount: src.NaturalAmountCount,
DeductionAmount: src.DeductionAmount,
DeductionAmountCount: src.DeductionAmountCount,
WebAmount: src.WebAmount,
WebAmountCount: src.WebAmountCount,
NormalAmount: src.NormalAmount,
NormalAmountCount: src.NormalAmountCount,
DistrictAmount: src.DistrictAmount,
DistrictAmountCount: src.DistrictAmountCount,
AndroidAmount: src.AndroidAmount,
AndroidAmountCount: src.AndroidAmountCount,
IosAmount: src.IosAmount,
IosAmountCount: src.IosAmountCount,
LightAmount: src.LightAmount,
LightAmountCount: src.LightAmountCount,
LightDirectAmount: src.LightDirectAmount,
LightDirectAmountCount: src.LightDirectAmountCount,
LightFissionAmount: src.LightFissionAmount,
LightFissionAmountCount: src.LightFissionAmountCount,
LightDeductionAmount: src.LightDeductionAmount,
LightDeductionAmountCount: src.LightDeductionAmountCount,
LightNaturalAmount: src.LightNaturalAmount,
LightNaturalAmountCount: src.LightNaturalAmountCount,
LightWebAmount: src.LightWebAmount,
LightWebAmountCount: src.LightWebAmountCount,
LightNormalAmount: src.LightNormalAmount,
LightNormalAmountCount: src.LightNormalAmountCount,
LightDistrictAmount: src.LightDistrictAmount,
LightDistrictAmountCount: src.LightDistrictAmountCount,
H5Amount: src.H5Amount,
H5AmountCount: src.H5AmountCount,
H5FormalAmount: src.H5FormalAmount,
H5FormalAmountCount: src.H5FormalAmountCount,
H5PcAmount: src.H5PcAmount,
H5PcAmountCount: src.H5PcAmountCount,
H5IosAmount: src.H5IosAmount,
H5IosAmountCount: src.H5IosAmountCount,
H5AndroidAmount: src.H5AndroidAmount,
H5AndroidAmountCount: src.H5AndroidAmountCount,
RepeatAmount: src.RepeatAmount,
RepeatAmountCount: src.RepeatAmountCount,
NewRechargeAmount: src.NewRechargeAmount,
NewRechargeCount: src.NewRechargeCount,
NewCoinRecharge: 0,
NewVipRecharge: 0,
OldCoinRecharge: 0,
OldVipRecharge: 0,
OldRechargeAmount: 0,
VipPayByMoney: src.VipPayByMoney,
VipPayByAmount: src.VipPayByAmount,
VipRepeatAmount: src.VipRepeatAmount,
TotalRechargeOrder: src.TotalRechargeOrder,
RechargeSuccessRate: "",
GameRechageAmount: src.GameRechageAmount,
GameWithdrawAmount: src.GameWithdrawAmount,
LandpageAndroidClick: src.LandpageAndroidClick,
LandpageIosAppstoreClick: src.LandpageIosAppstoreClick,
LandpageIosAthorClick: src.LandpageIosAthorClick,
LandpageIosH5Click: src.LandpageIosH5Click,
UpdatedAt: src.UpdatedAt,
}
if ret.NewTotalCount == 0 {
ret.NewTotalCount = ret.NewDirectCount + ret.NewFissionCount + ret.NewDeductionCount
}
if ret.TotalVisitCount == 0 {
ret.TotalVisitCount = ret.DirectVisitCount + ret.FissionVisitCount
}
if ret.TotalAmount == 0 {
ret.TotalAmount = ret.DirectAmount + ret.FissionAmount + ret.DeductionAmount
}
ret.VipPayByAmount = ret.TotalAmount - ret.VipPayByMoney
ret.OldRechargeAmount = ret.TotalAmount - ret.NewRechargeAmount
ret.OldVipRecharge = ret.VipPayByMoney - ret.NewVipRecharge
ret.OldCoinRecharge = ret.OldRechargeAmount - ret.OldVipRecharge
ret.NewCoinRecharge = ret.NewRechargeAmount - ret.NewVipRecharge
if ret.NewCoinRecharge < 0 {
ret.NewCoinRecharge = 0
}
if ret.OldVipRecharge < 0 {
ret.OldVipRecharge = 0
}
if ret.OldCoinRecharge < 0 {
ret.OldCoinRecharge = 0
}
if ret.TotalRechargeOrder > 0 {
ret.RechargeSuccessRate = fmt.Sprintf("%.3f", float64(ret.SuccessRechargeOrder)/float64(ret.TotalRechargeOrder))
}
return ret
}