|
- package svc
-
- import (
- "applet/app/md"
- "applet/app/utils"
- db "code.fnuoos.com/zhimeng/model.git/src"
- "code.fnuoos.com/zhimeng/model.git/src/super/implement"
- "code.fnuoos.com/zhimeng/model.git/src/super/model"
- "errors"
- "time"
- )
-
- func GenerateWxAdData(req md.GenerateWxAdData) (err error, generateWxAdData model.GenerateWxAdData) {
- //1、查找原始数据记录
- originalWxAdDataDb := implement.NewOriginalWxAdDataDb(db.Db)
- originalWxAdData, err := originalWxAdDataDb.GetOriginalWxAdData(req.GenerateDataId)
- if err != nil {
- return
- }
- if originalWxAdData == nil {
- err = errors.New("未查询到原始数据记录")
- return
- }
-
- //2、查询对应媒体、代理的分成策略
- mediumDivisionStrategyDb := implement.NewMediumDivisionStrategyDb(db.Db)
- mediumDivisionStrategy, err := mediumDivisionStrategyDb.GetOriginalWxAdDataByMediumId(originalWxAdData.MediumId)
- if err != nil {
- return
- }
- if mediumDivisionStrategy == nil {
- err = errors.New("未查询到对应代理的分成策略")
- return
- }
- mediumDivisionStrategyWithAgentFlowDb := implement.NewMediumDivisionStrategyWithAgentFlowDb(db.Db)
- mediumDivisionStrategyWithAgentFlows, err := mediumDivisionStrategyWithAgentFlowDb.FindMediumDivisionStrategyWithAgentFlowByStrategyId(mediumDivisionStrategy.MediumId)
- if err != nil {
- return
- }
-
- //3、计算媒体、代理收益、平台留存、佣金留存、协议分成、协议总分成
- publisherIncome := originalWxAdData.PublisherIncome
- mediaRevenue := publisherIncome * mediumDivisionStrategy.MediaRevenueRate / 100 //媒体收益
- agentRevenue := publisherIncome * mediumDivisionStrategy.AgentRevenueRate / 100 //代理收益
- platformRetention := publisherIncome * mediumDivisionStrategy.PlatformRetentionRate / 100 //平台留存
- commissionRetention := publisherIncome * mediumDivisionStrategy.CommissionRetentionRate / 100 //佣金留存
- agreementSharingTotal := (mediaRevenue + agentRevenue) / (100 - mediumDivisionStrategy.AgreementSharingRate) //协议总分成(倒推)
- agreementSharing := agreementSharingTotal - (mediaRevenue + agentRevenue) //协议分成
-
- //3、判断是否有调价留存
- var priceAdjustmentRetention int
- if req.NowEcpm != req.OriginalEcpm || req.NowExposureCount != req.OriginalExposureCount {
- tmpMediaRevenue := int(utils.StrToFloat64(req.NowEcpm) * float64(req.NowExposureCount) / 1000)
- priceAdjustmentRetention = tmpMediaRevenue - mediaRevenue
- mediaRevenue = tmpMediaRevenue
- }
-
- //4、计算各代理收益
- var extraRevenue int
- var agentRevenueFlows []struct {
- AgentId int `json:"agent_id"`
- AgentRevenueRate int `json:"agent_revenue_rate"`
- ExtraRevenueRate int `json:"extra_revenue_rate"`
- AgentRevenue int `json:"agent_revenue"`
- ExtraRevenue int `json:"extra_revenue"`
- }
- for _, v := range *mediumDivisionStrategyWithAgentFlows {
- tmpAgentRevenue := agentRevenue * v.AgentRevenueRate / 100
- tmpExtraRevenue := commissionRetention * v.ExtraRevenueRate / 100
- extraRevenue += tmpExtraRevenue
- agentRevenueFlows = append(agentRevenueFlows, struct {
- AgentId int `json:"agent_id"`
- AgentRevenueRate int `json:"agent_revenue_rate"`
- ExtraRevenueRate int `json:"extra_revenue_rate"`
- AgentRevenue int `json:"agent_revenue"`
- ExtraRevenue int `json:"extra_revenue"`
- }{
- AgentId: v.AgentId,
- AgentRevenueRate: v.AgentRevenueRate,
- ExtraRevenueRate: v.ExtraRevenueRate,
- AgentRevenue: tmpAgentRevenue,
- ExtraRevenue: tmpExtraRevenue,
- })
- }
-
- //5、插入 generate_wx_ad_data 、generate_wx_ad_data_with_agent_flow 数据
- session := db.Db.NewSession()
- defer session.Close()
- session.Begin()
-
- now := time.Now()
- generateWxAdData = model.GenerateWxAdData{
- Uuid: originalWxAdData.Uuid,
- AppId: originalWxAdData.AppId,
- GenerateDataId: originalWxAdData.Id,
- SlotId: originalWxAdData.SlotId,
- AdSlot: originalWxAdData.AdSlot,
- Date: originalWxAdData.Date,
- ReqSuccCount: originalWxAdData.ReqSuccCount,
- ExposureCount: req.NowExposureCount, //现-曝光量
- ExposureRate: originalWxAdData.ExposureRate,
- ClickCount: originalWxAdData.ClickCount,
- ClickRate: originalWxAdData.ClickRate,
- Ecpm: req.NowEcpm, //现-ecpm
- PlatformRetention: platformRetention,
- CommissionRetention: commissionRetention,
- PriceAdjustmentRetention: priceAdjustmentRetention,
- MediaRevenue: mediaRevenue,
- AgentRevenue: agentRevenue,
- ExtraRevenue: extraRevenue,
- AgreementSharing: agreementSharing,
- AgreementSharingTotal: agreementSharingTotal,
- PlatformRetentionRate: mediumDivisionStrategy.PlatformRetentionRate,
- CommissionRetentionRate: mediumDivisionStrategy.CommissionRetentionRate,
- MediaRevenueRate: mediumDivisionStrategy.MediaRevenueRate,
- AgentRevenueRate: mediumDivisionStrategy.AgentRevenueRate,
- ExtraRevenueRate: mediumDivisionStrategy.ExtraRevenueRate,
- AgreementSharingRate: mediumDivisionStrategy.AgreementSharingRate,
- IsGenerateReport: 0,
- CreateAt: now.Format("2006-01-02 15:04:05"),
- UpdateAt: now.Format("2006-01-02 15:04:05"),
- }
- generateWxAdDataDb := implement.NewGenerateWxAdDataDb(db.Db)
- _, err = generateWxAdDataDb.GenerateWxAdDataInsertBySession(session, &generateWxAdData)
- if err != nil {
- _ = session.Rollback()
- return
- }
-
- var generateWxAdDataWithAgentFlows []*model.GenerateWxAdDataWithAgentFlow
- for _, v := range agentRevenueFlows {
- generateWxAdDataWithAgentFlows = append(generateWxAdDataWithAgentFlows, &model.GenerateWxAdDataWithAgentFlow{
- Uuid: generateWxAdData.Uuid,
- AppId: generateWxAdData.AppId,
- AgentId: v.AgentId,
- GenerateDataId: generateWxAdData.Id,
- SlotId: generateWxAdData.SlotId,
- AdSlot: generateWxAdData.AdSlot,
- Date: generateWxAdData.Date,
- AgentRevenue: v.AgentRevenue,
- AgentRevenueRate: v.AgentRevenueRate,
- ExtraRevenue: v.ExtraRevenue,
- ExtraRevenueRate: v.ExtraRevenueRate,
- CreateAt: now.Format("2006-01-02 15:04:05"),
- UpdateAt: now.Format("2006-01-02 15:04:05"),
- })
- }
- generateWxAdDataWithAgentFlowDb := implement.NewGenerateWxAdDataWithAgentFlowDb(db.Db)
- _, err = generateWxAdDataWithAgentFlowDb.BatchAddGenerateWxAdDataWithAgentFlow(session, generateWxAdDataWithAgentFlows)
- if err != nil {
- _ = session.Rollback()
- return
- }
-
- //6、修改 original_wx_ad_data 记录中的 is_apply(是否已应用(0:未 1:已) )
- originalWxAdData.IsApply = 1
- _, err = originalWxAdDataDb.UpdateOriginalWxAdDataBySession(session, originalWxAdData, "is_apply")
- if err != nil {
- _ = session.Rollback()
- return
- }
- return session.Commit(), generateWxAdData
- }
-
- func ClacEcpm(req md.ClacEcpmReq) (err error, ecpm string) {
- //1、查找原始数据记录
- originalWxAdDataDb := implement.NewOriginalWxAdDataDb(db.Db)
- originalWxAdData, err := originalWxAdDataDb.GetOriginalWxAdData(req.GenerateDataId)
- if err != nil {
- return
- }
- if originalWxAdData == nil {
- err = errors.New("未查询到原始数据记录")
- return
- }
-
- //2、查询对应媒体分成策略
- mediumDivisionStrategyDb := implement.NewMediumDivisionStrategyDb(db.Db)
- mediumDivisionStrategy, err := mediumDivisionStrategyDb.GetOriginalWxAdDataByMediumId(originalWxAdData.MediumId)
- if err != nil {
- return
- }
- if mediumDivisionStrategy == nil {
- err = errors.New("未查询到对应代理的分成策略")
- return
- }
-
- //3、计算媒体、代理收益、协议总分成
- publisherIncome := originalWxAdData.PublisherIncome
- mediaRevenue := publisherIncome * mediumDivisionStrategy.MediaRevenueRate / 100 //媒体收益
- agentRevenue := publisherIncome * mediumDivisionStrategy.AgentRevenueRate / 100 //代理收益
- agreementSharingTotal := (mediaRevenue + agentRevenue) / (100 - mediumDivisionStrategy.AgreementSharingRate) //协议总分成(倒推)
-
- //4、倒退出当前ecpm值
- ecpm = utils.Float64ToStrPrec4(float64(agreementSharingTotal) / (float64(originalWxAdData.ExposureCount) / 1000))
- return
- }
|