SyncSubmitTask.php 3.0 KB
<?php

namespace App\Console\Commands\Sync;


use App\Exceptions\InquiryFilterException;
use App\Models\Project\Project;
use App\Models\SyncSubmitTask\SyncSubmitTask as SyncSubmitTaskModel;
use App\Services\SyncSubmitTaskService;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redis;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Str;

/**
 *
 * Class SyncSubmitTask
 * @package App\Console\Commands
 * @author zbj
 * @date 2023/11/28
 */
class SyncSubmitTask extends Command
{

    protected $signature = 'sync_submit_task';
    protected $description = '询盘、访问异步任务';

    public function handle()
    {
        while (true) {
            $task_id = Redis::rpop('sync_submit_task');
            if(!$task_id){
                sleep(1);
                continue;
            }

            $this->output('任务' . $task_id . '开始');

            $time = time();


            DB::enableQueryLog(); //启用查询日志
            //清除之前的查询日志
            DB::flushQueryLog();

            $task_info = SyncSubmitTaskModel::find($task_id);
            if (empty($task_info) || $task_info->status !=3) {
                $this->output('任务不存在或者已执行');
                continue;
            }
            try {
                $project = Project::getProjectByDomain($task_info['data']['domain'] ?? '');
                if(!$project){
                    throw new \Exception('项目不存在');
                }
                $task_info->project_id = $project->id;
                SyncSubmitTaskService::handler($task_info);
                $task_info->status = 1;
                $task_info->save();

                $this->output('任务完成');
            } catch (InquiryFilterException $e) {
                $task_info->status = 1;
                $task_info->is_filtered = 1;
                $task_info->remark = $e->getMessage();
                $task_info->save();

                $this->output('任务完成');
            } catch (\Exception $e) {
                $task_info->retry = $task_info->retry + 1;
                if ($task_info->retry >= 3) {
                    $task_info->status = 2;
                    $task_info->remark = Str::substr($e->getMessage(), 0, 200);
                } else {
                    Redis::lpush('sync_submit_task', $task_id);
                }
                $task_info->save();

                $this->output('任务失败:' . $e->getMessage());
            }

            $use_time = time() - $time;
            if($use_time > 1){
                //数据库查询
                $this->output('任务用时:' .$use_time . ' | ' . json_encode(DB::getQueryLog(),JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));
            }
            //清除之前的查询日志
            DB::flushQueryLog();
        }
    }

    /**
     * 输出处理日志
     */
    public function output($message): bool
    {
        echo date('Y-m-d H:i:s') . ' | ' . $message . PHP_EOL;
        return true;
    }
}