作者 zhl

视频任务定时任务

  1 +<?php
  2 +/**
  3 + * Created by PhpStorm.
  4 + * User: zhl
  5 + * Date: 2024/02/26
  6 + * Time: 10:13
  7 + */
  8 +namespace App\Console\Commands;
  9 +
  10 +use App\Models\Product\Keyword;
  11 +use App\Services\ProjectServer;
  12 +use Illuminate\Console\Command;
  13 +use Illuminate\Support\Facades\Http;
  14 +use Illuminate\Support\Facades\Log;
  15 +
  16 +class VideoTask extends Command
  17 +{
  18 + /**
  19 + * The name and signature of the console command.
  20 + *
  21 + * @var string
  22 + */
  23 + protected $signature = 'VideoTask';
  24 +
  25 + /**
  26 + * The console command description.
  27 + *
  28 + * @var string
  29 + */
  30 + protected $description = '视频推广任务';
  31 +
  32 + /**
  33 + * Create a new command instance.
  34 + *
  35 + * @return void
  36 + */
  37 + public function __construct()
  38 + {
  39 + parent::__construct();
  40 + }
  41 +
  42 + /**
  43 + * @var int 最大子任务
  44 + */
  45 + public $max_sub_task = 800;
  46 +
  47 + /**
  48 + * @return bool
  49 + */
  50 + public function handle()
  51 + {
  52 + Log::info('开始视频推广任务');
  53 + $this->createSubTask();
  54 + $this->sendSubTask();
  55 + Log::info('结束视频推广任务');
  56 + return true;
  57 + }
  58 +
  59 + /**
  60 + * 创建子任务
  61 + * TODO 获取需要生成子任务的项目,获取项目中未生成视频的关键词,通过关键词生成初始化子任务
  62 + * @return bool
  63 + */
  64 + public function createSubTask()
  65 + {
  66 + $sub_task_num = $this->max_sub_task;
  67 + while (true) {
  68 + if ($sub_task_num <= 0)
  69 + break;
  70 +
  71 + $task_project = Model::where(['status' => Model::STATUS_OPEN])->orderBy('sort', 'desc')->first();
  72 + if (empty($task_project))
  73 + break;
  74 +
  75 + $project = ProjectServer::useProject($task_project->project_id);
  76 + $keyword = $this->getProjectKeyword();
  77 + // 已经没有需要生成视频的关键词
  78 + if (FALSE == $keyword->isEmpty()) {
  79 + $task_project->status = Model::STATUS_CLOSE;
  80 + $task_project->save();
  81 + continue;
  82 + }
  83 +
  84 + foreach ($keyword as $val) {
  85 + $log = TaskSub::where(['project_id' => $task_project->project_id, 'keyword_id' => $val->id])->first();
  86 + if ($log)
  87 + continue;
  88 +
  89 + $array = [
  90 + 'project_id' => $task_project->project_id,
  91 + 'keyword_id' => $val->id,
  92 + 'keyword' => $val->title,
  93 + 'data' => json_encode(['url' => '', 'description' => '', 'images' => [], 'keywords' => []]),
  94 + 'status' => TaskSub::STATUS_INIT,
  95 + 'updated_at' => date('Y-m-d H:i:s'),
  96 + 'created_at' => date('Y-m-d H:i:s'),
  97 + ];
  98 + TaskSub::insert($array);
  99 + $sub_task_num--;
  100 + }
  101 + $task_project->status = Model::STATUS_CLOSE;
  102 + $task_project->save();
  103 + }
  104 + return true;
  105 + }
  106 +
  107 + /**
  108 + * 发送子任务
  109 + * @return bool
  110 + */
  111 + public function sendSubTask()
  112 + {
  113 + $subTask = TaskSub::where(['status' => TaskSub::STATUS_INIT])->orderBy('id', 'asc')->limit($this->max_sub_task)->get();
  114 + if ($subTask->isEmpty())
  115 + return true;
  116 + foreach ($subTask as $val) {
  117 + $task_id = 'v6-' . uniqid();
  118 + $data = [
  119 + 'project_data' => [
  120 + 'tag_url' => '',
  121 + 'title' => '',
  122 + 'keywords' => [],
  123 + 'description' => '',
  124 + 'images' => ''
  125 + ],
  126 + 'task_id' => $task_id,
  127 + 'callback_url' => '',
  128 + ];
  129 + $result = Http::post('http://216.250.255.116:7866/create_task', $data);
  130 +
  131 + $val->task_id = $task_id;
  132 + $val->status = TaskSub::STATUS_RUNING;
  133 + $val->request_result = $result;
  134 + $val->save();
  135 + }
  136 + return true;
  137 + }
  138 +
  139 + /**
  140 + * 获取未生成页面的关键词
  141 + * @return mixed
  142 + */
  143 + public function getProjectKeyword()
  144 + {
  145 + $keyword = Keyword::where('video', null)->whereNotNull('keyword_content')->inRandomOrder()->take(100)->get();
  146 + return $keyword;
  147 + }
  148 +
  149 + /**
  150 + * 获取需要处理的任务
  151 + * @return int
  152 + */
  153 + public function getTaskProject()
  154 + {
  155 +// $task_project = Model::where(['status' => Model::STATUS_OPEN])->orderBy('sort', 'desc')->first();
  156 + $project_id = 110;
  157 + return $project_id;
  158 + }
  159 +}