BaseAdvertLogic.php 4.1 KB

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