SyncInquiryProject.php
9.0 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
<?php
/**
* Created by PhpStorm.
* User: zhl
* Date: 2025/2/17
* Time: 11:24
*/
namespace App\Console\Commands\Inquiry;
use App\Helper\FormGlobalsoApi;
use App\Models\Channel\Channel;
use App\Models\Domain\DomainInfo;
use App\Models\Inquiry\InquiryFormData;
use App\Models\Inquiry\InquiryProject;
use App\Models\Inquiry\InquiryProjectRoute;
use App\Models\Product\Category;
use App\Models\Product\Product;
use App\Models\Project\OnlineCheck;
use App\Models\Project\Project;
use App\Services\ProjectServer;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;
/**
* Class SyncInquiryProject
* @package App\Console\Commands\Inquiry
*/
class SyncInquiryProject extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'sync_inquiry_project';
/**
* The console command description.
*
* @var string
*/
protected $description = '同步询盘信息:项目';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* 同步优化项目及路由
* 同步v4 v5 v6项目以及路由, 删除过期项目及路由
* @return bool
*/
public function handle()
{
//截断路由表
InquiryProjectRoute::truncate();
$this->output('开始同步v5');
$this->syncGloV5();
$this->output('开始同步v6');
$this->syncGloV6();
return true;
}
/**
* 同步v4 、 v5项目
* @return bool
*/
public function syncGloV5()
{
$date = intval(date('Ymd'));
$last_week_time = date('Y-m-d H:i:s', strtotime('-1 week'));
$result = http_get('https://www.quanqiusou.cn/extend_api/webs/globalso_v5_tg.php');
$channel = Channel::pluck('contact_mobile', 'id')->toArray();
$form_api = new FormGlobalsoApi();
foreach ($result as $key => $val) {
$this->output('同步项目:' . $val['postid'] . ' - ' . $val['company']);
// 记录渠道商, 如果渠道有问题, 记录日志, 跳过当前项目, 处理数据后, 第二天再重新同步
$channel_tmp = [];
foreach ($val['agent'] as $v) {
$channel_id = array_search($v, $channel);
// 代理信息 只要找到一个, 就需要继续记录
if (empty($channel_id)) {
$this->log('ERROR 代理商找不到不记录当前项目, 代理商手机号码:' . $v);
continue;
}
array_push($channel_tmp, $channel_id);
}
if (empty($channel_tmp)) {
$this->log('ERROR 代理商找不到不记录当前项目, 项目ID:' . $val['postid']);
continue;
}
//判断项目7天之内是否有询盘
$recent_inquiry = 0;
$inquiry_list = $form_api->getInquiryList($val['main_url']);
$last_inquiry_time = $inquiry_list['data']['data'][0]['submit_time'] ?? '';
if ($last_inquiry_time > $last_week_time) {
$recent_inquiry = 1;
}
// 保存项目 以及 获取路由信息
$project = InquiryProject::saveProject($date, $val['v'], $val['postid'], $val['company'], implode(',', $channel_tmp), $val['main_url'], $recent_inquiry, $val['notice'], $val['is_split'], $val['test_url']);
$route_domain = $val['is_split'] && $val['test_url'] ? $val['test_url'] : $val['main_url'];
try {
$result = http_get($route_domain . 'k_u_api.php');
if (empty($result)) {
$this->log('syncGloV5Route 未获取到路由信息:' . $project->id . ', 路由获取地址:' . $route_domain . 'k_u_api.php');
$this->deleteExpire([$project->id]);
continue;
}
file_put_contents(storage_path('logs/sync_inquiry_project_route/' . $project->id . '.json'), json_encode($result));
$this->pushTask($project->id);
} catch (\Exception $e) {
$this->log('syncGloV5Route 未获取到路由信息:' . $project->id . ', 路由获取地址:' . $route_domain . 'k_u_api.php' . ', 错误信息:' . $e->getMessage());
$this->output('syncGloV5Route 未获取到路由信息:' . $project->id . ', 路由获取地址:' . $route_domain . 'k_u_api.php' . ', 错误信息:' . $e->getMessage());
$this->deleteExpire([$project->id]);
continue;
}
}
$ids = InquiryProject::where('date', '<', $date)->where('version', '<', InquiryProject::VERSION_SIX)->pluck('id')->toArray();
$this->deleteExpire($ids);
return true;
}
/**
* 同步v6项目
* @return bool
*/
public function syncGloV6()
{
$date = intval(date('Ymd'));
$last_week_time = date('Y-m-d H:i:s', strtotime('-1 week'));
// 获取优化中台项目
$project = Project::leftJoin('gl_project_online_check', 'gl_project.id', '=', 'gl_project_online_check.project_id')
->leftJoin('gl_project_deploy_optimize', 'gl_project.id', '=', 'gl_project_deploy_optimize.project_id')
->where('gl_project.type', Project::TYPE_TWO)
->where('gl_project.extend_type', '!=', 5)
->where('gl_project.delete_status', Project::IS_DEL_FALSE)
->where(function ($query) {
$query->orwhere('gl_project_online_check.qa_status', OnlineCheck::STATUS_ONLINE_TRUE)
->orwhere('gl_project.is_upgrade', Project::IS_UPGRADE_TRUE);
})
->get(['gl_project.id', 'gl_project.title', 'gl_project.level', 'gl_project.channel', 'gl_project_deploy_optimize.inquiry_prompt']);
// 获取所有项目域名
$domains = DomainInfo::whereIn('project_id', $project->pluck('id')->toArray())->pluck('domain', 'project_id')->toArray();
$form_api = new FormGlobalsoApi();
foreach ($project as $key => $val) {
$this->output('同步项目:' . $val->id . ' - ' . $val->title);
// 过滤暂停优化项目, 映射类型2, model没有定义常量
if (in_array(2, $val->level))
continue;
$domain = $domains[$val->id] ?? '';
if (!$domain) {
continue;
}
//判断项目7天之内是否有询盘
$recent_inquiry = 0;
$inquiry_list = $form_api->getInquiryList('https://' . $domain . '/');
$last_inquiry_time = $inquiry_list['data']['data'][0]['submit_time'] ?? '';
if ($last_inquiry_time > $last_week_time) {
$recent_inquiry = 1;
} else {
//自定义询盘也加入判断
ProjectServer::useProject($val->id);
$last_inquiry_time = InquiryFormData::orderBy('submit_at', 'desc')->value('submit_at');
if ($last_inquiry_time > $last_week_time) {
$recent_inquiry = 1;
}
DB::disconnect('custom_mysql');
}
$project = InquiryProject::saveProject($date, InquiryProject::VERSION_SIX, $val->id, $val->title, $val->channel['channel_id'], 'https://' . $domain . '/', $recent_inquiry, $val->inquiry_prompt ?? '');
$this->pushTask($project->id);
}
$ids = InquiryProject::where('date', '<', $date)->where('version', '=', InquiryProject::VERSION_SIX)->pluck('id')->toArray();
$this->deleteExpire($ids);
return true;
}
/**
* 删除过期数据, 非当日更新数据, 都删除, 误删第二天再重新同步更新
* @param $ids
* @return bool
*/
public function deleteExpire($ids)
{
if (empty($ids))
return true;
$project_num = InquiryProject::whereIn('id', $ids)->delete();
// $project_route_num = InquiryProjectRoute::whereIn('project_id', $ids)->delete();
// $this->log('删除过期项目数量:' . $project_num . ', 删除过期项目路由数量:' . $project_route_num);
$this->log('删除过期项目数量:' . $project_num);
return true;
}
/**
* 往任务队列中生产数据
* @param $id
* @return bool
*/
public function pushTask($id)
{
Redis::lPush('sync_inquiry_project_route_task', $id);
return true;
}
/**
* 输出日志到特定的文件内, 这个文件需要定时排除内容
* @param $message
* @return bool
*/
public function log($message)
{
$message = date('Y-m-d H:i:s') . ' ' . $message . PHP_EOL;
file_put_contents(storage_path('logs/zhl/output') . date('Y-m-d') . '.log', $message, FILE_APPEND);
return true;
}
public function output($message)
{
echo date('Y-m-d H:i:s') . ' | ' . $message . PHP_EOL;
}
}