ToutiaoCostVideoLogic.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. <?php
  2. namespace app\v1\logic\tool\advertCost;
  3. use app\adapter\ToutiaoAdapter;
  4. use support\think\Db;
  5. class ToutiaoCostVideoLogic extends BaseAdvertLogic
  6. {
  7. public int $mediaId = 1; // 媒体ID
  8. // 执行正文
  9. protected function initStart(): void
  10. {
  11. $advertiserList = $this->getAdvertiserMap($this->mediaId);
  12. // 循环执行
  13. foreach ($advertiserList as $account)
  14. {
  15. $accessToken = $account['access_token'] ?? "";
  16. if(!$accessToken) continue;
  17. // 获取消耗
  18. $dataList = (new ToutiaoAdapter)->getVideoCost($account['advertiser_id'], $accessToken, $this->date);
  19. // 数据加工,获取素材信息
  20. if($dataList){
  21. $videoMap = $this->getTtVideoNameMap($account['advertiser_id'], $accessToken, $dataList);
  22. // 整理数据入库
  23. $this->organizeDataList($account, $dataList, $videoMap);
  24. }
  25. }
  26. }
  27. protected function getTtVideoNameMap($advertiserId, $accessToken, $dataList): array
  28. {
  29. if(!$dataList) return $dataList;
  30. $videoMaterialIds = [];
  31. foreach ($dataList as $vv){
  32. $videoMaterialIds[] = $vv['dimensions']['material_id'];
  33. }
  34. // 判断是否超过100条,切割处理
  35. $videoIdList = array_chunk($videoMaterialIds, 100);
  36. $videoList = [];
  37. foreach ($videoIdList as $videoIds) {
  38. $videos = (new ToutiaoAdapter())->getVideo($advertiserId, $accessToken, $videoIds);
  39. $videoList = array_merge($videoList, $videos);
  40. }
  41. $videoData = [];
  42. if($videoList) {
  43. foreach ($videoList as $val){
  44. $videoData[$val['material_id']] = $val;
  45. }
  46. }
  47. return $videoData;
  48. }
  49. // 整理入库数据列表
  50. protected function organizeDataList($account, $dataList, $videoMap): void
  51. {
  52. if(!$dataList) return;
  53. $db = Db::connect('db_advert');
  54. // 返点率
  55. $fandianRate = ($account['son_fandian']>1) ? (1/$account['son_fandian']) : $account['son_fandian'];
  56. foreach ($dataList as $val) {
  57. $cost = $val['metrics']['stat_cost'];
  58. if($cost=='0.00') continue;
  59. $materialId = $val['dimensions']['material_id'];
  60. $materialName = $val['dimensions']['ad_platform_material_name'];
  61. $adId = $val['dimensions']['cdp_project_id'];
  62. $adName = $val['dimensions']['cdp_project_name'];
  63. $materialUrl = $videoMap[$materialId]['url'] ?? "";
  64. $materialImg = $videoMap[$materialId]['poster_url'] ?? "";
  65. // Todo 从素材名称中获取归属人
  66. $authorId = $this->getAuthorId($materialName);
  67. // Todo 从广告名称中拆分归因数据
  68. $siteInfo = $this->getSiteInfo($adName);
  69. if(!$siteInfo['game_id'] || empty($this->siteMap[$siteInfo['site_id']])){
  70. $trackUrl = $val['dimensions']['ad_platform_cdp_project_action_track_url'] ?? "";
  71. $siteInfo = $this->getSiteInfo($trackUrl);
  72. }
  73. if(!$siteInfo['game_id'] || empty($this->siteMap[$siteInfo['site_id']])) continue;
  74. $materialData = [
  75. 'ad_id' => $adId,
  76. 'game_id' => $siteInfo['game_id'],
  77. 'agent_id'=> $siteInfo['agent_id'],
  78. 'site_id' => $siteInfo['site_id'],
  79. 'media_id' => $this->siteMap[$siteInfo['site_id']]['media_id'] ?? 0,
  80. 'auth_id' => $this->siteMap[$siteInfo['site_id']]['auth_id'] ?? 0,
  81. 'material_name' => $materialName,
  82. 'material_url' => $materialUrl,
  83. 'material_img' => $materialImg,
  84. 'ori_money' => $cost,
  85. 'money' => $cost*$fandianRate,
  86. 'ad_show' => $val['metrics']['show_cnt'],
  87. 'click' => $val['metrics']['click_cnt'],
  88. 'total_play' => $val['metrics']['total_play'],
  89. 'valid_play' => $val['metrics']['valid_play'],
  90. 'download' => $val['metrics']['download_finish_cnt'],
  91. 'active' => $val['metrics']['active'],
  92. 'register' => $val['metrics']['active_register'],
  93. 'pay_count' => $val['metrics']['active_pay'],
  94. 'pay_amount' => $val['metrics']['stat_pay_amount'],
  95. 'author_id' => $authorId
  96. ];
  97. $where = [
  98. 'tdate' => $this->date,
  99. 'ad_id' => $adId,
  100. 'material_id' => $materialId,
  101. 'advertiser_id' => $account['advertiser_id'],
  102. ];
  103. $findId= $db->table($this->materialTable)->where($where)->value("id");
  104. if($findId) {
  105. $materialData['id'] = $findId;
  106. }
  107. // 保存数据
  108. $db->table($this->materialTable)->save(array_merge($materialData, $where));
  109. }
  110. }
  111. }