GdtCostVideoLogic.php 4.3 KB

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