暂无描述

VideoPostOrderDataSync.php 4.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <?php
  2. namespace App\Console\Commands\Star;
  3. use App\Models\JuxingAdAccount;
  4. use App\Models\JxStarVideoOrderList;
  5. use App\Models\JxStarVideoTaskList;
  6. use App\Support\Log;
  7. use App\Support\RedisModel;
  8. use Illuminate\Console\Command;
  9. use kwaiSDK\JuXing;
  10. class VideoPostOrderDataSync extends Command
  11. {
  12. /**
  13. * The name and signature of the console command.
  14. *
  15. * @var string
  16. */
  17. protected $signature = 'Star:VideoPostOrderDataSync';
  18. /**
  19. * The console command description.
  20. *
  21. * @var string
  22. */
  23. protected $description = '查询星视频订单的投后数据';
  24. protected $runDays = 90;
  25. /**
  26. * Create a new command instance.
  27. *
  28. * @return void
  29. */
  30. public function __construct()
  31. {
  32. parent::__construct();
  33. }
  34. /**
  35. * Execute the console command.
  36. *
  37. * @return int
  38. */
  39. public function handle()
  40. {
  41. $this->info(date('H:i') . ' 开始执行');
  42. $this->start();
  43. $this->info(date('H:i') . ' 结束执行');
  44. return 0;
  45. }
  46. public function start()
  47. {
  48. $curTime = time();
  49. while (true) {
  50. if ((time() - $curTime) >= 60) break;
  51. $dataJson = RedisModel::rPop(JuxingAdAccount::JUXING_STAR_VIDEO_SYNC_ADVID_LIST);
  52. if (empty($dataJson)) {
  53. sleep(2);
  54. continue;
  55. }
  56. $data = json_decode($dataJson, true);
  57. if (!isset($data['advertiserId'], $data['timeRange'])) {
  58. # 输出错误日志
  59. Log::error('数据参数不合法', $data, 'Star:VideoPostOrderDataSync');
  60. continue;
  61. }
  62. $this->getPostOrderData($data);
  63. // 控频
  64. sleep(1);
  65. }
  66. }
  67. public function getPostOrderData($data)
  68. {
  69. $advertiserId = $data['advertiserId'];
  70. $timeRange = $data['timeRange'];
  71. $accessToken = JuxingAdAccount::getAccessToken($advertiserId);
  72. $juxing = new JuXing($accessToken);
  73. $rst = $juxing->investData()->taskList([
  74. 'advertiser_id' => $advertiserId,
  75. 'create_start_time' => $timeRange['st'],
  76. 'create_end_time' => $timeRange['en']
  77. ]);
  78. if (!isset($rst['code']) || ($rst['code'] != 0)) {
  79. # 输出错误日志并异常处理
  80. $msg = $rst['message'] ?? null;
  81. Log::error('请求接口错误:'.$msg, $data, 'Star:VideoPostOrderDataSync');
  82. return false;
  83. }
  84. $rstData = $rst['data']['details'] ?? [];
  85. if (empty($rstData)) {
  86. # 输出记录日志
  87. Log::info('请求返回任务数据为空', $data, 'Star:VideoPostOrderDataSync');
  88. return true;
  89. }
  90. foreach ($rstData as $datum) {
  91. $this->allotmentData($advertiserId, $datum);
  92. }
  93. return 0;
  94. }
  95. public function allotmentData($advertiserId, $datum)
  96. {
  97. # 提取订单数据
  98. $orderDetailResults = $datum['order_detail_results'] ?? [];
  99. unset($datum['order_detail_results']);
  100. # 插入任务入库队列
  101. $taskItem = [
  102. 'advertiser_id' => $advertiserId,
  103. 'data' => $datum
  104. ];
  105. RedisModel::lPush(JxStarVideoTaskList::JUXING_STAR_VIDEO_TASK_INDB_LIST, json_encode($taskItem));
  106. # 输出记录日志
  107. // Log::info('入库任务数据入队列成功', $taskItem, 'Star:VideoPostOrderDataSync');
  108. # 插入订单入库队列
  109. if (empty($orderDetailResults)) {
  110. # 输出记录日志
  111. Log::info('请求返回任务中订单数据为空', $datum, 'Star:VideoPostOrderDataSync');
  112. return true;
  113. }
  114. $taskId = $datum['task_id'] ?? null;
  115. foreach ($orderDetailResults as $orderDetail) {
  116. # 加上日志过滤规则
  117. $starReleaseTime = $orderDetail['star_release_time']
  118. ? date('Y-m-d', strtotime($orderDetail['star_release_time'])) : null;
  119. if (empty($starReleaseTime)) {
  120. Log::info('该订单没有发布时间', $orderDetail, 'Star:VideoPostOrderDataSync');
  121. continue;
  122. }
  123. if ($starReleaseTime < date('Y-m-d', strtotime("-{$this->runDays} day"))) {
  124. continue;
  125. }
  126. $orderItem = [
  127. 'advertiser_id' => $advertiserId,
  128. 'task_id' => $taskId,
  129. 'data' => $orderDetail
  130. ];
  131. RedisModel::lPush(JxStarVideoOrderList::JUXING_STAR_VIDEO_ORDER_INDB_LIST, json_encode($orderItem));
  132. # 输出记录日志
  133. // Log::info('入库订单数据入队列成功', $orderDetail, 'Star:VideoPostOrderDataSync');
  134. }
  135. return 0;
  136. }
  137. }