作者 周海龙

合并分支 'zhl' 到 'master'

同步项目和路由



查看合并请求 !1133
  1 +<?php
  2 +/**
  3 + * Created by PhpStorm.
  4 + * User: zhl
  5 + * Date: 2025/2/17
  6 + * Time: 11:24
  7 + */
  8 +namespace App\Console\Commands\Inquiry;
  9 +
  10 +use App\Models\Channel\Channel;
  11 +use App\Models\Domain\DomainInfo;
  12 +use App\Models\Inquiry\InquiryProject;
  13 +use App\Models\Inquiry\InquiryProjectRoute;
  14 +use App\Models\Product\Category;
  15 +use App\Models\Product\Product;
  16 +use App\Models\Project\OnlineCheck;
  17 +use App\Models\Project\Project;
  18 +use App\Services\ProjectServer;
  19 +use Illuminate\Console\Command;
  20 +use Illuminate\Support\Facades\DB;
  21 +use Illuminate\Support\Facades\Log;
  22 +
  23 +/**
  24 + * Class SyncInquiryProject
  25 + * @package App\Console\Commands\Inquiry
  26 + */
  27 +class SyncInquiryProject extends Command
  28 +{
  29 + /**
  30 + * The name and signature of the console command.
  31 + *
  32 + * @var string
  33 + */
  34 + protected $signature = 'sync_inquiry_project';
  35 +
  36 + /**
  37 + * The console command description.
  38 + *
  39 + * @var string
  40 + */
  41 + protected $description = '同步询盘信息:项目以及对应路由,';
  42 +
  43 + /**
  44 + * Create a new command instance.
  45 + *
  46 + * @return void
  47 + */
  48 + public function __construct()
  49 + {
  50 + parent::__construct();
  51 + }
  52 +
  53 + /**
  54 + * 同步优化项目及路由
  55 + * TODO 同步v4 v5 v6项目以及路由, 删除过期项目及路由
  56 + * @return bool
  57 + */
  58 + public function handle()
  59 + {
  60 + $this->syncGloV5();
  61 + $this->syncGloV6();
  62 + $this->deleteExpire();
  63 + return true;
  64 + }
  65 +
  66 + /**
  67 + * 同步v4 、 v5项目
  68 + * @return bool
  69 + */
  70 + public function syncGloV5()
  71 + {
  72 + $result = http_get('https://www.quanqiusou.cn/extend_api/webs/globalso_v5_tg.php');
  73 + $channel = Channel::pluck('contact_mobile', 'id')->toArray();
  74 + foreach ($result as $key=>$val)
  75 + {
  76 + // 记录渠道商, 如果渠道有问题, 记录日志, 跳过当前项目, 处理数据后, 第二天再重新同步
  77 + $channel_flag = false;
  78 + $channel_tmp = [];
  79 + foreach ($val['agent'] as $v) {
  80 + $channel_id = array_search($v, $channel);
  81 + if (empty($channel_id)) {
  82 + $channel_flag = true;
  83 + break;
  84 + }
  85 + array_push($channel_tmp, $channel_id);
  86 + }
  87 +
  88 + if ($channel_flag || empty($channel_tmp)) {
  89 + $this->log('ERROR 代理商找不到不记录当前项目, 项目ID:' . $val['postid']);
  90 + continue;
  91 + }
  92 +
  93 + // 保存项目 以及路由
  94 + $project = InquiryProject::saveProject($val['v'], $val['postid'], $val['company'], implode(',', $channel_tmp), $val['main_url'], $val['is_split'], $val['test_url']);
  95 + $route_domain = $val['is_split'] && $val['test_url'] ? $val['test_url'] : $val['main_url'];
  96 + $this->syncGloV5Route($project->id, $route_domain);
  97 + }
  98 + return true;
  99 + }
  100 +
  101 + /**
  102 + * 同步v4 v5项目路由
  103 + * @param $project_id
  104 + * @param $route_domain
  105 + * @return bool
  106 + */
  107 + public function syncGloV5Route($project_id, $route_domain)
  108 + {
  109 + $result = http_get($route_domain . 'k_u_api.php');
  110 + foreach ($result as $key=>$val) {
  111 + try {
  112 + $tmp = explode('|', $val);
  113 + $url_tmp = parse_url($tmp[0]);
  114 + $route = trim($url_tmp['path'], '/');
  115 + $title = str_replace('+', ' ', $tmp[1]);
  116 + InquiryProjectRoute::saveProjectRoute($project_id, $title, $route);
  117 + } catch (\Exception $e) {
  118 + $this->log('syncGloV5Route 解析路径:' . $val . ', 错误信息:' . $e->getMessage());
  119 + }
  120 + }
  121 + return true;
  122 + }
  123 +
  124 + /**
  125 + * 同步v6项目
  126 + * @return bool
  127 + */
  128 + public function syncGloV6()
  129 + {
  130 + // 获取优化中台项目
  131 + $project = Project::leftJoin('gl_project_online_check', 'gl_project.id', '=', 'gl_project_online_check.project_id')
  132 + ->where('gl_project.type', Project::TYPE_TWO)
  133 + ->where('gl_project.extend_type', '!=', 5)
  134 + ->where(function ($query) {
  135 + $query->orwhere('gl_project_online_check.qa_status', OnlineCheck::STATUS_ONLINE_TRUE)
  136 + ->orwhere('gl_project.is_upgrade', Project::IS_UPGRADE_TRUE);
  137 + })
  138 + ->limit(5)
  139 + ->get(['gl_project.id', 'gl_project.title', 'gl_project.level', 'gl_project.channel']);
  140 + // 获取所有项目域名
  141 + $domains = DomainInfo::whereIn('project_id', $project->pluck('id')->toArray())->pluck('domain', 'project_id')->toArray();
  142 + foreach ($project as $key=>$val) {
  143 + // 过滤暂停优化项目, 映射类型2, model没有定义常量
  144 + if (in_array(2, $val->level))
  145 + continue;
  146 + $project = InquiryProject::saveProject(InquiryProject::VERSION_SIX, $val->id, $val->title, $val->channel['channel_id'], $domains[$val->id]);
  147 + $this->syncGloV6Route($project->id, $val->id);
  148 + }
  149 + return true;
  150 + }
  151 +
  152 + /**
  153 + * 同步v6项目路由
  154 + * @param $project_id
  155 + * @param $origin_project_id
  156 + * @return bool
  157 + */
  158 + public function syncGloV6Route($project_id, $origin_project_id)
  159 + {
  160 + ProjectServer::useProject($origin_project_id);
  161 + // TODO 产品分类标题、路由, 产品标题、路由, 同步到路由表
  162 + $category = Category::where('status', Category::STATUS_ACTIVE)->get(['title', 'route']);
  163 + foreach ($category as $key=>$val) {
  164 + InquiryProjectRoute::saveProjectRoute($project_id, $val->title, $val->route);
  165 + }
  166 +
  167 + // 产品数量会比较多, 所以使用分页 同步数据
  168 + $id = 0;
  169 + while (true) {
  170 + $product = Product::where('status', Product::STATUS_ON)->where('id', '>', $id)->orderBy('id', 'asc')->limit(1000)->get(['id', 'title', 'route']);
  171 + if ($product->isEmpty())
  172 + break;
  173 +
  174 + foreach ($product as $key=>$val) {
  175 + $id = $val->id;
  176 + InquiryProjectRoute::saveProjectRoute($project_id, $val->title, $val->route);
  177 + }
  178 + }
  179 +
  180 + DB::disconnect('custom_mysql');
  181 + return true;
  182 + }
  183 +
  184 + /**
  185 + * 删除过期数据, 非当日更新数据, 都删除, 误删第二天再重新同步更新
  186 + * @return bool
  187 + */
  188 + public function deleteExpire()
  189 + {
  190 + $date = intval(date('Ymd'));
  191 + $project_num = InquiryProject::where('date', '<', $date)->delete();
  192 + $project_route_num = InquiryProjectRoute::where('date', '<', $date)->delete();
  193 + $this->log('删除过期项目数量:' . $project_num . ', 删除过期路由数量:' . $project_route_num);
  194 + return true;
  195 + }
  196 +
  197 + /**
  198 + * 输出日志到特定的文件内, 这个文件需要定时排除内容
  199 + * @param $message
  200 + * @return bool
  201 + */
  202 + public function log($message)
  203 + {
  204 + $message = date('Y-m-d H:i:s') . ' ' . $message . PHP_EOL;
  205 + file_put_contents(storage_path('logs/zhl/output') . date('Y-m-d') . '.log', $message, FILE_APPEND);
  206 + return true;
  207 + }
  208 +}
  1 +<?php
  2 +/**
  3 + * Created by PhpStorm.
  4 + * User: zhl
  5 + * Date: 2025/2/17
  6 + * Time: 11:49
  7 + */
  8 +namespace App\Models\Inquiry;
  9 +
  10 +use App\Models\Base;
  11 +
  12 +/**
  13 + * Class InquiryProject
  14 + * @package App\Models\Inquiry
  15 + */
  16 +class InquiryProject extends Base
  17 +{
  18 + /**
  19 + * @var string 数据表
  20 + */
  21 + protected $table = 'gl_inquiry_project';
  22 +
  23 + // 对应系统版本号
  24 + const VERSION_FOUR = 4;
  25 + const VERSION_FIVE = 5;
  26 + const VERSION_SIX = 6;
  27 +
  28 + /**
  29 + * 保存项目信息
  30 + * @param $version
  31 + * @param $primary_id
  32 + * @param $project
  33 + * @param $channel
  34 + * @param $domain
  35 + * @param int $is_split
  36 + * @param string $test_domain
  37 + * @return InquiryProject
  38 + */
  39 + public static function saveProject($version, $primary_id, $project, $channel, $domain, $is_split = 0, $test_domain = '')
  40 + {
  41 + $date = date('Ymd');
  42 + $log = self::where(compact('version', 'primary_id'))->first();
  43 + if ($log) {
  44 + $log->date = $date;
  45 + $log->save();
  46 + return $log;
  47 + }
  48 + $self = new self();
  49 + $self->version = $version;
  50 + $self->primary_id = $primary_id;
  51 + $self->project = $project;
  52 + $self->channel = $channel;
  53 + $self->domain = $domain;
  54 + $self->is_split = $is_split;
  55 + $self->test_domain = $test_domain;
  56 + $self->date = $date;
  57 + $self->save();
  58 + return $self;
  59 + }
  60 +}
  1 +<?php
  2 +/**
  3 + * Created by PhpStorm.
  4 + * User: zhl
  5 + * Date: 2025/2/17
  6 + * Time: 15:04
  7 + */
  8 +namespace App\Models\Inquiry;
  9 +
  10 +use App\Models\Base;
  11 +
  12 +/**
  13 + * Class InquiryProjectRoute
  14 + * @package App\Models\Inquiry
  15 + */
  16 +class InquiryProjectRoute extends Base
  17 +{
  18 + /**
  19 + * @var string 数据表
  20 + */
  21 + protected $table = 'gl_inquiry_project_route';
  22 +
  23 + /**
  24 + * 保存路由信息
  25 + * @param int $project_id gl_inquiry_project 表ID
  26 + * @param $title
  27 + * @param $route
  28 + * @return InquiryProjectRoute
  29 + */
  30 + public static function saveProjectRoute($project_id, $title, $route)
  31 + {
  32 + $date = date('Ymd');
  33 + $log = self::where(compact('project_id', 'title'))->first();
  34 + if ($log) {
  35 + $log->date = $date;
  36 + $log->save();
  37 + return $log;
  38 + }
  39 +
  40 + $self = new self();
  41 + $self->project_id = $project_id;
  42 + $self->title = $title;
  43 + $self->route = $route;
  44 + $self->date = $date;
  45 + $self->save();
  46 + return $self;
  47 + }
  48 +}