BaseAdvertLogic.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <?php
  2. namespace app\v1\logic\tool\advertCost;
  3. use app\v1\logic\advert\AgentSiteLogic;
  4. use GuzzleHttp\Client;
  5. use plugin\saiadmin\app\model\system\SystemUser;
  6. use support\think\Db;
  7. abstract class BaseAdvertLogic
  8. {
  9. // 媒体消耗(按天数据)
  10. protected string $dateTable = "media_cost";
  11. // 媒体消耗(小时数据)
  12. protected string $hourTable = "media_cost_hour";
  13. // 媒体消耗(素材数据)
  14. protected string $materialTable = "media_cost_material";
  15. protected string $date;
  16. protected array $advertiserIds=[];
  17. protected array $siteMap=[];
  18. protected int $apiId=0;
  19. private array $adminUserMap=[];
  20. public function run($params=[])
  21. {
  22. // 重跑用,传数组
  23. if(!empty($params['date'])){
  24. $sDate = is_array($params['date']) ? $params['date'][0] : $params['date'];
  25. $eDate = !empty($params['date'][1]) ? $params['date'][1] : $params['date'][0];
  26. // 检查日期格式是否正确
  27. if(!isValidDate($sDate) || !isValidDate($eDate)){
  28. return json_encode(["status"=>"error", "msg"=>"日期格式不正确"], 256);
  29. }
  30. }else{
  31. $sDate = date('Y-m-d');
  32. $eDate = date('Y-m-d');
  33. }
  34. // 重跑用,传数组
  35. if(!empty($params['advertiser_ids'])){
  36. $this->advertiserIds = $params['advertiser_ids'];
  37. }
  38. // 重跑用,传int
  39. if(!empty($params['api_id'])){
  40. $this->apiId = $params['api_id'];
  41. }
  42. $this->siteMap = (new AgentSiteLogic())->getSiteAuth();
  43. $this->adminUserMap = (new SystemUser())->where("nickname","<>", "")->column("nickname", "id");
  44. for ($date = $sDate; $date <= $eDate; $date = date('Y-m-d', strtotime($date . '+1 day'))){
  45. $this->date = $date;
  46. try {
  47. $this->initStart();
  48. }catch (\Exception $e){
  49. return json_encode(["status"=>"error", "msg"=>$e->getMessage()], 256);
  50. }
  51. }
  52. $this->reRun();
  53. return json_encode(["status"=>"success", "msg"=>""], 256);
  54. }
  55. // 重跑
  56. protected function reRun(): void
  57. {
  58. if (date('H') == 8 && date('i') < 20) {
  59. $this->date = date('Y-m-d', strtotime("-1 days"));
  60. $this->initStart();
  61. }
  62. }
  63. abstract protected function initStart();
  64. // Todo 从广告名称中拆分归因数据
  65. protected function getSiteInfo($adName): array
  66. {
  67. $match = [];
  68. preg_match("/([\d]*)_([\d]*)_([\d]*)/", $adName, $match);
  69. $siteInfo = [
  70. "game_id" => $match[1] ?? 0,
  71. "agent_id" => $match[2] ?? 0,
  72. "site_id" => $match[3] ?? 0,
  73. ];
  74. unset($match);
  75. return $siteInfo;
  76. }
  77. // Todo 从素材名称中获取归属人
  78. protected function getAuthorId($materialName): int|string
  79. {
  80. $auth_id = 0;
  81. foreach ($this->adminUserMap as $id => $name) {
  82. $name = mb_substr($name, -2); // 用姓名后两个字匹配,因为有的人素材填写喜欢不带姓
  83. if ($name && strstr($materialName, $name)) {
  84. $auth_id = $id;
  85. break;
  86. }
  87. }
  88. return $auth_id;
  89. }
  90. // 获取需要拉取消耗的媒体账户
  91. protected function getTtAccountList(): array
  92. {
  93. $table = "ad_jrtt_account_list";
  94. $where = [
  95. "status" => 1
  96. ];
  97. if($this->advertiserIds){
  98. $where['advertiser_id'] = $this->advertiserIds;
  99. }
  100. return Db::connect('db_advert')
  101. ->table($table)
  102. ->where($where)
  103. ->column("pmid, advertiser_id, advertiser_name, son_fandian");
  104. }
  105. protected function getTtTokenMap(): array
  106. {
  107. $table = "ad_jrtt_account";
  108. $where = [
  109. "status" => 1
  110. ];
  111. if($this->apiId){
  112. $where['id'] = $this->apiId;
  113. }
  114. return Db::connect('db_advert')->table($table)->where($where)->column("access_token", "id");
  115. }
  116. // 获取需要拉取消耗的媒体账户
  117. protected function getGdtAccountList(): array
  118. {
  119. $table = "ad_gdt_account_list";
  120. $where = [
  121. "status" => 1
  122. ];
  123. if($this->advertiserIds){
  124. $where['advertiser_id'] = $this->advertiserIds;
  125. }
  126. return Db::connect('db_advert')
  127. ->table($table)
  128. ->where($where)
  129. ->column("pmid, advertiser_id, advertiser_name, son_fandian");
  130. }
  131. protected function getGdtTokenMap(): array
  132. {
  133. $table = "ad_gdt_account";
  134. $where = [
  135. "status" => 1
  136. ];
  137. if($this->apiId){
  138. $where['id'] = $this->apiId;
  139. }
  140. return Db::connect('db_advert')->table($table)->where($where)->column("access_token", "id");
  141. }
  142. }