TtCostVideoLogic.php 4.9 KB

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