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 }