作者 刘锟

Merge remote-tracking branch 'origin/master' into akun

@@ -220,17 +220,24 @@ class VideoTask extends Command @@ -220,17 +220,24 @@ class VideoTask extends Command
220 if (count($productIds)<7){ 220 if (count($productIds)<7){
221 $product_all_id = Product::where("project_id", $project_id)->whereNotIn('id', $productIds)->where("status",Product::STATUS_ON)->pluck('id')->toArray(); 221 $product_all_id = Product::where("project_id", $project_id)->whereNotIn('id', $productIds)->where("status",Product::STATUS_ON)->pluck('id')->toArray();
222 $number = 40; 222 $number = 40;
223 - $product_id = array_rand($product_all_id, min(count($product_all_id, $number-count($productIds))));  
224 - $randomData = Product::where("project_id", $project_id)->whereIn("id", $product_id)->get();  
225 - $products = $productsQuery->merge($randomData); 223 + $array_count = count($product_all_id);
  224 + if ($array_count > 0) {
  225 + $product_id = array_rand($product_all_id, min($array_count, $number - count($productIds)));
  226 + $randomData = Product::where("project_id", $project_id)->whereIn("id", $product_id)->get();
  227 + $products = $productsQuery->merge($randomData);
  228 + }
226 }else{ 229 }else{
227 $products = $productsQuery; 230 $products = $productsQuery;
228 } 231 }
229 }else{ 232 }else{
230 $product_all_id = Product::where("project_id", $project_id)->where("status",Product::STATUS_ON)->pluck('id')->toArray(); 233 $product_all_id = Product::where("project_id", $project_id)->where("status",Product::STATUS_ON)->pluck('id')->toArray();
231 $number = 40; 234 $number = 40;
232 - $product_id = array_rand($product_all_id, min(count($product_all_id, $number-count($productIds))));  
233 - $products = Product::where("project_id", $project_id)->whereIn("id", $product_id)->get(); 235 + $array_count = count($product_all_id);
  236 + if ($array_count > 0)
  237 + {
  238 + $product_id = array_rand($product_all_id, min($array_count, $number-count($productIds)));
  239 + $products = Product::where("project_id", $project_id)->whereIn("id", $product_id)->get();
  240 + }
234 } 241 }
235 } 242 }
236 $data = []; 243 $data = [];
@@ -242,10 +249,11 @@ class VideoTask extends Command @@ -242,10 +249,11 @@ class VideoTask extends Command
242 if(count($data) > 13){ 249 if(count($data) > 13){
243 break; 250 break;
244 } 251 }
245 - if (strpos($item->keyword_id, ','.$productKeyword->id.',') === false) { 252 + $keyword_id = implode(',',$item->keyword_id);
  253 + if (strpos(','.$keyword_id.',', ','.$productKeyword->id.',') === false) {
246 //不包含 254 //不包含
247 $productModel = new Product(); 255 $productModel = new Product();
248 - $keyword_id = $item->keyword_id . $productKeyword->id.','; 256 + $keyword_id = $keyword_id . $productKeyword->id.',';
249 $productModel->edit(['keyword_id'=>$keyword_id],['id'=>$item->id]); 257 $productModel->edit(['keyword_id'=>$keyword_id],['id'=>$item->id]);
250 } 258 }
251 $data[] = ['url'=>getImageUrl($item->thumb['url']),'title'=>$item->title]; 259 $data[] = ['url'=>getImageUrl($item->thumb['url']),'title'=>$item->title];
@@ -19,13 +19,13 @@ class Kernel extends ConsoleKernel @@ -19,13 +19,13 @@ class Kernel extends ConsoleKernel
19 $schedule->command('remain_day')->dailyAt('08:00')->withoutOverlapping(1); // 项目剩余服务时长 19 $schedule->command('remain_day')->dailyAt('08:00')->withoutOverlapping(1); // 项目剩余服务时长
20 $schedule->command('rank_data_task')->everyMinute()->withoutOverlapping(1); // 排名数据更新任务 20 $schedule->command('rank_data_task')->everyMinute()->withoutOverlapping(1); // 排名数据更新任务
21 $schedule->command('rank_data')->dailyAt('07:00')->withoutOverlapping(1); // 排名数据,每天凌晨执行一次 21 $schedule->command('rank_data')->dailyAt('07:00')->withoutOverlapping(1); // 排名数据,每天凌晨执行一次
22 - $schedule->command('rank_data_speed')->dailyAt('01:00')->withoutOverlapping(1); // 排名数据-测速数据,每周一凌晨执行一次  
23 - $schedule->command('rank_data_external_links')->dailyAt('01:00')->withoutOverlapping(1); // 排名数据-外链,每周一凌晨执行一次  
24 - $schedule->command('rank_data_indexed_pages')->dailyAt('01:00')->withoutOverlapping(1); // 排名数据-页面收录,每周一凌晨执行一次  
25 - $schedule->command('rank_data_recomm_domain')->dailyAt('01:00')->withoutOverlapping(1); // 排名数据-引荐域名,每周一凌晨执行一次 22 + $schedule->command('rank_data_speed')->dailyAt('01:10')->withoutOverlapping(1); // 排名数据-测速数据,每周一凌晨执行一次
  23 + $schedule->command('rank_data_external_links')->dailyAt('01:20')->withoutOverlapping(1); // 排名数据-外链,每周一凌晨执行一次
  24 + $schedule->command('rank_data_indexed_pages')->dailyAt('01:30')->withoutOverlapping(1); // 排名数据-页面收录,每周一凌晨执行一次
  25 + $schedule->command('rank_data_recomm_domain')->dailyAt('01:40')->withoutOverlapping(1); // 排名数据-引荐域名,每周一凌晨执行一次
26 $schedule->command('rank_data_week')->dailyAt('01:00')->withoutOverlapping(1); // 排名数据,每周一凌晨执行一次 26 $schedule->command('rank_data_week')->dailyAt('01:00')->withoutOverlapping(1); // 排名数据,每周一凌晨执行一次
27 // $schedule->command('share_user')->dailyAt('01:00')->withoutOverlapping(1); // 清除用户ayr_share数据,每天凌晨1点执行一次 27 // $schedule->command('share_user')->dailyAt('01:00')->withoutOverlapping(1); // 清除用户ayr_share数据,每天凌晨1点执行一次
28 - $schedule->command('count')->dailyAt('01:00')->withoutOverlapping(1); //每天凌晨1点执行一次 28 + $schedule->command('count')->dailyAt('00:30')->withoutOverlapping(1); //每天凌晨1点执行一次
29 $schedule->command('service_count')->dailyAt('01:00')->withoutOverlapping(1); //服务器使用情况,每天凌晨1点执行一次 29 $schedule->command('service_count')->dailyAt('01:00')->withoutOverlapping(1); //服务器使用情况,每天凌晨1点执行一次
30 $schedule->command('web_traffic 1')->everyThirtyMinutes(); // 引流 1-3个月的项目,半小时一次 30 $schedule->command('web_traffic 1')->everyThirtyMinutes(); // 引流 1-3个月的项目,半小时一次
31 $schedule->command('web_traffic 2')->cron('*/18 * * * *'); // 引流 4-8个月的项目,18分钟一次 31 $schedule->command('web_traffic 2')->cron('*/18 * * * *'); // 引流 4-8个月的项目,18分钟一次
@@ -35,7 +35,7 @@ class Kernel extends ConsoleKernel @@ -35,7 +35,7 @@ class Kernel extends ConsoleKernel
35 $schedule->command('forward_count')->monthlyOn(1,'01:00')->withoutOverlapping(1);//没月月初1号执行月统计转发询盘记录 35 $schedule->command('forward_count')->monthlyOn(1,'01:00')->withoutOverlapping(1);//没月月初1号执行月统计转发询盘记录
36 $schedule->command('inquiry_delay')->everyMinute()->withoutOverlapping(1);//TODO::上线放开,转发询盘,每分钟执行一次 36 $schedule->command('inquiry_delay')->everyMinute()->withoutOverlapping(1);//TODO::上线放开,转发询盘,每分钟执行一次
37 $schedule->command('inquiry_count')->dailyAt('01:00')->withoutOverlapping(1); // 询盘统计数据,每天凌晨执行一次 37 $schedule->command('inquiry_count')->dailyAt('01:00')->withoutOverlapping(1); // 询盘统计数据,每天凌晨执行一次
38 - $schedule->command('domain_info')->dailyAt('01:00')->withoutOverlapping(1);// 更新域名|证书结束时间,每天凌晨1点执行一次 38 + $schedule->command('domain_info')->dailyAt('01:20')->withoutOverlapping(1);// 更新域名|证书结束时间,每天凌晨1点执行一次
39 $schedule->command('last_inquiry')->dailyAt('04:00')->withoutOverlapping(1);// 最近一次询盘信息 39 $schedule->command('last_inquiry')->dailyAt('04:00')->withoutOverlapping(1);// 最近一次询盘信息
40 // $schedule->command('update_progress')->everyThirtyMinutes()->withoutOverlapping(1);//监控更新 40 // $schedule->command('update_progress')->everyThirtyMinutes()->withoutOverlapping(1);//监控更新
41 $schedule->command('update_seo_tdk_crontab')->dailyAt('00:00')->withoutOverlapping(1); //更新上线项目TDK 41 $schedule->command('update_seo_tdk_crontab')->dailyAt('00:00')->withoutOverlapping(1); //更新上线项目TDK
@@ -43,8 +43,12 @@ class Kernel extends ConsoleKernel @@ -43,8 +43,12 @@ class Kernel extends ConsoleKernel
43 // $schedule->command('project_file_pdf')->dailyAt('00:00')->withoutOverlapping(1); // 网站项目数据,生成PDF文件 43 // $schedule->command('project_file_pdf')->dailyAt('00:00')->withoutOverlapping(1); // 网站项目数据,生成PDF文件
44 $schedule->command('sync_manager')->dailyAt('01:00')->withoutOverlapping(1); //TODO::手机号码同步 每天执行一次 44 $schedule->command('sync_manager')->dailyAt('01:00')->withoutOverlapping(1); //TODO::手机号码同步 每天执行一次
45 45
46 - $schedule->command('recommended_suppliers')->dailyAt('01:00')->withoutOverlapping(1); //每天凌晨1点执行一次生成推荐商 46 + $schedule->command('recommended_suppliers')->dailyAt('03:00')->withoutOverlapping(1); //每天凌晨1点执行一次生成推荐商
47 $schedule->command('notice_c')->dailyAt('02:00')->withoutOverlapping(1); //每天凌晨1点执行一次生成推荐商 47 $schedule->command('notice_c')->dailyAt('02:00')->withoutOverlapping(1); //每天凌晨1点执行一次生成推荐商
  48 + // 每日推送视频任务
  49 + $schedule->command('video_task')->dailyAt('01:30')->withoutOverlapping(1);
  50 + // 每日推送已完成视频任务项目生成对应界面
  51 + $schedule->command('notice_c')->dailyAt('02:00')->withoutOverlapping(1);
48 } 52 }
49 53
50 /** 54 /**
@@ -13,8 +13,10 @@ use App\Models\Product\Product; @@ -13,8 +13,10 @@ use App\Models\Product\Product;
13 use App\Models\Project\OnlineCheck; 13 use App\Models\Project\OnlineCheck;
14 use App\Models\Project\Project; 14 use App\Models\Project\Project;
15 use App\Models\RouteMap\RouteMap; 15 use App\Models\RouteMap\RouteMap;
  16 +use App\Models\User\User;
16 use App\Services\ProjectServer; 17 use App\Services\ProjectServer;
17 use Illuminate\Http\Request; 18 use Illuminate\Http\Request;
  19 +use Illuminate\Support\Facades\DB;
18 20
19 /** 21 /**
20 * Class PrivateController 22 * Class PrivateController
@@ -98,4 +100,46 @@ class PrivateController extends BaseController @@ -98,4 +100,46 @@ class PrivateController extends BaseController
98 } 100 }
99 return $this->success($result); 101 return $this->success($result);
100 } 102 }
  103 +
  104 + /**
  105 + * 验证当前用户是否存在
  106 + * TODO 查询手机号码是否是项目用户, 如果升级项目未上线项目return false;
  107 + * @param Request $request
  108 + * @return false|string
  109 + */
  110 + public function hasUser(Request $request)
  111 + {
  112 + // 获取数据,初始化信息
  113 + $mobile = trim($request->input('mobile'));
  114 + $result = ['mobile' => $mobile, 'v6_user' => false];
  115 +
  116 + // 获取用户,验证用户
  117 + $project_ids = User::where(['mobile' => $mobile])->pluck('project_id')->toArray();
  118 + if (empty($project_ids))
  119 + return $this->success($result);
  120 +
  121 + $projects = Project::whereIn('id', $project_ids)->where('delete_status', 0)->get();
  122 + foreach ($projects as $project) {
  123 + // 如果是升级项目 并且未上线状态,不算做有效用户
  124 + if ($project->is_upgrade == Project::IS_UPGRADE_TRUE && $project->type <= Project::TYPE_ONE)
  125 + continue;
  126 + $result['v6_user'] = true;
  127 + }
  128 +
  129 + return $this->success($result);
  130 + }
  131 +
  132 + /**
  133 + * v6 有效用户
  134 + * @param Request $request
  135 + * @return false|string
  136 + */
  137 + public function validUser(Request $request)
  138 + {
  139 + // 排除演示项目数据
  140 + $valid_user = User::select(['gl_project_user.mobile'])->leftJoin('gl_project', 'gl_project.id', '=', 'gl_project_user.project_id')->where(['delete_status' => 0, 'is_upgrade' => Project::IS_UPGRADE_FALSE])->where('gl_project.id', '>', 1)->pluck('mobile')->toArray();
  141 + $upgrade_user = User::select(['gl_project_user.mobile'])->leftJoin('gl_project', 'gl_project.id', '=', 'gl_project_user.project_id')->where(['delete_status' => 0, 'is_upgrade' => Project::IS_UPGRADE_TRUE])->where('gl_project.type', '>', Project::TYPE_ONE)->pluck('mobile')->toArray();
  142 + $user = array_unique(array_merge($valid_user, $upgrade_user));
  143 + return $this->success($user);
  144 + }
101 } 145 }
@@ -235,9 +235,15 @@ class LoginController extends BaseController @@ -235,9 +235,15 @@ class LoginController extends BaseController
235 * @time :2023/8/24 17:37 235 * @time :2023/8/24 17:37
236 */ 236 */
237 public function globalSo_v6_login(UserLoginLogic $logic){ 237 public function globalSo_v6_login(UserLoginLogic $logic){
238 - $common = new Common();  
239 - $arr = $common->decrypt(urldecode($this->param['token']));  
240 - if(empty($arr)){ 238 + $this->param = $this->request->validate([
  239 + 'token' => 'required',
  240 + ],[
  241 + 'token.required' => 'token不能为空',
  242 + ]);
  243 + try {
  244 + $common = new Common();
  245 + $arr = $common->decrypt(urldecode($this->param['token']));
  246 + }catch (\Exception $e){
241 $this->response('非法请求!',Code::USER_ERROR); 247 $this->response('非法请求!',Code::USER_ERROR);
242 } 248 }
243 if (empty($arr['timestamp']) || time() - $arr['timestamp'] > 60) { 249 if (empty($arr['timestamp']) || time() - $arr['timestamp'] > 60) {
@@ -54,7 +54,7 @@ class TranslateLogic extends BaseLogic @@ -54,7 +54,7 @@ class TranslateLogic extends BaseLogic
54 if($info !== false){ 54 if($info !== false){
55 $data_read = json_decode($info['data'],JSON_UNESCAPED_UNICODE); 55 $data_read = json_decode($info['data'],JSON_UNESCAPED_UNICODE);
56 foreach ($data_read as $k => $v){ 56 foreach ($data_read as $k => $v){
57 - $old_key[] = $k; 57 + $old_key[] = trim($k);
58 $data[] = [$k => $v]; 58 $data[] = [$k => $v];
59 } 59 }
60 } 60 }
@@ -83,30 +83,9 @@ class TranslateLogic extends BaseLogic @@ -83,30 +83,9 @@ class TranslateLogic extends BaseLogic
83 83
84 } 84 }
85 } 85 }
86 - $data = $this->unique_multidimensional_array($data);  
87 return $this->success($data); 86 return $this->success($data);
88 } 87 }
89 88
90 - /**  
91 - * @remark :多维数组去重  
92 - * @name :unique_multidimensional_array  
93 - * @author :lyh  
94 - * @method :post  
95 - * @time :2024/3/8 16:38  
96 - */  
97 - public function unique_multidimensional_array($array) {  
98 - $tempArray = [];  
99 - $uniqueArray = [];  
100 - foreach ($array as $value) {  
101 - // 使用键作为临时数组的键,如果不存在则添加到去重后的数组中  
102 - $key = key($value);  
103 - if (!isset($tempArray[$key])) {  
104 - $tempArray[$key] = true;  
105 - $uniqueArray[] = $value;  
106 - }  
107 - }  
108 - return $uniqueArray;  
109 - }  
110 89
111 /** 90 /**
112 * @remark :获取图片列表 91 * @remark :获取图片列表
@@ -203,10 +182,11 @@ class TranslateLogic extends BaseLogic @@ -203,10 +182,11 @@ class TranslateLogic extends BaseLogic
203 if(FALSE !== strpos($country_class, 'country-flag')) { 182 if(FALSE !== strpos($country_class, 'country-flag')) {
204 continue; 183 continue;
205 } 184 }
206 - $need_tran[] = htmlspecialchars_decode(html_entity_decode($string)); 185 + $need_tran[] = trim(htmlspecialchars_decode(html_entity_decode($string)));
207 } 186 }
208 $need_tran[] = $description ? $description->attr['content'] : ''; 187 $need_tran[] = $description ? $description->attr['content'] : '';
209 $need_tran[] = $keywords ? $keywords->attr['content'] : ''; 188 $need_tran[] = $keywords ? $keywords->attr['content'] : '';
  189 + $need_tran = array_unique($need_tran);
210 return $need_tran; 190 return $need_tran;
211 } 191 }
212 192
@@ -2,11 +2,12 @@ @@ -2,11 +2,12 @@
2 2
3 namespace App\Listeners; 3 namespace App\Listeners;
4 4
5 -use Illuminate\Contracts\Queue\ShouldQueue; 5 +use App\Enums\Common\Common;
6 use Illuminate\Database\Events\QueryExecuted; 6 use Illuminate\Database\Events\QueryExecuted;
7 -use Illuminate\Queue\InteractsWithQueue; 7 +use Illuminate\Support\Facades\Cache;
8 use Illuminate\Support\Facades\Log; 8 use Illuminate\Support\Facades\Log;
9 -use Illuminate\Support\Facades\Redis; 9 +use Illuminate\Support\Facades\Route;
  10 +use Illuminate\Support\Str;
10 11
11 /** 12 /**
12 * 监听数据库sql执行事件 13 * 监听数据库sql执行事件
@@ -47,6 +48,33 @@ class QueryListener @@ -47,6 +48,33 @@ class QueryListener
47 $log = $log.' [ RunTime:'.$event->time.'ms ] '; 48 $log = $log.' [ RunTime:'.$event->time.'ms ] ';
48 Log::debug($log); 49 Log::debug($log);
49 } 50 }
  51 + //监听9644这个api_no是TM咋个被改的
  52 + if (in_array(9644, $event->bindings) && Str::contains($event->sql, 'update') && Str::contains($event->sql, '`api_no` =')) {
  53 + //记录debug 根据这个溯源
  54 + $trace = debug_backtrace();
  55 + $traces = [];
  56 + foreach ($trace as $index => $caller) {
  57 + if ($index === 0) {
  58 + continue; // 跳过当前方法的调用信息
  59 + }
  60 + $file = $caller['file'];
  61 + $line = $caller['line'];
  62 + $class = $caller['class'];
  63 + $method = $caller['function'];
  64 + $traces[] = "Method $method called from $class in file $file at line $line\n";
  65 + }
  66 + //用户信息 哪个改的 还是脚本跑的
  67 + $token = request()->header('token');
  68 + Log::channel('test')->info('api_no updated', [
  69 + 'sql' => $event->sql,
  70 + 'bindings' => $event->bindings,
  71 + 'route' => Route::current(),
  72 + 'request' => request()->all(),
  73 + 'a_info' => Cache::get(Common::MANAGE_TOKEN . $token),
  74 + 'b_info' => Cache::get($token),
  75 + 'trace' => $traces
  76 + ]);
  77 + }
50 }catch (\Exception $exception){ 78 }catch (\Exception $exception){
51 Log::error('log sql error:'.$exception->getMessage()); 79 Log::error('log sql error:'.$exception->getMessage());
52 } 80 }
@@ -72,6 +72,12 @@ return [ @@ -72,6 +72,12 @@ return [
72 'via' => \App\Factory\LogFormatterFactory::class, 72 'via' => \App\Factory\LogFormatterFactory::class,
73 'prefix' => 'rank_data', 73 'prefix' => 'rank_data',
74 ], 74 ],
  75 + //测试数据日志
  76 + 'test' => [
  77 + 'driver' => 'custom',
  78 + 'via' => \App\Factory\LogFormatterFactory::class,
  79 + 'prefix' => 'test',
  80 + ],
75 'wechatside' => [ 81 'wechatside' => [
76 'driver' => 'custom', 82 'driver' => 'custom',
77 'via' => \App\Factory\LogFormatterFactory::class, 83 'via' => \App\Factory\LogFormatterFactory::class,
@@ -24,4 +24,9 @@ Route::get('get_project_route', [\App\Http\Controllers\Api\PrivateController::cl @@ -24,4 +24,9 @@ Route::get('get_project_route', [\App\Http\Controllers\Api\PrivateController::cl
24 Route::any('get_product_images', [\App\Http\Controllers\Api\ProductController::class, 'getImages'])->name('api.get_product_images'); 24 Route::any('get_product_images', [\App\Http\Controllers\Api\ProductController::class, 'getImages'])->name('api.get_product_images');
25 Route::post('inquiry_submit', [\App\Http\Controllers\Api\InquiryController::class, 'submit'])->name('api.inquiry_submit'); 25 Route::post('inquiry_submit', [\App\Http\Controllers\Api\InquiryController::class, 'submit'])->name('api.inquiry_submit');
26 Route::any('getOptimizationReport', [\App\Http\Controllers\Api\OptimizationReportController::class, 'getOptimizationReport'])->name('api.getOptimizationReport'); 26 Route::any('getOptimizationReport', [\App\Http\Controllers\Api\OptimizationReportController::class, 'getOptimizationReport'])->name('api.getOptimizationReport');
  27 +// 视频任务回调信息
27 Route::post('video_task_callback', [\App\Http\Controllers\Api\NoticeController::class, 'videoTaskCallback'])->name('api.video_task_callback'); 28 Route::post('video_task_callback', [\App\Http\Controllers\Api\NoticeController::class, 'videoTaskCallback'])->name('api.video_task_callback');
  29 +// 验证是否为6.0用户
  30 +Route::any('has_user', [\App\Http\Controllers\Api\PrivateController::class, 'hasUser'])->name('api.has_user');
  31 +// 6.0有效用户用户
  32 +Route::any('valid_user', [\App\Http\Controllers\Api\PrivateController::class, 'validUser'])->name('api.valid_user');