作者 lyh

Merge branch 'master' of http://47.244.231.31:8099/zhl/globalso-v6 into master-server

... ... @@ -179,9 +179,9 @@ class RelayInquiry extends Command
foreach ($inquiry as $key=>$val) {
$this->output('询盘ID:' . $val->id);
//询盘时间超过2小时 就不处理了
if(time() - strtotime($val->inquiry_date) > 7200){
if(time() - strtotime($val->inquiry_date) > 259200){
$val->status = ReInquiryForm::STATUS_FORGO;
$val->remark = '超时2小时未处理!';
$val->remark = '超时72小时未处理!';
$val->save();
continue;
}
... ... @@ -355,7 +355,8 @@ class RelayInquiry extends Command
// 推送消息 消息内容小于10个字符, 使用内置询盘内容
$message = $form->message;
$message_id = 0;
if (strlen($message) < 10) {
// 通过字符数量区分, 改成完全获取内置询盘内容
if (true) {
$use_ids = ReInquiryDetail::where(['re_website' => $domain])->where('status', '<>', ReInquiryDetail::STATUS_FAIL)->pluck('text_id')->toArray();
$text = ReInquiryText::whereNotIn('id', $use_ids)->where('status', ReInquiryText::STATUS_USABLE)->inRandomOrder()->first();
$message = $text->content;
... ...
... ... @@ -2,15 +2,10 @@
namespace App\Console\Commands\RankData;
use App\Helper\QuanqiusouApi;
use App\Http\Logic\Bside\RankData\RankDataLogic;
use App\Models\Domain\DomainInfo;
use App\Models\RankData\RankDataLog as RankDataLogModel;
use App\Models\Project\DeployOptimize;
use App\Models\Project\Project;
use App\Models\RankData\RankData as GoogleRankModel;
use App\Utils\LogUtils;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;
... ... @@ -35,7 +30,7 @@ class RankData extends BaseCommands
*
* @var string
*/
protected $description = '谷歌排名数据';
protected $description = '分发任务';
/**
* @author zbj
... ... @@ -45,67 +40,31 @@ class RankData extends BaseCommands
{
try {
Log::channel('rank_data')->info('开始-排名数据');
//所有项目 今日是否达标 重置
//有失败会重跑任务,导致达标又被重置 加缓存一天只重置一次
if (!Cache::get('clear_remain_today_' . date('Y-m-d'))) {
Project::where('is_remain_today', 1)->update(['is_remain_today' => 0]);
Cache::set('clear_remain_today_' . date('Y-m-d'), 1, 24 * 3600);
}
$error = 0;
$api = new QuanqiusouApi();
//有排名api编号的项目
$list = DeployOptimize::where('api_no', '>', 0)->select('api_no', 'project_id')->orderBy('project_id', 'asc')->get();
Log::channel('rank_data')->info('开始-排名数据-' . count($list));
//当日所有站点谷歌收录数据
$site_res = $api->getSiteRes();
if (!$site_res) {
Log::channel('rank_data')->error('谷歌收录数据获取失败');
foreach ($list as $item){
RankDataLogModel::addTask($item['project_id'], $item['api_no']);
}
foreach ($list as $item) {
Log::channel('rank_data')->info('项目开始:ID' . $item['project_id'] .' - '. $item['api_no']) . '';
try {
(new RankDataLogic())->syncRankData($item['api_no'], $site_res);
} catch (\Exception $e) {
Log::channel('rank_data')->error('RankData:失败 ' . $item['api_no'] . $e->getMessage());
$error++;
continue;
//小语种
$api = new QuanqiusouApi();
$lang_list = $api->getLangList();
foreach ($list as $item){
$langs = $lang_list[$item['api_no']] ?? [];
foreach ($langs as $lang){
RankDataLogModel::addTask($item['project_id'], $item['api_no'], $lang);
}
}
return !$error;
} catch (\Exception|\Throwable $e) {
Log::channel('rank_data')->error('排名数据任务失败 ' . $e->getMessage());
throw new \Exception($e->getMessage());
}
return true;
}
/**
* 同步项目api_no
* @author zbj
* @date 2023/10/16
*/
public function SyncApiNo(){
$deploy_optimizes = DeployOptimize::leftJoin('gl_project', 'gl_project.id', '=', 'gl_project_deploy_optimize.project_id')
->whereIn('gl_project.type', [Project::TYPE_TWO,Project::TYPE_THREE])->where('gl_project_deploy_optimize.api_no', 0)
->where('gl_project_deploy_optimize.domain', '>', 0)
->get();
if(!$deploy_optimizes){
return true;
}
$api = new QuanqiusouApi();
$ai_nos = $api->getWebApiNo();
if($ai_nos){
foreach ($deploy_optimizes as $deploy_optimize){
$domain = DomainInfo::where('id', $deploy_optimize['domain'])->value('domain');
if(!$domain){
continue;
}
$api_no = array_search($domain, $ai_nos);
if($api_no){
$deploy_optimize->api_no = $api_no;
$deploy_optimize->save();
}
}
}
}
}
... ...
<?php
namespace App\Console\Commands\RankData;
use App\Helper\Arr;
use App\Helper\QuanqiusouApi;
use App\Http\Logic\Bside\BaseLogic;
use App\Http\Logic\Bside\RankData\RankDataLogic;
use App\Models\RankData\RankDataLog as RankDataLogModel;
use App\Models\Project\DeployOptimize;
use App\Models\Project\Project;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;
/**
* Class GoogleRank
* @package App\Console\Commands
* @author zbj
* @date 2023/5/6
*/
class RankDataLog extends BaseCommands
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'rank_data_log';
/**
* The console command description.
* The console command description.
*
* @var string
*/
protected $description = '谷歌排名数据';
/**
* @author zbj
* @date 2023/5/6
*/
public function do()
{
while (true) {
$log_id = Redis::rpop('rank_data_task');
echo $log_id . PHP_EOL;
if (!$log_id) {
sleep(10);
continue;
}
$log = RankDataLogModel::where('id', $log_id)->where('status', 0)->first();
if(!$log){
continue;
}
try {
$this->output('项目开始:ID'.$log->project_id . ',APINO' . $log->api_no);
$project = Project::find($log->project_id);
if (!$project) {
$this->output('关联的项目不存在:ID'.$log->project_id . ',APINO' . $log->api_no);
$log->status = 9;
$log->save();
continue;
}
//接口获取数据
$api = new QuanqiusouApi();
$res = $api->getGoogleRank($log->project_id, $log->api_no, $log->lang);
if (!$res) {
$this->output('接口数据获取失败:ID'.$log->project_id . ',APINO' . $log->api_no);
$log->status = 9;
$log->save();
continue;
}
$log->data = Arr::s2a($res);
//保存数据
$this->output('保存排名数据:ID'.$log->project_id . ',APINO' . $log->api_no);
$is_compliance = (new RankDataLogic())->save_rank($log->project_id, $res, null, $log->lang);
$log->is_compliance = $is_compliance;
$log->status = 1;
$log->save();
} catch (\Exception $e) {
$this->output('处理失败:ID'.$log->project_id . ',APINO' . $log->api_no . ':' . $e->getMessage());
}
}
}
public function output($message)
{
$date = date('Y-m-d H:i:s');
$output = $date . ', ' . $message . PHP_EOL;
echo $output;
Log::channel('rank_data')->info($output);
return true;
}
}
... ...
... ... @@ -37,6 +37,10 @@ class WorkchatMessageSend extends Command
foreach ($tasks as $task) {
$this->output('开始推送消息' . $task->id);
try {
//超过两小时 不推送了
if(time() - $task->send_time > 7200){
throw new \Exception('超时两小时未推送');
}
ProjectAssociationServices::getInstance()->sendMessage($task->friend_id, $task->content, $task->content_type);
$this->output('推送消息' . $task->id . '成功');
$task->status = MessagePush::STATUS_SUCCESS;
... ...
... ... @@ -397,29 +397,56 @@ class ProjectUpdate extends Command
$ve = '';
}
$extend = $extend_model->read(['title' => $ke]);
if (!$extend) {
$extend_key = $this->get_extend_key($extend_model);
$extend_model->add([
'project_id' => $project_id,
'title' => $ke,
'type' => 1,
'key' => $extend_key
]);
} else {
$extend_key = $extend['key'];
}
$extend_info = $extend_info_model->read(['key' => $extend_key, 'product_id' => $id]);
if (!$extend_info) {
$extend_info_model->add([
'key' => $extend_key,
'project_id' => $project_id,
'product_id' => $id,
'values' => $ve,
'type' => 1
]);
} else {
$extend_info_model->edit(['values' => $ve], ['key' => $extend_key, 'product_id' => $id]);
if ($extend) {
if ($extend['type'] == 3) {
//图片
$gallery = [];
if (is_array($ve)) {
foreach ($ve as $ve_img) {
$gallery[] = ['title' => '', 'description' => '', 'url' => $this->source_download($ve_img, $project_id, $domain_arr['host'], $web_url_domain, $home_url, 1)];
}
} else {
$gallery[] = ['title' => '', 'description' => '', 'url' => $this->source_download($ve, $project_id, $domain_arr['host'], $web_url_domain, $home_url, 1)];
}
$value = Arr::a2s($gallery);
} elseif ($extend['type'] == 4) {
//文件
$file = [];
if (is_array($ve)) {
$file_title = $ve['title'] ?? '';
$file_url = $ve['url'] ?? '';
if ($file_url) {
$file[] = [
'name' => $file_title,
'url' => $this->source_download($file_url, $project_id, $domain_arr['host'], $web_url_domain, $home_url, 1)
];
}
} elseif ($ve) {
$ve_array = explode('/', $ve);
$file[] = [
'name' => end($ve_array),
'url' => $this->source_download($ve, $project_id, $domain_arr['host'], $web_url_domain, $home_url, 1)
];
}
$value = Arr::a2s($file);
} else {
//文本
$value = $ve;
}
$extend_info = $extend_info_model->read(['key' => $extend['key'], 'product_id' => $id]);
if (!$extend_info) {
$extend_info_model->add([
'key' => $extend['key'],
'type' => $extend['type'],
'project_id' => $project_id,
'product_id' => $id,
'values' => $value,
]);
} else {
$extend_info_model->edit(['type' => $extend['type'], 'values' => $value], ['key' => $extend['key'], 'product_id' => $id]);
}
}
}
}
... ... @@ -712,6 +739,9 @@ class ProjectUpdate extends Command
if ($six_read) {
if ($item['extend'] ?? []) {
foreach ($item['extend'] as $ke => $ve) {
if ($ve == '--') {
$ve = '';
}
$extend = $extend_model->read(['title' => $ke]);
if ($extend) {
if ($extend['type'] == 3) {
... ... @@ -727,21 +757,24 @@ class ProjectUpdate extends Command
$value = Arr::a2s($gallery);
} elseif ($extend['type'] == 4) {
//文件
$file = [];
if (is_array($ve)) {
if (isset($ve['title']) || isset($ve['url'])) {
$file = [
[
'name' => isset($ve['title']) ? $ve['title'] : '',
'url' => isset($ve['url']) ? $this->source_download($ve['url'], $project_id, $domain_arr['host'], $web_url_domain, $home_url, 1) : ''
]
$file_title = $ve['title'] ?? '';
$file_url = $ve['url'] ?? '';
if ($file_url) {
$file[] = [
'name' => $file_title,
'url' => $this->source_download($file_url, $project_id, $domain_arr['host'], $web_url_domain, $home_url, 1)
];
} else {
$file = [];
}
$value = Arr::a2s($file);
} else {
$value = Arr::a2s([$this->source_download($ve, $project_id, $domain_arr['host'], $web_url_domain, $home_url, 1)]);
} elseif ($ve) {
$ve_array = explode('/', $ve);
$file[] = [
'name' => end($ve_array),
'url' => $this->source_download($ve, $project_id, $domain_arr['host'], $web_url_domain, $home_url, 1)
];
}
$value = Arr::a2s($file);
} else {
//文本
$value = $ve;
... ... @@ -1064,8 +1097,8 @@ class ProjectUpdate extends Command
]);
//同步到177
$error_file = ErrorFile::where('path',$new_url)->first();
if(!$error_file){
$error_file = ErrorFile::where('path', $new_url)->first();
if (!$error_file) {
$error_file = new ErrorFile();
$error_file->path = $new_url;
$error_file->status = 0;
... ...
... ... @@ -20,14 +20,14 @@ class Kernel extends ConsoleKernel
$schedule->command('template_label')->dailyAt('01:00')->withoutOverlapping(1);//最新模块
$schedule->command('popular_template_label')->dailyAt('01:30')->withoutOverlapping(1);//热门模块
// $schedule->command('inspire')->hourly();
$schedule->command('remain_day')->dailyAt('09:30')->withoutOverlapping(1); // 项目剩余服务时长
// $schedule->command('remain_day')->dailyAt('09:30')->withoutOverlapping(1); // 项目剩余服务时长
$schedule->command('rank_data_task')->everyMinute()->withoutOverlapping(1); // 排名数据更新任务
$schedule->command('service_count')->dailyAt('01:00')->withoutOverlapping(1); //服务器使用情况,每天凌晨1点执行一次
$schedule->command('web_traffic_special')->everyMinute()->withoutOverlapping(1); // 特殊引流
$schedule->command('web_traffic_russia_special')->everyMinute()->withoutOverlapping(1); // 特殊引流
// $schedule->command('web_traffic_special')->everyMinute()->withoutOverlapping(1); // 特殊引流
// $schedule->command('web_traffic_russia_special')->everyMinute()->withoutOverlapping(1); // 特殊引流
$schedule->command('sync_channel')->dailyAt('06:00')->withoutOverlapping(1); // 渠道信息,每天执行一次
$schedule->command('forward_count')->monthlyOn(1,'01:00')->withoutOverlapping(1);//没月月初1号执行月统计转发询盘记录
$schedule->command('inquiry_delay')->everyMinute()->withoutOverlapping(1);//TODO::上线放开,转发询盘,每分钟执行一次
// $schedule->command('inquiry_delay')->everyMinute()->withoutOverlapping(1);//TODO::上线放开,转发询盘,每分钟执行一次
$schedule->command('inquiry_count')->dailyAt('01:00')->withoutOverlapping(1); // 询盘统计数据,每天凌晨执行一次
// $schedule->command('domain_info')->dailyAt('01:20')->withoutOverlapping(1);// 更新域名|证书结束时间,每天凌晨1点执行一次
$schedule->command('share_user')->dailyAt('01:20')->withoutOverlapping(1);// 每天凌晨1点执行一次
... ...
... ... @@ -107,7 +107,6 @@ class QuanqiusouApi
if($res){
$res = Arr::s2a($res);
Cache::put($key, $res, 2 * 3600);
RankDataLog::addLog($project_id, $api_no, $lang, $endDay, $res);
}
} catch (\Exception | GuzzleException $e) {
errorLog('获取谷歌排名数据失败', [$api_no], $e);
... ...
... ... @@ -34,14 +34,23 @@ class AdsController extends BaseController
*/
public function fbAdsList(Request $request)
{
$ads_id = trim($request->input('ads_id'));
$title = trim($request->input('title'));
$industry = trim($request->input('industry'));
$result = ReInquiryTask::where(['status' => ReInquiryTask::STATUS_OPEN])
->when($ads_id, function ($query, $ads_id) {
$ad_id = trim($request->input('ad_id'));
$status = $request->input('status', '');
$result = ReInquiryTask::when($ad_id, function ($query, $ads_id) {
return $query->where('ad_id', 'like', '%' . $ads_id . '%');
})
->when($title, function ($query, $title) {
return $query->where('title', 'like', '%' . $title . '%');
})
->when($industry, function ($query, $industry) {
return $query->where('industry', $industry);
return $query->where('industry', 'like', '%' . $industry . '%');
})
->where(function ($query)use($status) {
if(is_numeric($status)){
return $query->where('status', $status);
}
})
->orderBy('id', 'desc')
->paginate();
... ...
... ... @@ -390,6 +390,7 @@ class RankDataLogic extends BaseLogic
public function syncRankData($api_no, $site_res, $force=false){
$project_ids = DeployOptimize::where('api_no', $api_no)->pluck('project_id');
foreach ($project_ids as $project_id) {
Log::channel('rank_data')->info('开始查项目:' . $project_id);
$project = Project::find($project_id);
if (!$project) {
throw new \Exception($api_no . '关联的项目不存在');
... ... @@ -397,12 +398,14 @@ class RankDataLogic extends BaseLogic
$api = new QuanqiusouApi();
$model = RankData::where('project_id', $project_id)->where('lang', '')->first();
if (!$model || $model->updated_date != date('Y-m-d') || $force) {
Log::channel('rank_data')->info('开始接口数据:' . $project_id);
$res = $api->getGoogleRank($project_id, $api_no, '', 7, $force);
if (!$res) {
throw new \Exception("接口数据获取失败,api_no:{$api_no}");
}
//收录数
$indexed_pages_num = $site_res[$api_no] ?? 0;
Log::channel('rank_data')->info('开始保存:' . $project_id);
$this->save_rank($project_id, $res, $indexed_pages_num);
}
//有小语种的
... ... @@ -444,13 +447,13 @@ class RankDataLogic extends BaseLogic
/**
* @param $project_id
* @param int $indexed_pages_num
* @param $indexed_pages_num
* @param $data
* @param string $lang
* @author zbj
* @date 2023/5/8
*/
public function save_rank($project_id, $data, int $indexed_pages_num = 0, string $lang = ''){
public function save_rank($project_id, $data, $indexed_pages_num = null, string $lang = ''){
$without_project_ids = []; //不用处理排名的项目
$without_extension_project_ids = [658]; //是否达标只统计主词的
$extension_project_ids = [354]; //扩展词也到达标的
... ... @@ -545,11 +548,15 @@ class RankDataLogic extends BaseLogic
$model->first_three_pages_num = $first_three_pages_num;
$model->first_five_pages_num = $first_five_pages_num;
$model->first_ten_pages_num = $first_ten_pages_num;
$model->indexed_pages_num = $indexed_pages_num;
if($indexed_pages_num !== null){
$model->indexed_pages_num = $indexed_pages_num;
}
$model->lang = $lang;
$model->data = $data;
$model->updated_date = date('Y-m-d');
$model->save();
return $model->is_compliance;
}
/**
... ...
... ... @@ -51,7 +51,7 @@ class InquiryFormData extends Base
//5分钟内是否有重复数据
$is_exist = self::where('sign', $sign)->where('created_at', '>', date('Y-m-d H:i:s', strtotime('-5 minute')))->first();
if($is_exist){
return true;
return 0;
}
$model = new self();
... ...
... ... @@ -5,6 +5,7 @@ namespace App\Models\RankData;
use App\Helper\Arr;
use App\Models\Base;
use Illuminate\Support\Facades\Redis;
/**
* Class GoogleRank
... ... @@ -27,22 +28,29 @@ class RankDataLog extends Base
return Arr::s2a($value);
}
public static function addLog($project_id, $api_no, $lang, $date, $res){
$data= [];
foreach ($res as $key=>$item){
$data[$key] = $item[$date];
}
public static function addTask($project_id, $api_no, $lang =''){
$date = date('Y-m-d');
$model = self::where('project_id', $project_id)->where('date', $date)->where('lang', $lang)->first();
if(!$model){
if($model){
//已达标的
if($model->is_compliance){
return true;
}
//有未执行的
if(!$model->status){
return true;
}
}else{
$model = new self();
$model->project_id = $project_id;
$model->api_no = $api_no;
$model->lang = $lang;
$model->date = $date;
}
$model->project_id = $project_id;
$model->api_no = $api_no;
$model->lang = $lang;
$model->date = $date;
$model->data = $data;
$model->status = 0;
$model->save();
Redis::lpush('rank_data_task', $model->id);
return true;
}
... ...
... ... @@ -63,10 +63,10 @@ class MessagePush extends Base
$model->type = self::TYPE_INQUIRY;
$model->ref_ids = $id;
$model->content = '[' . date('H:i', strtotime($submit_at)) . '] 您的全球搜网站收到来自【' . $country . $name . '】的询盘信息,请登录后台或APP进行查看!';
$model->send_time = $submit_at;
}else{
//定时发送时间
$send_time = $hour >= 9 ? date('Y-m-d 09:00:00', strtotime('+1 day')) : date('Y-m-d 09:00:00');
$send_time = $hour >= 9 ? date('Y-m-d 09:00:00', strtotime($submit_at . '+1 day')) : date('Y-m-d 09:00:00', strtotime($submit_at));
$model = self::where('project_id', $project_id)->where('type', self::TYPE_INQUIRY)->where('send_time', $send_time)->first();
if(!$model){
$model = new self();
... ...
... ... @@ -159,14 +159,15 @@ class SyncSubmitTaskService
Visit::isInquiry($data['ip']);
//推送企微消息
try {
$name = empty($data['data']['name']) ? '' : ' ' . $data['data']['name'];
MessagePush::addInquiryMessage($id, $data['project_id'], $data['country'], $name, $data['submit_at']);
}catch (\Exception $e){
LogUtils::error('询盘消息'.$id.'写入企微消息队列失败' . $e->getMessage());
if($id){
try {
$name = empty($data['data']['name']) ? '' : ' ' . $data['data']['name'];
MessagePush::addInquiryMessage($id, $data['project_id'], $data['country'], $name, $data['submit_at']);
}catch (\Exception $e){
LogUtils::error('询盘消息'.$id.'写入企微消息队列失败' . $e->getMessage());
}
}
return true;
}
... ... @@ -189,6 +190,7 @@ class SyncSubmitTaskService
$referrer_url = $url_arr['scheme'] . '://' . $url_arr['host'] . '/';
}
}
$visit_data['referrer_url'] = $this->handle_referer($referrer_url);
$visit_data['device_port'] = $data['data']['device_port']??'';
$visit_data['url'] = $data['data']['url']??'';
... ... @@ -201,7 +203,7 @@ class SyncSubmitTaskService
if(!empty($data['is_cf'])){
$visit_data['is_inquiry'] = 1;
}
Visit::saveData($visit_data, $date);
Visit::saveData($visit_data, $visit_data['updated_date']);
return true;
}
... ...