广告平台(站长使用)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

svc_wx_data.go 8.2 KiB

3 weeks ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package svc
  2. import (
  3. "applet/app/md"
  4. "applet/app/utils"
  5. db "code.fnuoos.com/zhimeng/model.git/src"
  6. "code.fnuoos.com/zhimeng/model.git/src/super/implement"
  7. "code.fnuoos.com/zhimeng/model.git/src/super/model"
  8. "errors"
  9. "time"
  10. )
  11. func GenerateWxAdData(req md.GenerateWxAdData) (err error, generateWxAdData model.GenerateWxAdData) {
  12. //1、查找原始数据记录
  13. originalWxAdDataDb := implement.NewOriginalWxAdDataDb(db.Db)
  14. originalWxAdData, err := originalWxAdDataDb.GetOriginalWxAdData(req.GenerateDataId)
  15. if err != nil {
  16. return
  17. }
  18. if originalWxAdData == nil {
  19. err = errors.New("未查询到原始数据记录")
  20. return
  21. }
  22. //2、查询对应媒体、代理的分成策略
  23. mediumDivisionStrategyDb := implement.NewMediumDivisionStrategyDb(db.Db)
  24. mediumDivisionStrategy, err := mediumDivisionStrategyDb.GetOriginalWxAdDataByMediumId(originalWxAdData.MediumId)
  25. if err != nil {
  26. return
  27. }
  28. if mediumDivisionStrategy == nil {
  29. err = errors.New("未查询到对应代理的分成策略")
  30. return
  31. }
  32. mediumDivisionStrategyWithAgentFlowDb := implement.NewMediumDivisionStrategyWithAgentFlowDb(db.Db)
  33. mediumDivisionStrategyWithAgentFlows, err := mediumDivisionStrategyWithAgentFlowDb.FindMediumDivisionStrategyWithAgentFlowByStrategyId(mediumDivisionStrategy.MediumId)
  34. if err != nil {
  35. return
  36. }
  37. //3、计算媒体、代理收益、平台留存、佣金留存、协议分成、协议总分成
  38. publisherIncome := originalWxAdData.PublisherIncome
  39. mediaRevenue := publisherIncome * mediumDivisionStrategy.MediaRevenueRate / 100 //媒体收益
  40. agentRevenue := publisherIncome * mediumDivisionStrategy.AgentRevenueRate / 100 //代理收益
  41. platformRetention := publisherIncome * mediumDivisionStrategy.PlatformRetentionRate / 100 //平台留存
  42. commissionRetention := publisherIncome * mediumDivisionStrategy.CommissionRetentionRate / 100 //佣金留存
  43. agreementSharingTotal := (mediaRevenue + agentRevenue) / (100 - mediumDivisionStrategy.AgreementSharingRate) //协议总分成(倒推)
  44. agreementSharing := agreementSharingTotal - (mediaRevenue + agentRevenue) //协议分成
  45. //3、判断是否有调价留存
  46. var priceAdjustmentRetention int
  47. if req.NowEcpm != req.OriginalEcpm || req.NowExposureCount != req.OriginalExposureCount {
  48. tmpMediaRevenue := int(utils.StrToFloat64(req.NowEcpm) * float64(req.NowExposureCount) / 1000)
  49. priceAdjustmentRetention = tmpMediaRevenue - mediaRevenue
  50. mediaRevenue = tmpMediaRevenue
  51. }
  52. //4、计算各代理收益
  53. var extraRevenue int
  54. var agentRevenueFlows []struct {
  55. AgentId int `json:"agent_id"`
  56. AgentRevenueRate int `json:"agent_revenue_rate"`
  57. ExtraRevenueRate int `json:"extra_revenue_rate"`
  58. AgentRevenue int `json:"agent_revenue"`
  59. ExtraRevenue int `json:"extra_revenue"`
  60. }
  61. for _, v := range *mediumDivisionStrategyWithAgentFlows {
  62. tmpAgentRevenue := agentRevenue * v.AgentRevenueRate / 100
  63. tmpExtraRevenue := commissionRetention * v.ExtraRevenueRate / 100
  64. extraRevenue += tmpExtraRevenue
  65. agentRevenueFlows = append(agentRevenueFlows, struct {
  66. AgentId int `json:"agent_id"`
  67. AgentRevenueRate int `json:"agent_revenue_rate"`
  68. ExtraRevenueRate int `json:"extra_revenue_rate"`
  69. AgentRevenue int `json:"agent_revenue"`
  70. ExtraRevenue int `json:"extra_revenue"`
  71. }{
  72. AgentId: v.AgentId,
  73. AgentRevenueRate: v.AgentRevenueRate,
  74. ExtraRevenueRate: v.ExtraRevenueRate,
  75. AgentRevenue: tmpAgentRevenue,
  76. ExtraRevenue: tmpExtraRevenue,
  77. })
  78. }
  79. //5、插入 generate_wx_ad_data 、generate_wx_ad_data_with_agent_flow 数据
  80. session := db.Db.NewSession()
  81. defer session.Close()
  82. session.Begin()
  83. now := time.Now()
  84. generateWxAdData = model.GenerateWxAdData{
  85. Uuid: originalWxAdData.Uuid,
  86. AppId: originalWxAdData.AppId,
  87. GenerateDataId: originalWxAdData.Id,
  88. SlotId: originalWxAdData.SlotId,
  89. AdSlot: originalWxAdData.AdSlot,
  90. Date: originalWxAdData.Date,
  91. ReqSuccCount: originalWxAdData.ReqSuccCount,
  92. ExposureCount: req.NowExposureCount, //现-曝光量
  93. ExposureRate: originalWxAdData.ExposureRate,
  94. ClickCount: originalWxAdData.ClickCount,
  95. ClickRate: originalWxAdData.ClickRate,
  96. Ecpm: req.NowEcpm, //现-ecpm
  97. PlatformRetention: platformRetention,
  98. CommissionRetention: commissionRetention,
  99. PriceAdjustmentRetention: priceAdjustmentRetention,
  100. MediaRevenue: mediaRevenue,
  101. AgentRevenue: agentRevenue,
  102. ExtraRevenue: extraRevenue,
  103. AgreementSharing: agreementSharing,
  104. AgreementSharingTotal: agreementSharingTotal,
  105. PlatformRetentionRate: mediumDivisionStrategy.PlatformRetentionRate,
  106. CommissionRetentionRate: mediumDivisionStrategy.CommissionRetentionRate,
  107. MediaRevenueRate: mediumDivisionStrategy.MediaRevenueRate,
  108. AgentRevenueRate: mediumDivisionStrategy.AgentRevenueRate,
  109. ExtraRevenueRate: mediumDivisionStrategy.ExtraRevenueRate,
  110. AgreementSharingRate: mediumDivisionStrategy.AgreementSharingRate,
  111. IsGenerateReport: 0,
  112. CreateAt: now.Format("2006-01-02 15:04:05"),
  113. UpdateAt: now.Format("2006-01-02 15:04:05"),
  114. }
  115. generateWxAdDataDb := implement.NewGenerateWxAdDataDb(db.Db)
  116. _, err = generateWxAdDataDb.GenerateWxAdDataInsertBySession(session, &generateWxAdData)
  117. if err != nil {
  118. _ = session.Rollback()
  119. return
  120. }
  121. var generateWxAdDataWithAgentFlows []*model.GenerateWxAdDataWithAgentFlow
  122. for _, v := range agentRevenueFlows {
  123. generateWxAdDataWithAgentFlows = append(generateWxAdDataWithAgentFlows, &model.GenerateWxAdDataWithAgentFlow{
  124. Uuid: generateWxAdData.Uuid,
  125. AppId: generateWxAdData.AppId,
  126. AgentId: v.AgentId,
  127. GenerateDataId: generateWxAdData.Id,
  128. SlotId: generateWxAdData.SlotId,
  129. AdSlot: generateWxAdData.AdSlot,
  130. Date: generateWxAdData.Date,
  131. AgentRevenue: v.AgentRevenue,
  132. AgentRevenueRate: v.AgentRevenueRate,
  133. ExtraRevenue: v.ExtraRevenue,
  134. ExtraRevenueRate: v.ExtraRevenueRate,
  135. CreateAt: now.Format("2006-01-02 15:04:05"),
  136. UpdateAt: now.Format("2006-01-02 15:04:05"),
  137. })
  138. }
  139. generateWxAdDataWithAgentFlowDb := implement.NewGenerateWxAdDataWithAgentFlowDb(db.Db)
  140. _, err = generateWxAdDataWithAgentFlowDb.BatchAddGenerateWxAdDataWithAgentFlow(session, generateWxAdDataWithAgentFlows)
  141. if err != nil {
  142. _ = session.Rollback()
  143. return
  144. }
  145. //6、修改 original_wx_ad_data 记录中的 is_apply(是否已应用(0:未 1:已) )
  146. originalWxAdData.IsApply = 1
  147. _, err = originalWxAdDataDb.UpdateOriginalWxAdDataBySession(session, originalWxAdData, "is_apply")
  148. if err != nil {
  149. _ = session.Rollback()
  150. return
  151. }
  152. return session.Commit(), generateWxAdData
  153. }
  154. func ClacEcpm(req md.ClacEcpmReq) (err error, ecpm string) {
  155. //1、查找原始数据记录
  156. originalWxAdDataDb := implement.NewOriginalWxAdDataDb(db.Db)
  157. originalWxAdData, err := originalWxAdDataDb.GetOriginalWxAdData(req.GenerateDataId)
  158. if err != nil {
  159. return
  160. }
  161. if originalWxAdData == nil {
  162. err = errors.New("未查询到原始数据记录")
  163. return
  164. }
  165. //2、查询对应媒体分成策略
  166. mediumDivisionStrategyDb := implement.NewMediumDivisionStrategyDb(db.Db)
  167. mediumDivisionStrategy, err := mediumDivisionStrategyDb.GetOriginalWxAdDataByMediumId(originalWxAdData.MediumId)
  168. if err != nil {
  169. return
  170. }
  171. if mediumDivisionStrategy == nil {
  172. err = errors.New("未查询到对应代理的分成策略")
  173. return
  174. }
  175. //3、计算媒体、代理收益、协议总分成
  176. publisherIncome := originalWxAdData.PublisherIncome
  177. mediaRevenue := publisherIncome * mediumDivisionStrategy.MediaRevenueRate / 100 //媒体收益
  178. agentRevenue := publisherIncome * mediumDivisionStrategy.AgentRevenueRate / 100 //代理收益
  179. agreementSharingTotal := (mediaRevenue + agentRevenue) / (100 - mediumDivisionStrategy.AgreementSharingRate) //协议总分成(倒推)
  180. //4、倒退出当前ecpm值
  181. ecpm = utils.Float64ToStrPrec4(float64(agreementSharingTotal) / (float64(originalWxAdData.ExposureCount) / 1000))
  182. return
  183. }