作者 刘锟

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

@@ -83,7 +83,7 @@ class RemainDay extends Command @@ -83,7 +83,7 @@ class RemainDay extends Command
83 * @time :2025/4/2 10:48 83 * @time :2025/4/2 10:48
84 */ 84 */
85 public function saveRemainDay(){ 85 public function saveRemainDay(){
86 - $list = $this->project->list(['type'=>['in',[Project::TYPE_TWO,Project::TYPE_THREE,Project::TYPE_FOUR]]],'id',['id','type','uptime','remain_day','is_remain_today','pause_days','finish_remain_day']); 86 + $list = $this->project->list(['extend_type'=>Project::TYPE_ZERO,'type'=>['in',[Project::TYPE_TWO,Project::TYPE_THREE,Project::TYPE_FOUR]]],'id',['id','type','uptime','remain_day','is_remain_today','pause_days','finish_remain_day']);
87 foreach ($list as $item){ 87 foreach ($list as $item){
88 $deploy_build = $this->deployBuild->read(['project_id'=>$item['id']],['service_duration','seo_service_duration','plan','seo_plan']); 88 $deploy_build = $this->deployBuild->read(['project_id'=>$item['id']],['service_duration','seo_service_duration','plan','seo_plan']);
89 echo 'start->项目id:' . $item['id'] . '执行时间:'. date('Y-m-d H:i:s') . PHP_EOL; 89 echo 'start->项目id:' . $item['id'] . '执行时间:'. date('Y-m-d H:i:s') . PHP_EOL;
@@ -97,11 +97,33 @@ class RemainDay extends Command @@ -97,11 +97,33 @@ class RemainDay extends Command
97 $this->project->edit(['pause_days'=>$pause_days],['id'=>$item['id']]); 97 $this->project->edit(['pause_days'=>$pause_days],['id'=>$item['id']]);
98 continue; 98 continue;
99 } 99 }
100 - //白帽版本的系统  
101 - if($deploy_build['seo_plan'] == 1){ 100 + //白帽版本单独计算
  101 + $this->seoRemainDay($deploy_build,$item);
  102 + //默认版本统计
  103 + if($deploy_build['service_duration'] == 0){
  104 + continue;
  105 + }
  106 + $this->remainDay($item,$deploy_build);
  107 + echo 'end->项目id:' . $item['id'] . '执行时间:'. date('Y-m-d H:i:s') . PHP_EOL;
  108 + }
  109 + return true;
  110 + }
  111 +
  112 + /**
  113 + * @remark :白帽版本单独计算
  114 + * @name :seoRemainDay
  115 + * @author :lyh
  116 + * @method :post
  117 + * @time :2025/4/25 14:24
  118 + */
  119 + public function seoRemainDay($deploy_build,$item){
  120 + //白帽版本的系统
  121 + if($deploy_build['seo_plan'] == 1){
  122 + if($deploy_build['seo_service_duration'] != 0){
102 if($item['uptime']){ 123 if($item['uptime']){
103 $diff = time() - strtotime($item['uptime']); 124 $diff = time() - strtotime($item['uptime']);
104 - $seo_remain_day = $deploy_build['seo_service_duration'] - floor($diff / (60 * 60 * 24)); 125 + $compliance_day = floor($diff / (60 * 60 * 24));
  126 + $seo_remain_day = $deploy_build['seo_service_duration'] - $compliance_day;
105 }else{ 127 }else{
106 $seo_remain_day = $deploy_build['seo_service_duration']; 128 $seo_remain_day = $deploy_build['seo_service_duration'];
107 } 129 }
@@ -109,46 +131,55 @@ class RemainDay extends Command @@ -109,46 +131,55 @@ class RemainDay extends Command
109 $seo_remain_day = 0; 131 $seo_remain_day = 0;
110 } 132 }
111 if($deploy_build['plan'] == 0 && $seo_remain_day == 0 && $deploy_build['seo_service_duration'] != 0){//只有白帽版本的项目且剩余服务时常未0,放入未续费中 133 if($deploy_build['plan'] == 0 && $seo_remain_day == 0 && $deploy_build['seo_service_duration'] != 0){//只有白帽版本的项目且剩余服务时常未0,放入未续费中
112 - $this->project->edit(['seo_remain_day'=>$seo_remain_day,'extend_type'=>Project::TYPE_FIVE],['id'=>$item['id']]);  
113 - continue; 134 + $this->project->edit(['seo_remain_day'=>$seo_remain_day,'finish_remain_day'=>$compliance_day ?? 0,'extend_type'=>Project::TYPE_FIVE],['id'=>$item['id']]);
  135 + }else{
  136 + //同时包括白帽版本+默认版本的项目
  137 + $this->project->edit(['seo_remain_day'=>$seo_remain_day],['id'=>$item['id']]);
114 } 138 }
115 - //同时包括白帽版本+默认版本的项目  
116 - $this->project->edit(['seo_remain_day'=>$seo_remain_day],['id'=>$item['id']]);  
117 } 139 }
118 - //默认版本计算剩余服务时常  
119 - if($item['type'] == Project::TYPE_TWO || $item['type'] == Project::TYPE_FOUR){  
120 - if(in_array($item['id'],$this->projectId)){//已开始优化的时间结算  
121 - $optimizeModel = new DeployOptimize();  
122 - $opInfo = $optimizeModel->read(['project_id'=>$item['id']],['start_date']);  
123 - if($opInfo === false){  
124 - continue;  
125 - }  
126 - $diff = time() - strtotime($opInfo['start_date'] ?? $item['uptime']);  
127 - $compliance_day = floor($diff / (60 * 60 * 24));  
128 - $remain_day = $deploy_build['service_duration'] - $compliance_day; 140 + }
  141 + return true;
  142 + }
129 143
130 - }else{  
131 - $compliance_day = ($item['finish_remain_day'] ?? 0);  
132 - $remain_day = $deploy_build['service_duration'] - $compliance_day; 144 + /**
  145 + * @remark :普通版本剩余服务时常
  146 + * @name :RemainDay
  147 + * @author :lyh
  148 + * @method :post
  149 + * @time :2025/4/25 14:31
  150 + */
  151 + public function remainDay($item,$deploy_build){
  152 + //默认版本计算剩余服务时常
  153 + if($item['type'] == Project::TYPE_TWO || $item['type'] == Project::TYPE_FOUR){
  154 + if(in_array($item['id'],$this->projectId)){//已开始优化的时间结算
  155 + $optimizeModel = new DeployOptimize();
  156 + $opInfo = $optimizeModel->read(['project_id'=>$item['id']],['start_date']);
  157 + if($opInfo === false){
  158 + return true;
133 } 159 }
  160 + $diff = time() - strtotime($opInfo['start_date'] ?? $item['uptime']);
  161 + $compliance_day = floor($diff / (60 * 60 * 24));
  162 + $remain_day = $deploy_build['service_duration'] - $compliance_day;
134 }else{ 163 }else{
135 - //普通建站项目  
136 - if($item['uptime']){  
137 - $diff = time() - strtotime($item['uptime']);  
138 - $compliance_day = floor($diff / (60 * 60 * 24));  
139 - $remain_day = $deploy_build['service_duration'] - $compliance_day;  
140 - }else{  
141 - $remain_day = $deploy_build['service_duration'];  
142 - } 164 + $compliance_day = ($item['finish_remain_day'] ?? 0);
  165 + $remain_day = $deploy_build['service_duration'] - $compliance_day;
143 } 166 }
144 - $extend_type = 0;  
145 - if($remain_day < 0 && $deploy_build['service_duration'] != 0){  
146 - $remain_day = 0;  
147 - $extend_type = Project::TYPE_FIVE; 167 + }else{
  168 + //普通建站项目
  169 + if($item['uptime']){
  170 + $diff = time() - strtotime($item['uptime']);
  171 + $compliance_day = floor($diff / (60 * 60 * 24));
  172 + $remain_day = $deploy_build['service_duration'] - $compliance_day;
  173 + }else{
  174 + $remain_day = $deploy_build['service_duration'];
148 } 175 }
149 - $this->project->edit(['remain_day'=>$remain_day,'extend_type'=>$extend_type,'finish_remain_day'=>$compliance_day ?? 0],['id'=>$item['id']]);  
150 - echo 'end->项目id:' . $item['id'] . '执行时间:'. date('Y-m-d H:i:s') . PHP_EOL;  
151 } 176 }
  177 + $extend_type = 0;
  178 + if($remain_day < 0 && $deploy_build['service_duration'] != 0){
  179 + $remain_day = 0;
  180 + $extend_type = Project::TYPE_FIVE;
  181 + }
  182 + $this->project->edit(['remain_day'=>$remain_day,'extend_type'=>$extend_type,'finish_remain_day'=>$compliance_day ?? 0],['id'=>$item['id']]);
152 return true; 183 return true;
153 } 184 }
154 } 185 }
@@ -771,7 +771,7 @@ class RelayInquiry extends Command @@ -771,7 +771,7 @@ class RelayInquiry extends Command
771 */ 771 */
772 public function getInquiry($num = 10) 772 public function getInquiry($num = 10)
773 { 773 {
774 - $result = ReInquiryForm::where(['status' => ReInquiryForm::STATUS_INIT])->orderBy('id', 'asc')->limit($num)->get(); 774 + $result = ReInquiryForm::where(['status' => ReInquiryForm::STATUS_INIT])->where('created_at', '>', '2025-04-27 00:00:00')->orderBy('id', 'asc')->limit($num)->get();
775 return $result; 775 return $result;
776 } 776 }
777 777
@@ -9,8 +9,10 @@ @@ -9,8 +9,10 @@
9 9
10 namespace App\Console\Commands\LyhTest; 10 namespace App\Console\Commands\LyhTest;
11 11
  12 +use App\Console\Commands\Domain\DomainInfo;
12 use App\Models\Com\NoticeLog; 13 use App\Models\Com\NoticeLog;
13 use App\Models\Project\AiBlogTask; 14 use App\Models\Project\AiBlogTask;
  15 +use App\Models\Project\DeployBuild;
14 use App\Models\Project\Project; 16 use App\Models\Project\Project;
15 use Illuminate\Console\Command; 17 use Illuminate\Console\Command;
16 use Illuminate\Support\Facades\Artisan; 18 use Illuminate\Support\Facades\Artisan;
@@ -33,9 +35,14 @@ class lyhDemo extends Command @@ -33,9 +35,14 @@ class lyhDemo extends Command
33 protected $description = '更新路由'; 35 protected $description = '更新路由';
34 36
35 public function handle(){ 37 public function handle(){
36 - $projectModel = new Project();  
37 - $noticeModel = new NoticeLog();  
38 - $lists = $projectModel->list(['from_order_id'=>null]); 38 + $projectBuildModel = new DeployBuild();
  39 + $projectList = $projectBuildModel->list(['plan'=>0,'seo_plan'=>1],'project_id');
  40 + foreach ($projectList as $val){
  41 + if(!empty($val['service_duration']) && empty($val['seo_service_duration'])){
  42 + $projectBuildModel->edit(['seo_service_duration'=>$val['service_duration']],['id'=>$val['id']]);
  43 + echo '项目id:'.$val['project_id'].PHP_EOL;
  44 + }
  45 + }
39 return true; 46 return true;
40 } 47 }
41 } 48 }
@@ -9,6 +9,7 @@ namespace App\Console\Commands\Monitor; @@ -9,6 +9,7 @@ namespace App\Console\Commands\Monitor;
9 9
10 use App\Models\Domain\DomainInfo; 10 use App\Models\Domain\DomainInfo;
11 use App\Models\Product\Keyword; 11 use App\Models\Product\Keyword;
  12 +use App\Models\Project\DeployOptimize;
12 use App\Models\Project\OnlineCheck; 13 use App\Models\Project\OnlineCheck;
13 use App\Models\Project\Project; 14 use App\Models\Project\Project;
14 use App\Repositories\ToolRepository; 15 use App\Repositories\ToolRepository;
@@ -259,9 +260,29 @@ class Supervisory extends Command @@ -259,9 +260,29 @@ class Supervisory extends Command
259 file_put_contents(storage_path('data/robots/' . date('Ymd'). 'log.json'), json_encode($tmp, 256)); 260 file_put_contents(storage_path('data/robots/' . date('Ymd'). 'log.json'), json_encode($tmp, 256));
260 unset($tmp); 261 unset($tmp);
261 262
  263 + // 所有路由
262 $domain = array_column($spot_projects, 'domain'); 264 $domain = array_column($spot_projects, 'domain');
263 $domain = array_unique(array_filter($domain)); 265 $domain = array_unique(array_filter($domain));
264 266
  267 + // 通知对应优化师
  268 + $tmp = [];
  269 + foreach ($spot_projects as $item) {
  270 + $tmp[$item['domain']] = $item['project_id'];
  271 + }
  272 + $project_ids = array_column($spot_projects, 'project_id');
  273 + $optimist = DeployOptimize::leftJoin('gl_manage', 'gl_project_deploy_optimize.optimist_mid', '=', 'gl_manage.id')
  274 + ->whereIn('project_id', $project_ids)
  275 + ->pluck('mobile', 'project_id')
  276 + ->toArray();
  277 +
  278 + $notice = [];
  279 + $all_url = array_merge($error_url, $error, $page_404, $tdk_error);
  280 + foreach ($all_url as $url) {
  281 + if (FALSE == empty($optimist[$tmp[parse_url($url, PHP_URL_HOST)]]))
  282 + $notice[] = '86' . $optimist[$tmp[parse_url($url, PHP_URL_HOST)]];
  283 + }
  284 + $notice = array_filter(array_unique($notice));
  285 +
265 $message[] = '开启robots项目数:' . count($robots_ids); 286 $message[] = '开启robots项目数:' . count($robots_ids);
266 $message[] = '关闭robots项目:' . ($close_ids ? implode(',', $close_ids) : '无'); 287 $message[] = '关闭robots项目:' . ($close_ids ? implode(',', $close_ids) : '无');
267 $message[] = '抽查项目数量: ' . count($domain); 288 $message[] = '抽查项目数量: ' . count($domain);
@@ -282,6 +303,7 @@ class Supervisory extends Command @@ -282,6 +303,7 @@ class Supervisory extends Command
282 'keyword' => '项目数据推送', 303 'keyword' => '项目数据推送',
283 'msg' => $msg, 304 'msg' => $msg,
284 'isAtAll' => false, // 是否@所有人 305 'isAtAll' => false, // 是否@所有人
  306 + 'atMobiles' => $notice
285 ]; 307 ];
286 $dingService->handle($body, $link); 308 $dingService->handle($body, $link);
287 } 309 }
@@ -2,12 +2,11 @@ @@ -2,12 +2,11 @@
2 2
3 namespace App\Console\Commands\RankData; 3 namespace App\Console\Commands\RankData;
4 4
5 -use App\Helper\QuanqiusouApi; 5 +
  6 +use App\Http\Logic\Bside\RankData\RankDataLogic;
6 use App\Models\RankData\RankDataLog as RankDataLogModel; 7 use App\Models\RankData\RankDataLog as RankDataLogModel;
7 -use App\Models\Project\DeployOptimize; 8 +use App\Models\Domain\DomainInfo;
8 use App\Models\Project\Project; 9 use App\Models\Project\Project;
9 -use Illuminate\Support\Facades\Cache;  
10 -use Illuminate\Support\Facades\DB;  
11 use Illuminate\Support\Facades\Log; 10 use Illuminate\Support\Facades\Log;
12 11
13 /** 12 /**
@@ -49,8 +48,7 @@ class RankData extends BaseCommands @@ -49,8 +48,7 @@ class RankData extends BaseCommands
49 Cache::set('clear_remain_today_' . date('Y-m-d'), 1, 24 * 3600); 48 Cache::set('clear_remain_today_' . date('Y-m-d'), 1, 24 * 3600);
50 } 49 }
51 50
52 - $projectModel = new Project();  
53 - $list = $projectModel->leftJoin('gl_project_deploy_optimize', 'gl_project.id', '=', 'gl_project_deploy_optimize.project_id') 51 + $list = Project::leftJoin('gl_project_deploy_optimize', 'gl_project.id', '=', 'gl_project_deploy_optimize.project_id')
54 ->where('gl_project.extend_type',0) 52 ->where('gl_project.extend_type',0)
55 ->where('gl_project.delete_status',0) 53 ->where('gl_project.delete_status',0)
56 ->where('gl_project_deploy_optimize.api_no', '>', 0) 54 ->where('gl_project_deploy_optimize.api_no', '>', 0)
@@ -79,6 +77,22 @@ class RankData extends BaseCommands @@ -79,6 +77,22 @@ class RankData extends BaseCommands
79 RankDataLogModel::addTask($item['project_id'], $item['api_no'], $lang); 77 RankDataLogModel::addTask($item['project_id'], $item['api_no'], $lang);
80 } 78 }
81 } 79 }
  80 +
  81 + //白帽SEO版
  82 + $list = Project::leftJoin('gl_project_deploy_build', 'gl_project.id', '=', 'gl_project_deploy_build.project_id')
  83 + ->where('gl_project.delete_status',0)
  84 + ->where('gl_project_deploy_build.seo_plan', 1)
  85 + ->whereIn('gl_project.type',[2,3,4])
  86 + ->orderBy('gl_project.id', 'asc')
  87 + ->pluck('gl_project.id')->toArray();
  88 + foreach ($list as $project_id){
  89 + $domain = DomainInfo::getCacheInfoByProjectId($project_id);
  90 + $id = RankDataLogic::instance()->getBmSeoProjects($domain['domain']);
  91 + if(!$id){
  92 + continue;
  93 + }
  94 + RankDataLogModel::addTask($project_id, $id . '_bmseo');
  95 + }
82 } catch (\Exception|\Throwable $e) { 96 } catch (\Exception|\Throwable $e) {
83 Log::channel('rank_data')->error('排名数据任务失败 ' . $e->getMessage()); 97 Log::channel('rank_data')->error('排名数据任务失败 ' . $e->getMessage());
84 } 98 }
@@ -13,6 +13,7 @@ use App\Models\Project\Project; @@ -13,6 +13,7 @@ use App\Models\Project\Project;
13 use Illuminate\Support\Facades\Cache; 13 use Illuminate\Support\Facades\Cache;
14 use Illuminate\Support\Facades\Log; 14 use Illuminate\Support\Facades\Log;
15 use Illuminate\Support\Facades\Redis; 15 use Illuminate\Support\Facades\Redis;
  16 +use Illuminate\Support\Str;
16 17
17 /** 18 /**
18 * Class GoogleRank 19 * Class GoogleRank
@@ -76,8 +77,13 @@ class RankDataLog extends BaseCommands @@ -76,8 +77,13 @@ class RankDataLog extends BaseCommands
76 $log->data = Arr::s2a($res); 77 $log->data = Arr::s2a($res);
77 //保存数据 78 //保存数据
78 $this->output('保存排名数据:ID'.$log->project_id . ',APINO' . $log->api_no); 79 $this->output('保存排名数据:ID'.$log->project_id . ',APINO' . $log->api_no);
79 - $is_compliance = (new RankDataLogic())->save_rank($log->project_id, $log->api_no, $res, null, $log->lang);  
80 - $log->is_compliance = $is_compliance; 80 + if(Str::endsWith($log->api_no, '_bmseo')){
  81 + //白帽版
  82 + (new RankDataLogic())->save_rank_bmseo($log->project_id, $log->api_no, $res);
  83 + }else{
  84 + $is_compliance = (new RankDataLogic())->save_rank($log->project_id, $log->api_no, $res, null, $log->lang);
  85 + $log->is_compliance = $is_compliance;
  86 + }
81 $log->status = 1; 87 $log->status = 1;
82 $log->save(); 88 $log->save();
83 89
@@ -143,7 +143,8 @@ class FormGlobalsoApi @@ -143,7 +143,8 @@ class FormGlobalsoApi
143 */ 143 */
144 public function submitInquiry($ip, $referer, $submit_at, $data, $traffic = 0) 144 public function submitInquiry($ip, $referer, $submit_at, $data, $traffic = 0)
145 { 145 {
146 - $api_url = $this->url . '/api/external-interface/add/fa043f9cbec6b38f'; 146 +// $api_url = $this->url;
  147 + $api_url = 'https://form.globalso.com/api/external-interface/add/fa043f9cbec6b38f';
147 148
148 $data['ip'] = $ip; 149 $data['ip'] = $ip;
149 $data['token'] = md5($referer . $data['name'] . $ip . date("Y-m-d")); 150 $data['token'] = md5($referer . $data['name'] . $ip . date("Y-m-d"));
@@ -839,7 +839,7 @@ function getCustomRouteMap($module_route,$route = '') @@ -839,7 +839,7 @@ function getCustomRouteMap($module_route,$route = '')
839 if($module_route == $route){ 839 if($module_route == $route){
840 $resultRoute = $route; 840 $resultRoute = $route;
841 }else{ 841 }else{
842 - $resultRoute = $module_route.'_catelog/'.$route; 842 + $resultRoute = $module_route.'_catalog/'.$route;
843 } 843 }
844 return $resultRoute; 844 return $resultRoute;
845 } 845 }
@@ -147,8 +147,8 @@ class OptimizeController extends BaseController @@ -147,8 +147,8 @@ class OptimizeController extends BaseController
147 $data = APublicModel::getNumByProjectId($item['id']); 147 $data = APublicModel::getNumByProjectId($item['id']);
148 } 148 }
149 $manageModel = new ManageHr(); 149 $manageModel = new ManageHr();
150 - $plan = Project::planMap();  
151 - $seo_plan = Project::seoMap(); 150 +// $plan = Project::planMap();
  151 +// $seo_plan = Project::seoMap();
152 $item['channel'] = Channel::getChannelText($item['channel']['user_id'] ?? 0); 152 $item['channel'] = Channel::getChannelText($item['channel']['user_id'] ?? 0);
153 $item['build_leader'] = $manageModel->getName($item['leader_mid']); 153 $item['build_leader'] = $manageModel->getName($item['leader_mid']);
154 $item['build_manager'] = $manageModel->getName($item['manager_mid']); 154 $item['build_manager'] = $manageModel->getName($item['manager_mid']);
@@ -159,8 +159,6 @@ class OptimizeController extends BaseController @@ -159,8 +159,6 @@ class OptimizeController extends BaseController
159 $item['optimize_assist'] = $manageModel->getName($item['optimize_assist_mid']); 159 $item['optimize_assist'] = $manageModel->getName($item['optimize_assist_mid']);
160 $item['optimize_tech'] = $manageModel->getName($item['optimize_tech_mid']); 160 $item['optimize_tech'] = $manageModel->getName($item['optimize_tech_mid']);
161 $item['quality_mid_name'] = $manageModel->getName($item['quality_mid']); 161 $item['quality_mid_name'] = $manageModel->getName($item['quality_mid']);
162 - $item['plan'] = $plan[$item['plan']] ?? 0;  
163 - $item['seo_plan'] = $seo_plan[$item['plan']] ?? 0;  
164 $item['created_at'] = date('Y年m月d日', strtotime($item['cooperate_date'])); 162 $item['created_at'] = date('Y年m月d日', strtotime($item['cooperate_date']));
165 $item['autologin_code'] = getAutoLoginCode($item['id']); 163 $item['autologin_code'] = getAutoLoginCode($item['id']);
166 $item['domain'] = 'https://'.$item['domain'].'/'; 164 $item['domain'] = 'https://'.$item['domain'].'/';
@@ -194,6 +192,7 @@ class OptimizeController extends BaseController @@ -194,6 +192,7 @@ class OptimizeController extends BaseController
194 'gl_project.finish_remain_day AS finish_remain_day', 192 'gl_project.finish_remain_day AS finish_remain_day',
195 'gl_project.is_remain_today AS is_remain_today', 193 'gl_project.is_remain_today AS is_remain_today',
196 'gl_project.remain_day AS remain_day', 194 'gl_project.remain_day AS remain_day',
  195 + 'gl_project.seo_remain_day AS seo_remain_day',
197 'gl_project.robots AS robots', 196 'gl_project.robots AS robots',
198 'gl_project.is_minor_languages AS is_minor_languages', 197 'gl_project.is_minor_languages AS is_minor_languages',
199 'gl_project.is_translate AS is_translate', 198 'gl_project.is_translate AS is_translate',
@@ -69,6 +69,7 @@ class RenewProjectController extends BaseController @@ -69,6 +69,7 @@ class RenewProjectController extends BaseController
69 } 69 }
70 $map['extend_type'] = 0; 70 $map['extend_type'] = 0;
71 $map['remain_day'] = ['<=',15]; 71 $map['remain_day'] = ['<=',15];
  72 + $map['seo_remain_day'] = ['<=',15];
72 return $map; 73 return $map;
73 } 74 }
74 75
@@ -142,6 +143,7 @@ class RenewProjectController extends BaseController @@ -142,6 +143,7 @@ class RenewProjectController extends BaseController
142 if($item['type'] != Project::TYPE_ZERO){ 143 if($item['type'] != Project::TYPE_ZERO){
143 $data = APublicModel::getNumByProjectId($item['id']); 144 $data = APublicModel::getNumByProjectId($item['id']);
144 } 145 }
  146 + $plan = Project::planMap();
145 $item = [ 147 $item = [
146 'id' => $item['id'], 148 'id' => $item['id'],
147 'title' => $item['title'], 149 'title' => $item['title'],
@@ -159,7 +161,7 @@ class RenewProjectController extends BaseController @@ -159,7 +161,7 @@ class RenewProjectController extends BaseController
159 'optimize_tech' => $manageModel->getName($item['deploy_optimize']['tech_mid']), //售后技术 161 'optimize_tech' => $manageModel->getName($item['deploy_optimize']['tech_mid']), //售后技术
160 'type' => $item['type'], 162 'type' => $item['type'],
161 'test_domain' => $item['deploy_build']['test_domain'] ?? 0, 163 'test_domain' => $item['deploy_build']['test_domain'] ?? 0,
162 - 'plan' =>Project::planMap()[$item['deploy_build']['plan']], 164 + 'plan' =>$plan[$item['deploy_build']['plan']] ?? '白帽seo版本',
163 'plan_id' =>$item['deploy_build']['plan'], 165 'plan_id' =>$item['deploy_build']['plan'],
164 'domain' => !empty($item['deploy_optimize']['domain']) ? $domainModel->getDomain($item['deploy_optimize']['domain']) : '', 166 'domain' => !empty($item['deploy_optimize']['domain']) ? $domainModel->getDomain($item['deploy_optimize']['domain']) : '',
165 'created_at' => date('Y年m月d日', strtotime($item['created_at'])), 167 'created_at' => date('Y年m月d日', strtotime($item['created_at'])),
@@ -13,6 +13,8 @@ use App\Enums\Common\Code; @@ -13,6 +13,8 @@ use App\Enums\Common\Code;
13 use App\Http\Controllers\Bside\BaseController; 13 use App\Http\Controllers\Bside\BaseController;
14 use App\Http\Logic\Bside\Setting\TranslateLogic; 14 use App\Http\Logic\Bside\Setting\TranslateLogic;
15 use App\Models\Blog\Blog; 15 use App\Models\Blog\Blog;
  16 +use App\Models\CustomModule\CustomModule;
  17 +use App\Models\CustomModule\CustomModuleCategory;
16 use App\Models\CustomModule\CustomModuleContent; 18 use App\Models\CustomModule\CustomModuleContent;
17 use App\Models\News\News; 19 use App\Models\News\News;
18 use App\Models\Product\Product; 20 use App\Models\Product\Product;
@@ -279,7 +281,19 @@ class TranslateController extends BaseController @@ -279,7 +281,19 @@ class TranslateController extends BaseController
279 case RouteMap::SOURCE_MODULE_CATE: 281 case RouteMap::SOURCE_MODULE_CATE:
280 $customModel = new CustomModuleContent(); 282 $customModel = new CustomModuleContent();
281 $count = $customModel->formatQuery(['category_id'=>['like','%,'.$v['source_id'].',%']])->count(); 283 $count = $customModel->formatQuery(['category_id'=>['like','%,'.$v['source_id'].',%']])->count();
282 - $this->pageSixList($data,$count,$v,3,10); 284 + //获取module_id
  285 + $customCateModel = new CustomModuleCategory();
  286 + $cateInfo = $customCateModel->read(['route'=>$v['route']],['module_id']);
  287 + if($cateInfo !== false){
  288 + $model = new CustomModule();
  289 + $moduleInfo = $model->read(['id'=>$cateInfo['module_id']],['route']);
  290 + if($moduleInfo !== false){
  291 + if($v['route'] != $moduleInfo['route']){
  292 + $v['route'] = $moduleInfo['route'].'/'.$v['route'];
  293 + }
  294 + }
  295 + }
  296 + $this->pageList($data,$count,$v,3,10);
283 break; 297 break;
284 default: 298 default:
285 $data[] = $v['route']; 299 $data[] = $v['route'];
@@ -393,7 +407,7 @@ class TranslateController extends BaseController @@ -393,7 +407,7 @@ class TranslateController extends BaseController
393 } 407 }
394 408
395 /** 409 /**
396 - * @remark : 410 + * @remark :5.0列表页路由处理
397 * @name :pageList 411 * @name :pageList
398 * @author :lyh 412 * @author :lyh
399 * @method :post 413 * @method :post
@@ -412,6 +426,15 @@ class TranslateController extends BaseController @@ -412,6 +426,15 @@ class TranslateController extends BaseController
412 } 426 }
413 $page = ceil($count / $pageNum);//向上取整 427 $page = ceil($count / $pageNum);//向上取整
414 } 428 }
  429 + if($v['source'] == RouteMap::SOURCE_NEWS_CATE){
  430 + if($v['route'] != 'news'){
  431 + $v['route'] = RouteMap::PATH_NEWS_CATE.'/'.$v['route'];
  432 + }
  433 + }elseif($v['source'] == RouteMap::SOURCE_BLOG_CATE){
  434 + if($v['route'] != 'blog'){
  435 + $v['route'] = RouteMap::PATH_BLOG_CATE.'/'.$v['route'];
  436 + }
  437 + }
415 for ($i = 1;$i <= $page;$i++){ 438 for ($i = 1;$i <= $page;$i++){
416 if($i == 1){ 439 if($i == 1){
417 $data[] = $v['route']; 440 $data[] = $v['route'];
@@ -423,7 +446,7 @@ class TranslateController extends BaseController @@ -423,7 +446,7 @@ class TranslateController extends BaseController
423 } 446 }
424 447
425 /** 448 /**
426 - * @remark : 449 + * @remark :6.0列表路由处理
427 * @name :pageList 450 * @name :pageList
428 * @author :lyh 451 * @author :lyh
429 * @method :post 452 * @method :post
@@ -63,10 +63,11 @@ class AiBlogLogic extends BaseLogic @@ -63,10 +63,11 @@ class AiBlogLogic extends BaseLogic
63 $aiBlogService->mch_id = $aiSettingInfo['mch_id']; 63 $aiBlogService->mch_id = $aiSettingInfo['mch_id'];
64 $aiBlogService->key = $aiSettingInfo['key']; 64 $aiBlogService->key = $aiSettingInfo['key'];
65 $aiBlogService->updateDetail(['task_id'=>$this->param['task_id'],'title'=>$this->param['new_title'],'thumb'=>$this->param['image'],'route'=>$this->param['route'],'author_id'=>$this->param['author_id']]); 65 $aiBlogService->updateDetail(['task_id'=>$this->param['task_id'],'title'=>$this->param['new_title'],'thumb'=>$this->param['image'],'route'=>$this->param['route'],'author_id'=>$this->param['author_id']]);
  66 + $aiBlogTaskModel = new AiBlogTask();
  67 + $aiBlogTaskModel->edit(['status'=>AiBlogTask::STATUS_RUNNING],['task_id'=>$this->param['task_id']]);//重新走拉取流程
66 }catch (\Exception $e){ 68 }catch (\Exception $e){
67 $this->fail('保存失败,请联系管理员'); 69 $this->fail('保存失败,请联系管理员');
68 } 70 }
69 - $this->sendHttpC([$this->param['route'],'top-blog']);  
70 return $this->success(); 71 return $this->success();
71 } 72 }
72 73
@@ -10,6 +10,7 @@ use App\Models\Com\UpdateNotify; @@ -10,6 +10,7 @@ use App\Models\Com\UpdateNotify;
10 use App\Models\Devops\ServerConfig; 10 use App\Models\Devops\ServerConfig;
11 use App\Models\Devops\ServersIp; 11 use App\Models\Devops\ServersIp;
12 use App\Models\Project\Project; 12 use App\Models\Project\Project;
  13 +use Illuminate\Support\Facades\Artisan;
13 use Illuminate\Support\Facades\Cache; 14 use Illuminate\Support\Facades\Cache;
14 use Illuminate\Support\Str; 15 use Illuminate\Support\Str;
15 16
@@ -59,7 +59,7 @@ class MonthCountLogic extends BaseLogic @@ -59,7 +59,7 @@ class MonthCountLogic extends BaseLogic
59 $ensTime = date('Y-m-d',time()); 59 $ensTime = date('Y-m-d',time());
60 $lists = $count->list(['date'=>['between',[$startTime,$ensTime]],'project_id'=>$this->user['project_id']],'id',['*'],'asc'); 60 $lists = $count->list(['date'=>['between',[$startTime,$ensTime]],'project_id'=>$this->user['project_id']],'id',['*'],'asc');
61 $groupedData = []; 61 $groupedData = [];
62 - foreach ($lists as $k=>$v){ 62 + foreach ($lists as $v){
63 $month = date('Y-m', strtotime($v['date'])); 63 $month = date('Y-m', strtotime($v['date']));
64 if(!isset($groupedData[$month])){ 64 if(!isset($groupedData[$month])){
65 $groupedData[$month] = []; 65 $groupedData[$month] = [];
@@ -20,6 +20,7 @@ use App\Models\RankData\ExternalLinks as ExternalLinksModel; @@ -20,6 +20,7 @@ use App\Models\RankData\ExternalLinks as ExternalLinksModel;
20 use App\Models\RankData\IndexedPages; 20 use App\Models\RankData\IndexedPages;
21 use App\Models\RankData\IndexedPages as IndexedPagesModel; 21 use App\Models\RankData\IndexedPages as IndexedPagesModel;
22 use App\Models\RankData\RankData; 22 use App\Models\RankData\RankData;
  23 +use App\Models\RankData\RankDataBmseo;
23 use App\Models\RankData\RankWeek; 24 use App\Models\RankData\RankWeek;
24 use App\Models\RankData\RankWeek as RankWeekModel; 25 use App\Models\RankData\RankWeek as RankWeekModel;
25 use App\Models\RankData\RecommDomain; 26 use App\Models\RankData\RecommDomain;
@@ -32,6 +33,7 @@ use Illuminate\Database\Eloquent\Model; @@ -32,6 +33,7 @@ use Illuminate\Database\Eloquent\Model;
32 use Illuminate\Support\Collection; 33 use Illuminate\Support\Collection;
33 use Illuminate\Support\Facades\Cache; 34 use Illuminate\Support\Facades\Cache;
34 use Illuminate\Support\Facades\Log; 35 use Illuminate\Support\Facades\Log;
  36 +use Illuminate\Support\Str;
35 37
36 class RankDataLogic extends BaseLogic 38 class RankDataLogic extends BaseLogic
37 { 39 {
@@ -193,6 +195,11 @@ class RankDataLogic extends BaseLogic @@ -193,6 +195,11 @@ class RankDataLogic extends BaseLogic
193 $data['current_api_no'] = $api_no; 195 $data['current_api_no'] = $api_no;
194 $data['current_api_source'] = $api_no == 10690 ? 'Yandex' : 'Google'; 196 $data['current_api_source'] = $api_no == 10690 ? 'Yandex' : 'Google';
195 } 197 }
  198 + $data['api_no'] = $api_no;
  199 + $bmseo_id = RankDataBmseo::where('project_id', $project_id)->value('id');
  200 + if($bmseo_id){
  201 + $data['bmseo_api_no'] = $bmseo_id . '_bmseo';
  202 + }
196 203
197 return $data; 204 return $data;
198 } 205 }
@@ -226,7 +233,12 @@ class RankDataLogic extends BaseLogic @@ -226,7 +233,12 @@ class RankDataLogic extends BaseLogic
226 $ai_projects = $this->getAiProjects()['data'] ?? []; 233 $ai_projects = $this->getAiProjects()['data'] ?? [];
227 $flg_ai = $this->getAiFlag($ai_projects, $domain); 234 $flg_ai = $this->getAiFlag($ai_projects, $domain);
228 $ai_domain = str_replace('www.', '', $this->getAiProjects($domain)['domain'] ?? ''); 235 $ai_domain = str_replace('www.', '', $this->getAiProjects($domain)['domain'] ?? '');
229 - $list = RankData::where('project_id', $project_id)->where('api_no', $api_no)->where('lang', $lang)->value('data') ?: []; 236 + if (Str::endsWith($api_no, '_bmseo')) {
  237 + $list = RankDataBmseo::where('project_id', $project_id)->where('api_no', $api_no)->where('lang', $lang)->value('data') ?: [];
  238 + } else {
  239 + $list = RankData::where('project_id', $project_id)->where('api_no', $api_no)->where('lang', $lang)->value('data') ?: [];
  240 + }
  241 +
230 $list30 = []; //排名前三十的 242 $list30 = []; //排名前三十的
231 $list30_0 = []; //排名前三十且近三天没有排名的 243 $list30_0 = []; //排名前三十且近三天没有排名的
232 $list100 = []; //排名前100的 244 $list100 = []; //排名前100的
@@ -360,6 +372,34 @@ class RankDataLogic extends BaseLogic @@ -360,6 +372,34 @@ class RankDataLogic extends BaseLogic
360 } 372 }
361 373
362 /** 374 /**
  375 + * 获取白帽seo站点项目
  376 + * @author zbj
  377 + * @date 2023/5/12
  378 + */
  379 + public function getBmSeoProjects($domain = '')
  380 + {
  381 + $key = 'weblist_bm';
  382 + $data = Cache::get($key);
  383 + if (!$data) {
  384 + $api_url = 'http://api.quanqiusou.cn/api/index/weblist_bm';
  385 + try {
  386 + $data = HttpUtils::get($api_url, ['key'=> '289c1fc81c89d79c04ed4fd72822948e']);
  387 + if ($data) {
  388 + $data = Arr::s2a($data);
  389 + Cache::put($key, $data, 4 * 3600);
  390 + }
  391 + } catch (\Exception | GuzzleException $e) {
  392 + errorLog('白帽seo站点项目获取失败', [], $e);
  393 + return false;
  394 + }
  395 + }
  396 + if ($domain) {
  397 + return array_search($domain, $data);
  398 + }
  399 + return $data;
  400 + }
  401 +
  402 + /**
363 * 获取AI站点项目 403 * 获取AI站点项目
364 * 404 *
365 * @author zbj 405 * @author zbj
@@ -622,6 +662,58 @@ class RankDataLogic extends BaseLogic @@ -622,6 +662,58 @@ class RankDataLogic extends BaseLogic
622 return $model->is_compliance; 662 return $model->is_compliance;
623 } 663 }
624 664
  665 + public function save_rank_bmseo($project_id, $api_no, $data){
  666 + $first_num = $first_page_num = $first_three_pages_num = $first_five_pages_num = $first_ten_pages_num = 0;
  667 + $first_page_without_extension_num = 0; //不算扩展词在首页的数量
  668 + $first_page_extension_num = 0; //扩展词在首页的数量
  669 + foreach ($data as &$ranks){
  670 + ksort($ranks);
  671 + $last = Arr::last($ranks);
  672 + //第一名
  673 + if($last['position'] == 1){
  674 + $first_num ++;
  675 + }
  676 + //排名第一页
  677 + if($last['position'] > 0 && $last['position'] <= 10){
  678 + $first_page_num ++;
  679 + $last['g'] == 1 && $first_page_without_extension_num++;
  680 + $last['g'] == 2 && $first_page_extension_num++;
  681 + }
  682 + //排名前三页
  683 + if($last['position'] > 0 && $last['position'] <= 30){
  684 + $first_three_pages_num ++;
  685 + }
  686 + //排名前五页
  687 + if($last['position'] > 0 && $last['position'] <= 50){
  688 + $first_five_pages_num ++;
  689 + }
  690 + //排名前十页
  691 + if($last['position'] > 0 && $last['position'] <= 100){
  692 + $first_ten_pages_num ++;
  693 + }
  694 + }
  695 + $where = [
  696 + 'project_id' => $project_id,
  697 + 'api_no' => $api_no,
  698 + ];
  699 + $model = RankDataBmseo::where($where)->first();
  700 + if(!$model){
  701 + $model = new RankDataBmseo();
  702 + }
  703 + $model->project_id = $project_id;
  704 + $model->api_no = $api_no;
  705 + $model->first_num = $first_num;
  706 + $model->first_page_num = $first_page_num;
  707 + $model->first_three_pages_num = $first_three_pages_num;
  708 + $model->first_five_pages_num = $first_five_pages_num;
  709 + $model->first_ten_pages_num = $first_ten_pages_num;
  710 + $model->data = $data;
  711 + $model->updated_date = date('Y-m-d');
  712 + $model->save();
  713 +
  714 + return true;
  715 + }
  716 +
625 /** 717 /**
626 * @remark :g_top 718 * @remark :g_top
627 * @name :g_top_plan 719 * @name :g_top_plan
@@ -10,6 +10,7 @@ use App\Models\RouteMap\RouteMap; @@ -10,6 +10,7 @@ use App\Models\RouteMap\RouteMap;
10 use App\Services\ProjectServer; 10 use App\Services\ProjectServer;
11 use Illuminate\Database\Eloquent\SoftDeletes; 11 use Illuminate\Database\Eloquent\SoftDeletes;
12 use Illuminate\Support\Facades\DB; 12 use Illuminate\Support\Facades\DB;
  13 +use Illuminate\Support\Str;
13 14
14 class Keyword extends Base 15 class Keyword extends Base
15 { 16 {
@@ -136,6 +137,18 @@ class Keyword extends Base @@ -136,6 +137,18 @@ class Keyword extends Base
136 foreach ($suffix_array as $suffix) { 137 foreach ($suffix_array as $suffix) {
137 array_push($result, trim($keyword . $suffix)); 138 array_push($result, trim($keyword . $suffix));
138 array_push($result, trim($prefix . $keyword . $suffix)); 139 array_push($result, trim($prefix . $keyword . $suffix));
  140 +
  141 + // 复数形式, 需要将单数的词也拼接上
  142 + if (Str::contains($suffix, ['Products', 'Exporters', 'Suppliers', 'Manufacturers'])) {
  143 + $suffix = trim($suffix, 's');
  144 + array_push($result, trim($keyword . $suffix));
  145 + array_push($result, trim($prefix . $keyword . $suffix));
  146 + }
  147 + if (Str::contains($suffix, [ 'Companies', 'Factories'])) {
  148 + $suffix = trim($suffix, 'ies');
  149 + array_push($result, trim($keyword . $suffix . 'y'));
  150 + array_push($result, trim($prefix . $keyword . $suffix . 'y'));
  151 + }
139 } 152 }
140 } catch (\Exception $e) { 153 } catch (\Exception $e) {
141 continue; 154 continue;
  1 +<?php
  2 +
  3 +namespace App\Models\RankData;
  4 +
  5 +
  6 +use App\Helper\Arr;
  7 +use App\Models\Base;
  8 +
  9 +/**
  10 + * Class GoogleRank
  11 + * @package App\Models
  12 + * @author zbj
  13 + * @date 2023/5/6
  14 + */
  15 +class RankDataBmseo extends Base
  16 +{
  17 + //设置关联表名
  18 + protected $table = 'gl_rank_data_bmseo';
  19 +
  20 + public static function gMap(){
  21 + return [
  22 + 1 => '主关键词',
  23 + 2 => '拓展关键词',
  24 + 3 => '小语种关键词',
  25 + ];
  26 + }
  27 +
  28 + public function setDataAttribute($value)
  29 + {
  30 + $this->attributes['data'] = Arr::a2s($value);
  31 + }
  32 +
  33 + public function getDataAttribute($value)
  34 + {
  35 + return Arr::s2a($value);
  36 + }
  37 +
  38 +}
@@ -39,7 +39,7 @@ class DingService @@ -39,7 +39,7 @@ class DingService
39 'content' => $body['keyword'] . PHP_EOL . $body['msg'] 39 'content' => $body['keyword'] . PHP_EOL . $body['msg']
40 ], 40 ],
41 'at' => [ 41 'at' => [
42 - 'atMobiles' => [], 42 + 'atMobiles' => $body['atMobiles'],
43 'atUserIds' => [], 43 'atUserIds' => [],
44 'isAtAll' => $body['isAtAll'], 44 'isAtAll' => $body['isAtAll'],
45 ] 45 ]