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

811 lines
29 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
}