合并分支 'zhl' 到 'master'
同步项目和路由 查看合并请求 !1133
正在显示
3 个修改的文件
包含
316 行增加
和
0 行删除
| 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 | +} |
app/Models/Inquiry/InquiryProject.php
0 → 100644
| 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 | +} |
app/Models/Inquiry/InquiryProjectRoute.php
0 → 100644
| 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 | +} |
-
请 注册 或 登录 后发表评论