package channelmod import ( "fmt" "strconv" ) type CalcIncomeRateMode int const ( CalcIncomeRateModeDirect CalcIncomeRateMode = 0 // 直推模式:直推总额 CalcIncomeRateModeTotal CalcIncomeRateMode = 1 // 总量模式:充值总额 CalcIncomeRateModeMember CalcIncomeRateMode = 2 // 会员模式:会员总额 CalcIncomeRateModeCustom CalcIncomeRateMode = 3 // 定制模式:会员总额+(金币总额*占比) ) type CalcIncomeRateConfig struct { Mode CalcIncomeRateMode // 计算模式 CoinRatio float64 // 金币占比(最小为0,最大为1) } var configDefault = &CalcIncomeRateConfig{ Mode: CalcIncomeRateModeMember, // 默认收益率计算模式 CoinRatio: 0, } var configXcb = &CalcIncomeRateConfig{ Mode: CalcIncomeRateModeTotal, // 总充值 CoinRatio: 0, } func getConfig(appId int32) *CalcIncomeRateConfig { if appId == 6666 { return configXcb } else { return configDefault } } // GetIncome 收益率计算公式 func (c *CalcIncomeRateConfig) GetIncome(stat *ChannelStat) int64 { switch c.Mode { case CalcIncomeRateModeDirect: return stat.DirectAmount case CalcIncomeRateModeTotal: return stat.TotalAmount case CalcIncomeRateModeMember: return stat.VipPayMoney + stat.VipPayDeduction case CalcIncomeRateModeCustom: rate := c.CoinRatio if rate > 1 { rate = 1 } if rate < 0 { rate = 0 } return (stat.VipPayMoney + stat.VipPayDeduction) + int64(float64(stat.VipPayCoin)*rate) default: return stat.VipPayMoney + stat.VipPayDeduction } } func (t ChannelType) String() string { switch t { case ChannelTypeNone, ChannelTypeEnd: return "无效" case ChannelTypeParent: return "一级" case ChannelTypeSecond: return "二级" case ChannelTypeThird: return "三级" case ChannelTypeForth: return "四级" default: if t > ChannelTypeNone && t < ChannelTypeEnd { return fmt.Sprintf("【%d】级", t) } return "无效" } } func (t ChannelType) IsTop() bool { if t == ChannelTypeParent { return true } return false } func (t ChannelType) IsSecond() bool { if t == ChannelTypeSecond { return true } return false } func (t ChannelType) IsChild() bool { if t > ChannelTypeParent && t < ChannelTypeEnd { return true } return false } func (t ChannelType) Child() ChannelType { if t > ChannelTypeNone && t < ChannelTypeEnd { return t + 1 } else { return ChannelTypeEnd } } func (t ChannelType) Parent() ChannelType { if t > ChannelTypeNone && t < ChannelTypeEnd { return t - 1 } else { return ChannelTypeNone } } func (t ChannelType) IsValid() bool { if t > ChannelTypeNone && t < ChannelTypeEnd { return true } else { return false } } func (t ChannelType) IsNone() bool { if t > ChannelTypeNone && t < ChannelTypeEnd { return false } else { return true } } func (a ChannelStatList) Len() int { return len(a) } func (a ChannelStatList) Less(i, j int) bool { return a[i].SumDate.After(a[j].SumDate) } func (a ChannelStatList) Swap(i, j int) { a[i], a[j] = a[j], a[i] } func (s *ChannelSettlement) AssignmentTo(d *ChannelStat) { d.ValidDirectCount = s.ValidDirectCount d.ValidDeductionCount = s.ValidDeductionCount d.ValidPayMoney = s.ValidPayMoney d.ValidPayCoin = s.ValidPayCoin d.NewTotalIpCount = s.NewTotalIpCount d.NewTotalCount = s.NewTotalCount d.NewDirectCount = s.NewDirectCount d.NewFissionCount = s.NewFissionCount d.NewDeductionCount = s.NewDeductionCount d.NewAndroidCount = s.NewAndroidCount d.NewAndroidDirectCount = s.NewAndroidDirectCount d.NewAndroidFissionCount = s.NewAndroidFissionCount d.NewAndroidDeductionCount = s.NewAndroidDeductionCount d.NewIosCount = s.NewIosCount d.NewIosDirectCount = s.NewIosDirectCount d.NewIosFissionCount = s.NewIosFissionCount d.NewIosDeductionCount = s.NewIosDeductionCount d.NewLightCount = s.NewLightCount d.NewLightGuestCount = s.NewLightGuestCount d.NewLightGuestDirectCount = s.NewLightGuestDirectCount d.NewLightGuestFissionCount = s.NewLightGuestFissionCount d.NewLightGuestDeductionCount = s.NewLightGuestDeductionCount d.NewLightFormalCount = s.NewLightFormalCount d.NewLightFormalDirectCount = s.NewLightFormalDirectCount d.NewLightFormalFissionCount = s.NewLightFormalFissionCount d.NewLightFormalDeductionCount = s.NewLightFormalDeductionCount d.NewLightDirectCount = s.NewLightDirectCount d.NewLightFissionCount = s.NewLightFissionCount d.NewLightDeductionCount = s.NewLightDeductionCount d.NewLightNaturalCount = s.NewLightNaturalCount d.NewH5Count = s.NewH5Count d.NewH5DirectCount = s.NewH5DirectCount d.NewH5FissionCount = s.NewH5FissionCount d.NewH5DeductionCount = s.NewH5DeductionCount d.NewH5AndroidCount = s.NewH5AndroidCount d.NewH5IosCount = s.NewH5IosCount d.NewH5PcCount = s.NewH5PcCount d.NewH5FormalCount = s.NewH5FormalCount d.NewH5FormalDirectCount = s.NewH5FormalDirectCount d.NewH5FormalFissionCount = s.NewH5FormalFissionCount d.NewH5FormalDeductionCount = s.NewH5FormalDeductionCount // 访问 d.TotalVisitCount = s.TotalVisitCount d.DirectVisitCount = s.DirectVisitCount d.FissionVisitCount = s.FissionVisitCount d.AndroidVisitCount = s.AndroidVisitCount d.IosVisitCount = s.IosVisitCount d.LightVisitCount = s.LightVisitCount d.LightVisitDirectCount = s.LightVisitDirectCount d.LightVisitFissionCount = s.LightVisitFissionCount d.LightVisitDeductionCount = s.LightVisitDeductionCount d.LightVisitNaturalCount = s.LightVisitNaturalCount d.H5VisitCount = s.H5VisitCount d.H5AndroidVisitCount = s.H5AndroidVisitCount d.H5IosVisitCount = s.H5IosVisitCount d.H5PcVisitCount = s.H5PcVisitCount // 充值 d.TotalAmount = s.TotalAmount d.DirectAmount = s.DirectAmount d.DirectAmountCount = s.DirectAmountCount d.FissionAmount = s.FissionAmount d.FissionAmountCount = s.FissionAmountCount d.NaturalAmount = s.NaturalAmount d.NaturalAmountCount = s.NaturalAmountCount d.DeductionAmount = s.DeductionAmount d.DeductionAmountCount = s.DeductionAmountCount d.AndroidAmount = s.AndroidAmount d.AndroidAmountCount = s.AndroidAmountCount d.IosAmount = s.IosAmount d.IosAmountCount = s.IosAmountCount d.H5Amount = s.H5Amount d.H5AmountCount = s.H5AmountCount d.LightAmount = s.LightAmount d.LightAmountCount = s.LightAmountCount d.LightDirectAmount = s.LightDirectAmount d.LightDirectAmountCount = s.LightDirectAmountCount d.LightFissionAmount = s.LightFissionAmount d.LightFissionAmountCount = s.LightFissionAmountCount d.LightDeductionAmount = s.LightDeductionAmount d.LightDeductionAmountCount = s.LightDeductionAmountCount d.LightNaturalAmount = s.LightNaturalAmount d.LightNaturalAmountCount = s.LightNaturalAmountCount // 其他充值 d.NewRechargeAmount = s.NewRechargeAmount d.VipPayMoney = s.VipPayMoney d.VipPayCoin = s.VipPayCoin d.VipPayDeduction = s.VipPayDeduction d.GameRechageAmount = s.GameRechageAmount d.GameWithdrawAmount = s.GameWithdrawAmount // 落地页访问 d.LandPageVisitCount = s.LandPageVisitCount d.LandpageAndroidClick = s.LandpageAndroidClick d.LandpageIosAppstoreClick = s.LandpageIosAppstoreClick d.LandpageIosAthorClick = s.LandpageIosAthorClick d.LandpageIosH5Click = s.LandpageIosH5Click } func (s *ChannelSettlement) AccumulateTo(d *ChannelStat) { d.ValidDirectCount += s.ValidDirectCount d.ValidDeductionCount += s.ValidDeductionCount d.ValidPayMoney += s.ValidPayMoney d.ValidPayCoin += s.ValidPayCoin d.NewTotalIpCount += s.NewTotalIpCount d.NewTotalCount += s.NewTotalCount d.NewDirectCount += s.NewDirectCount d.NewFissionCount += s.NewFissionCount d.NewDeductionCount += s.NewDeductionCount d.NewAndroidCount += s.NewAndroidCount d.NewAndroidDirectCount += s.NewAndroidDirectCount d.NewAndroidFissionCount += s.NewAndroidFissionCount d.NewAndroidDeductionCount += s.NewAndroidDeductionCount d.NewIosCount += s.NewIosCount d.NewIosDirectCount += s.NewIosDirectCount d.NewIosFissionCount += s.NewIosFissionCount d.NewIosDeductionCount += s.NewIosDeductionCount d.NewLightCount += s.NewLightCount d.NewLightGuestCount += s.NewLightGuestCount d.NewLightGuestDirectCount += s.NewLightGuestDirectCount d.NewLightGuestFissionCount += s.NewLightGuestFissionCount d.NewLightGuestDeductionCount += s.NewLightGuestDeductionCount d.NewLightFormalCount += s.NewLightFormalCount d.NewLightFormalDirectCount += s.NewLightFormalDirectCount d.NewLightFormalFissionCount += s.NewLightFormalFissionCount d.NewLightFormalDeductionCount += s.NewLightFormalDeductionCount d.NewLightDirectCount += s.NewLightDirectCount d.NewLightFissionCount += s.NewLightFissionCount d.NewLightDeductionCount += s.NewLightDeductionCount d.NewLightNaturalCount += s.NewLightNaturalCount d.NewH5Count += s.NewH5Count d.NewH5DirectCount += s.NewH5DirectCount d.NewH5FissionCount += s.NewH5FissionCount d.NewH5DeductionCount += s.NewH5DeductionCount d.NewH5AndroidCount += s.NewH5AndroidCount d.NewH5IosCount += s.NewH5IosCount d.NewH5PcCount += s.NewH5PcCount d.NewH5FormalCount += s.NewH5FormalCount d.NewH5FormalDirectCount += s.NewH5FormalDirectCount d.NewH5FormalFissionCount += s.NewH5FormalFissionCount d.NewH5FormalDeductionCount += s.NewH5FormalDeductionCount // 访问 d.TotalVisitCount += s.TotalVisitCount d.DirectVisitCount += s.DirectVisitCount d.FissionVisitCount += s.FissionVisitCount d.AndroidVisitCount += s.AndroidVisitCount d.IosVisitCount += s.IosVisitCount d.LightVisitCount += s.LightVisitCount d.LightVisitDirectCount += s.LightVisitDirectCount d.LightVisitFissionCount += s.LightVisitFissionCount d.LightVisitDeductionCount += s.LightVisitDeductionCount d.LightVisitNaturalCount += s.LightVisitNaturalCount d.H5VisitCount += s.H5VisitCount d.H5AndroidVisitCount += s.H5AndroidVisitCount d.H5IosVisitCount += s.H5IosVisitCount d.H5PcVisitCount += s.H5PcVisitCount // 充值 d.TotalAmount += s.TotalAmount d.DirectAmount += s.DirectAmount d.DirectAmountCount += s.DirectAmountCount d.FissionAmount += s.FissionAmount d.FissionAmountCount += s.FissionAmountCount d.NaturalAmount += s.NaturalAmount d.NaturalAmountCount += s.NaturalAmountCount d.DeductionAmount += s.DeductionAmount d.DeductionAmountCount += s.DeductionAmountCount d.AndroidAmount += s.AndroidAmount d.AndroidAmountCount += s.AndroidAmountCount d.IosAmount += s.IosAmount d.IosAmountCount += s.IosAmountCount d.H5Amount += s.H5Amount d.H5AmountCount += s.H5AmountCount d.LightAmount += s.LightAmount d.LightAmountCount += s.LightAmountCount d.LightDirectAmount += s.LightDirectAmount d.LightDirectAmountCount += s.LightDirectAmountCount d.LightFissionAmount += s.LightFissionAmount d.LightFissionAmountCount += s.LightFissionAmountCount d.LightDeductionAmount += s.LightDeductionAmount d.LightDeductionAmountCount += s.LightDeductionAmountCount d.LightNaturalAmount += s.LightNaturalAmount d.LightNaturalAmountCount += s.LightNaturalAmountCount // 其他充值 d.NewRechargeAmount += s.NewRechargeAmount d.VipPayMoney += s.VipPayMoney d.VipPayCoin += s.VipPayCoin d.VipPayDeduction += s.VipPayDeduction d.GameRechageAmount += s.GameRechageAmount d.GameWithdrawAmount += s.GameWithdrawAmount // 落地页访问 d.LandPageVisitCount += s.LandPageVisitCount d.LandpageAndroidClick += s.LandpageAndroidClick d.LandpageIosAppstoreClick += s.LandpageIosAppstoreClick d.LandpageIosAthorClick += s.LandpageIosAthorClick d.LandpageIosH5Click += s.LandpageIosH5Click } func (s *ChannelStat) AssignmentTo(d *ChannelSettlement) { d.ValidDirectCount = s.ValidDirectCount d.ValidDeductionCount = s.ValidDeductionCount d.ValidPayMoney = s.ValidPayMoney d.ValidPayCoin = s.ValidPayCoin d.NewTotalIpCount = s.NewTotalIpCount d.NewTotalCount = s.NewTotalCount d.NewDirectCount = s.NewDirectCount d.NewFissionCount = s.NewFissionCount d.NewDeductionCount = s.NewDeductionCount d.NewAndroidCount = s.NewAndroidCount d.NewAndroidDirectCount = s.NewAndroidDirectCount d.NewAndroidFissionCount = s.NewAndroidFissionCount d.NewAndroidDeductionCount = s.NewAndroidDeductionCount d.NewIosCount = s.NewIosCount d.NewIosDirectCount = s.NewIosDirectCount d.NewIosFissionCount = s.NewIosFissionCount d.NewIosDeductionCount = s.NewIosDeductionCount d.NewLightCount = s.NewLightCount d.NewLightGuestCount = s.NewLightGuestCount d.NewLightGuestDirectCount = s.NewLightGuestDirectCount d.NewLightGuestFissionCount = s.NewLightGuestFissionCount d.NewLightGuestDeductionCount = s.NewLightGuestDeductionCount d.NewLightFormalCount = s.NewLightFormalCount d.NewLightFormalDirectCount = s.NewLightFormalDirectCount d.NewLightFormalFissionCount = s.NewLightFormalFissionCount d.NewLightFormalDeductionCount = s.NewLightFormalDeductionCount d.NewLightDirectCount = s.NewLightDirectCount d.NewLightFissionCount = s.NewLightFissionCount d.NewLightDeductionCount = s.NewLightDeductionCount d.NewLightNaturalCount = s.NewLightNaturalCount d.NewH5Count = s.NewH5Count d.NewH5DirectCount = s.NewH5DirectCount d.NewH5FissionCount = s.NewH5FissionCount d.NewH5DeductionCount = s.NewH5DeductionCount d.NewH5AndroidCount = s.NewH5AndroidCount d.NewH5IosCount = s.NewH5IosCount d.NewH5PcCount = s.NewH5PcCount d.NewH5FormalCount = s.NewH5FormalCount d.NewH5FormalDirectCount = s.NewH5FormalDirectCount d.NewH5FormalFissionCount = s.NewH5FormalFissionCount d.NewH5FormalDeductionCount = s.NewH5FormalDeductionCount // 访问 d.TotalVisitCount = s.TotalVisitCount d.DirectVisitCount = s.DirectVisitCount d.FissionVisitCount = s.FissionVisitCount d.AndroidVisitCount = s.AndroidVisitCount d.IosVisitCount = s.IosVisitCount d.LightVisitCount = s.LightVisitCount d.LightVisitDirectCount = s.LightVisitDirectCount d.LightVisitFissionCount = s.LightVisitFissionCount d.LightVisitDeductionCount = s.LightVisitDeductionCount d.LightVisitNaturalCount = s.LightVisitNaturalCount d.H5VisitCount = s.H5VisitCount d.H5AndroidVisitCount = s.H5AndroidVisitCount d.H5IosVisitCount = s.H5IosVisitCount d.H5PcVisitCount = s.H5PcVisitCount // 充值 d.TotalAmount = s.TotalAmount d.DirectAmount = s.DirectAmount d.DirectAmountCount = s.DirectAmountCount d.FissionAmount = s.FissionAmount d.FissionAmountCount = s.FissionAmountCount d.NaturalAmount = s.NaturalAmount d.NaturalAmountCount = s.NaturalAmountCount d.DeductionAmount = s.DeductionAmount d.DeductionAmountCount = s.DeductionAmountCount d.AndroidAmount = s.AndroidAmount d.AndroidAmountCount = s.AndroidAmountCount d.IosAmount = s.IosAmount d.IosAmountCount = s.IosAmountCount d.H5Amount = s.H5Amount d.H5AmountCount = s.H5AmountCount d.LightAmount = s.LightAmount d.LightAmountCount = s.LightAmountCount d.LightDirectAmount = s.LightDirectAmount d.LightDirectAmountCount = s.LightDirectAmountCount d.LightFissionAmount = s.LightFissionAmount d.LightFissionAmountCount = s.LightFissionAmountCount d.LightDeductionAmount = s.LightDeductionAmount d.LightDeductionAmountCount = s.LightDeductionAmountCount d.LightNaturalAmount = s.LightNaturalAmount d.LightNaturalAmountCount = s.LightNaturalAmountCount // 其他充值 d.NewRechargeAmount = s.NewRechargeAmount d.VipPayMoney = s.VipPayMoney d.VipPayCoin = s.VipPayCoin d.VipPayDeduction = s.VipPayDeduction d.GameRechageAmount = s.GameRechageAmount d.GameWithdrawAmount = s.GameWithdrawAmount // 落地页访问 d.LandPageVisitCount = s.LandPageVisitCount d.LandpageAndroidClick = s.LandpageAndroidClick d.LandpageIosAppstoreClick = s.LandpageIosAppstoreClick d.LandpageIosAthorClick = s.LandpageIosAthorClick d.LandpageIosH5Click = s.LandpageIosH5Click } func (s *ChannelStat) AccumulateTo(d *ChannelSettlement) { d.ValidDirectCount += s.ValidDirectCount d.ValidDeductionCount += s.ValidDeductionCount d.ValidPayMoney += s.ValidPayMoney d.ValidPayCoin += s.ValidPayCoin d.NewTotalIpCount += s.NewTotalIpCount d.NewTotalCount += s.NewTotalCount d.NewDirectCount += s.NewDirectCount d.NewFissionCount += s.NewFissionCount d.NewDeductionCount += s.NewDeductionCount d.NewAndroidCount += s.NewAndroidCount d.NewAndroidDirectCount += s.NewAndroidDirectCount d.NewAndroidFissionCount += s.NewAndroidFissionCount d.NewAndroidDeductionCount += s.NewAndroidDeductionCount d.NewIosCount += s.NewIosCount d.NewIosDirectCount += s.NewIosDirectCount d.NewIosFissionCount += s.NewIosFissionCount d.NewIosDeductionCount += s.NewIosDeductionCount d.NewLightCount += s.NewLightCount d.NewLightGuestCount += s.NewLightGuestCount d.NewLightGuestDirectCount += s.NewLightGuestDirectCount d.NewLightGuestFissionCount += s.NewLightGuestFissionCount d.NewLightGuestDeductionCount += s.NewLightGuestDeductionCount d.NewLightFormalCount += s.NewLightFormalCount d.NewLightFormalDirectCount += s.NewLightFormalDirectCount d.NewLightFormalFissionCount += s.NewLightFormalFissionCount d.NewLightFormalDeductionCount += s.NewLightFormalDeductionCount d.NewLightDirectCount += s.NewLightDirectCount d.NewLightFissionCount += s.NewLightFissionCount d.NewLightDeductionCount += s.NewLightDeductionCount d.NewLightNaturalCount += s.NewLightNaturalCount d.NewH5Count += s.NewH5Count d.NewH5DirectCount += s.NewH5DirectCount d.NewH5FissionCount += s.NewH5FissionCount d.NewH5DeductionCount += s.NewH5DeductionCount d.NewH5AndroidCount += s.NewH5AndroidCount d.NewH5IosCount += s.NewH5IosCount d.NewH5PcCount += s.NewH5PcCount d.NewH5FormalCount += s.NewH5FormalCount d.NewH5FormalDirectCount += s.NewH5FormalDirectCount d.NewH5FormalFissionCount += s.NewH5FormalFissionCount d.NewH5FormalDeductionCount += s.NewH5FormalDeductionCount // 访问 d.TotalVisitCount += s.TotalVisitCount d.DirectVisitCount += s.DirectVisitCount d.FissionVisitCount += s.FissionVisitCount d.AndroidVisitCount += s.AndroidVisitCount d.IosVisitCount += s.IosVisitCount d.LightVisitCount += s.LightVisitCount d.LightVisitDirectCount += s.LightVisitDirectCount d.LightVisitFissionCount += s.LightVisitFissionCount d.LightVisitDeductionCount += s.LightVisitDeductionCount d.LightVisitNaturalCount += s.LightVisitNaturalCount d.H5VisitCount += s.H5VisitCount d.H5AndroidVisitCount += s.H5AndroidVisitCount d.H5IosVisitCount += s.H5IosVisitCount d.H5PcVisitCount += s.H5PcVisitCount // 充值 d.TotalAmount += s.TotalAmount d.DirectAmount += s.DirectAmount d.DirectAmountCount += s.DirectAmountCount d.FissionAmount += s.FissionAmount d.FissionAmountCount += s.FissionAmountCount d.NaturalAmount += s.NaturalAmount d.NaturalAmountCount += s.NaturalAmountCount d.DeductionAmount += s.DeductionAmount d.DeductionAmountCount += s.DeductionAmountCount d.AndroidAmount += s.AndroidAmount d.AndroidAmountCount += s.AndroidAmountCount d.IosAmount += s.IosAmount d.IosAmountCount += s.IosAmountCount d.LightAmount += s.LightAmount d.LightAmountCount += s.LightAmountCount d.LightDirectAmount += s.LightDirectAmount d.LightDirectAmountCount += s.LightDirectAmountCount d.LightFissionAmount += s.LightFissionAmount d.LightFissionAmountCount += s.LightFissionAmountCount d.LightDeductionAmount += s.LightDeductionAmount d.LightDeductionAmountCount += s.LightDeductionAmountCount d.LightNaturalAmount += s.LightNaturalAmount d.LightNaturalAmountCount += s.LightNaturalAmountCount // 其他充值 d.NewRechargeAmount += s.NewRechargeAmount d.VipPayMoney += s.VipPayMoney d.VipPayCoin += s.VipPayCoin d.VipPayDeduction += s.VipPayDeduction d.GameRechageAmount += s.GameRechageAmount d.GameWithdrawAmount += s.GameWithdrawAmount // 落地页访问 d.LandPageVisitCount += s.LandPageVisitCount d.LandpageAndroidClick += s.LandpageAndroidClick d.LandpageIosAppstoreClick += s.LandpageIosAppstoreClick d.LandpageIosAthorClick += s.LandpageIosAthorClick d.LandpageIosH5Click += s.LandpageIosH5Click } func (s *ChannelStat) CalcIncomeRate() *ChannelStat { if s.Settlement == SettlementCPA && s.CPAPrice > 0 { spendMoney := s.ValidDirectCount * s.CPAPrice incomeMoney := getConfig(s.AppId).GetIncome(s) //s.DirectAmount if spendMoney > 0 { s.IncomeAmount = spendMoney s.IncomeRate, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", float64(incomeMoney)/float64(spendMoney)), 64) } } else if s.Settlement == SettlementCPS && s.CPSRate > 0 { spendMoney := s.ValidPayMoney * s.CPSRate / 100 incomeMoney := getConfig(s.AppId).GetIncome(s) // s.DirectAmount if spendMoney > 0 { s.IncomeAmount = spendMoney s.IncomeRate, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", float64(incomeMoney)/float64(spendMoney)), 64) } } return s } func (s *ChannelStat) CorrectValidData() *ChannelStat { //if s.ValidDirectCount == 0 && s.ValidPayMoney == 0 { s.ValidDirectCount, s.ValidPayMoney, s.ValidPayCoin, s.ValidDeductionCount = GetChannelStatValidData(s) //} if s.TotalVisitCount != s.DirectVisitCount+s.FissionVisitCount { s.TotalVisitCount = s.DirectVisitCount + s.FissionVisitCount } if s.NewTotalCount != s.NewDirectCount+s.NewFissionCount+s.NewDeductionCount { s.NewTotalCount = s.NewDirectCount + s.NewFissionCount + s.NewDeductionCount } if s.DirectAmount+s.FissionAmount+s.DeductionAmount != s.TotalAmount { s.TotalAmount = s.DirectAmount + s.FissionAmount + s.DeductionAmount } if s.VipPayMoney+s.VipPayDeduction+s.VipPayCoin != s.TotalAmount { s.VipPayCoin = s.TotalAmount - s.VipPayMoney - s.VipPayDeduction } return s } func (s *ChannelSettlement) CorrectValidData() *ChannelSettlement { //if s.ValidDirectCount == 0 && s.ValidPayMoney == 0 { s.ValidDirectCount, s.ValidPayMoney, s.ValidPayCoin, s.ValidDeductionCount = GetChannelSettlementValidData(s) //} if s.TotalVisitCount != s.DirectVisitCount+s.FissionVisitCount { s.TotalVisitCount = s.DirectVisitCount + s.FissionVisitCount } if s.NewTotalCount != s.NewDirectCount+s.NewFissionCount+s.NewDeductionCount { s.NewTotalCount = s.NewDirectCount + s.NewFissionCount + s.NewDeductionCount } if s.DirectAmount+s.FissionAmount+s.DeductionAmount != s.TotalAmount { s.TotalAmount = s.DirectAmount + s.FissionAmount + s.DeductionAmount } if s.VipPayMoney+s.VipPayDeduction+s.VipPayCoin != s.TotalAmount { s.VipPayCoin = s.TotalAmount - s.VipPayMoney - s.VipPayDeduction } return s } func GetChannelStatValidData(stat *ChannelStat) (count int64, amount int64, coin int64, deduction int64) { switch stat.AppType { case AppTypePkg: count = stat.NewAndroidDirectCount + stat.NewIosDirectCount deduction = stat.NewAndroidDeductionCount + stat.NewIosDeductionCount amount = stat.VipPayMoney coin = stat.ValidPayCoin case AppTypeLight: if stat.PromoteMode == PromoteModeRegister { count = stat.NewLightFormalDirectCount deduction = stat.NewLightFormalDeductionCount } else { count = stat.NewLightDirectCount deduction = stat.NewLightDeductionCount } amount = stat.VipPayMoney coin = stat.ValidPayCoin case AppTypeH5: if stat.PromoteMode == PromoteModeRegister { count = stat.NewH5FormalDirectCount deduction = stat.NewH5FormalDeductionCount } else { count = stat.NewH5DirectCount deduction = stat.NewH5DeductionCount } amount = stat.VipPayMoney coin = stat.ValidPayCoin default: count = stat.NewDirectCount deduction = stat.NewDeductionCount amount = stat.VipPayMoney if stat.AppId == 6666 && amount == 0 { // 咻车宝按照充值金币计算 amount += stat.VipPayCoin } coin = stat.ValidPayCoin } return } func GetChannelSettlementValidData(stat *ChannelSettlement) (count int64, amount int64, coin int64, deduction int64) { switch stat.AppType { case AppTypePkg: count = stat.NewAndroidDirectCount + stat.NewIosDirectCount deduction = stat.NewAndroidDeductionCount + stat.NewIosDeductionCount amount = stat.VipPayMoney coin = stat.ValidPayCoin case AppTypeLight: if stat.PromoteMode == PromoteModeRegister { count = stat.NewLightFormalDirectCount deduction = stat.NewLightFormalDeductionCount } else { count = stat.NewLightDirectCount deduction = stat.NewLightDeductionCount } amount = stat.VipPayMoney coin = stat.ValidPayCoin case AppTypeH5: if stat.PromoteMode == PromoteModeRegister { count = stat.NewH5FormalDirectCount deduction = stat.NewH5FormalDeductionCount } else { count = stat.NewH5DirectCount deduction = stat.NewH5DeductionCount } amount = stat.VipPayMoney coin = stat.ValidPayCoin default: count = stat.NewDirectCount deduction = stat.NewDeductionCount amount = stat.VipPayMoney coin = stat.ValidPayCoin } return } func ChannelStatSummation(base, value *ChannelStat) { value.CorrectValidData() base.ValidDirectCount += value.ValidDirectCount base.ValidDeductionCount += value.ValidDeductionCount base.ValidPayMoney += value.ValidPayMoney base.ValidPayCoin += value.ValidPayCoin base.NewTotalIpCount += value.NewTotalIpCount base.NewTotalCount += value.NewTotalCount base.NewDirectCount += value.NewDirectCount base.NewFissionCount += value.NewFissionCount base.NewDeductionCount += value.NewDeductionCount base.NewAndroidCount += value.NewAndroidCount base.NewAndroidDirectCount += value.NewAndroidDirectCount base.NewAndroidFissionCount += value.NewAndroidFissionCount base.NewAndroidDeductionCount += value.NewAndroidDeductionCount base.NewIosCount += value.NewIosCount base.NewIosDirectCount += value.NewIosDirectCount base.NewIosFissionCount += value.NewIosFissionCount base.NewIosDeductionCount += value.NewIosDeductionCount base.NewLightCount += value.NewLightCount base.NewLightGuestCount += value.NewLightGuestCount base.NewLightGuestDirectCount += value.NewLightGuestDirectCount base.NewLightGuestFissionCount += value.NewLightGuestFissionCount base.NewLightGuestDeductionCount += value.NewLightGuestDeductionCount base.NewLightFormalCount += value.NewLightFormalCount base.NewLightFormalDirectCount += value.NewLightFormalDirectCount base.NewLightFormalFissionCount += value.NewLightFormalFissionCount base.NewLightFormalDeductionCount += value.NewLightFormalDeductionCount base.NewLightDirectCount += value.NewLightDirectCount base.NewLightFissionCount += value.NewLightFissionCount base.NewLightDeductionCount += value.NewLightDeductionCount base.NewLightNaturalCount += value.NewLightNaturalCount base.NewH5Count += value.NewH5Count base.NewH5DirectCount += value.NewH5DirectCount base.NewH5FissionCount += value.NewH5FissionCount base.NewH5DeductionCount += value.NewH5DeductionCount base.NewH5AndroidCount += value.NewH5AndroidCount base.NewH5IosCount += value.NewH5IosCount base.NewH5PcCount += value.NewH5PcCount base.NewH5FormalCount += value.NewH5FormalCount base.NewH5FormalDirectCount += value.NewH5FormalDirectCount base.NewH5FormalFissionCount += value.NewH5FormalFissionCount base.NewH5FormalDeductionCount += value.NewH5FormalDeductionCount // 访问 base.TotalVisitCount += value.TotalVisitCount base.DirectVisitCount += value.DirectVisitCount base.FissionVisitCount += value.FissionVisitCount base.AndroidVisitCount += value.AndroidVisitCount base.IosVisitCount += value.IosVisitCount base.LightVisitCount += value.LightVisitCount base.LightVisitDirectCount += value.LightVisitDirectCount base.LightVisitFissionCount += value.LightVisitFissionCount base.LightVisitDeductionCount += value.LightVisitDeductionCount base.LightVisitNaturalCount += value.LightVisitNaturalCount base.H5VisitCount += value.H5VisitCount base.H5AndroidVisitCount += value.H5AndroidVisitCount base.H5IosVisitCount += value.H5IosVisitCount base.H5PcVisitCount += value.H5PcVisitCount // 充值 base.TotalAmount += value.TotalAmount base.DirectAmount += value.DirectAmount base.DirectAmountCount += value.DirectAmountCount base.FissionAmount += value.FissionAmount base.FissionAmountCount += value.FissionAmountCount base.NaturalAmount += value.NaturalAmount base.NaturalAmountCount += value.NaturalAmountCount base.DeductionAmount += value.DeductionAmount base.DeductionAmountCount += value.DeductionAmountCount base.AndroidAmount += value.AndroidAmount base.AndroidAmountCount += value.AndroidAmountCount base.IosAmount += value.IosAmount base.IosAmountCount += value.IosAmountCount base.H5Amount += value.H5Amount base.H5AmountCount += value.H5AmountCount base.LightAmount += value.LightAmount base.LightAmountCount += value.LightAmountCount base.LightDirectAmount += value.LightDirectAmount base.LightDirectAmountCount += value.LightDirectAmountCount base.LightFissionAmount += value.LightFissionAmount base.LightFissionAmountCount += value.LightFissionAmountCount base.LightDeductionAmount += value.LightDeductionAmount base.LightDeductionAmountCount += value.LightDeductionAmountCount base.LightNaturalAmount += value.LightNaturalAmount base.LightNaturalAmountCount += value.LightNaturalAmountCount // 其他充值 base.NewRechargeAmount += value.NewRechargeAmount base.VipPayMoney += value.VipPayMoney base.VipPayCoin += value.DirectAmount + value.FissionAmount - value.VipPayMoney - value.VipPayDeduction base.VipPayDeduction += value.VipPayDeduction base.GameRechageAmount += value.GameRechageAmount base.GameWithdrawAmount += value.GameWithdrawAmount // 落地页访问 base.LandPageVisitCount += value.LandPageVisitCount base.LandpageAndroidClick += value.LandpageAndroidClick base.LandpageIosAppstoreClick += value.LandpageIosAppstoreClick base.LandpageIosAthorClick += value.LandpageIosAthorClick base.LandpageIosH5Click += value.LandpageIosH5Click } func CalculateChannelIncome(stat *ChannelStat) (int64, string) { var income int64 var desc string if stat.Settlement == SettlementCPA { income = stat.ValidDirectCount * stat.CPAPrice desc = fmt.Sprintf("CPA:%d * %.2f", stat.ValidDirectCount, float64(stat.CPAPrice)/float64(100)) } else if stat.Settlement == SettlementCPS { income += (stat.ValidPayMoney * stat.CPSRate) / 100 desc = fmt.Sprintf("CPS:%.2f * %.2f", float64(stat.ValidPayMoney)/float64(100), float64(stat.CPSRate)/float64(100)) } else { income = 0 desc = fmt.Sprintf("【%s】结算方式,需要自己计算结算金额", stat.Settlement) } return income, desc }