作者 赵彬吉
@@ -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,8 +97,29 @@ class RemainDay extends Command @@ -97,8 +97,29 @@ 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 $seo_remain_day = $deploy_build['seo_service_duration'] - floor($diff / (60 * 60 * 24));
@@ -110,45 +131,54 @@ class RemainDay extends Command @@ -110,45 +131,54 @@ class RemainDay extends Command
110 } 131 }
111 if($deploy_build['plan'] == 0 && $seo_remain_day == 0 && $deploy_build['seo_service_duration'] != 0){//只有白帽版本的项目且剩余服务时常未0,放入未续费中 132 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']]); 133 $this->project->edit(['seo_remain_day'=>$seo_remain_day,'extend_type'=>Project::TYPE_FIVE],['id'=>$item['id']]);
113 - continue; 134 + }else{
  135 + //同时包括白帽版本+默认版本的项目
  136 + $this->project->edit(['seo_remain_day'=>$seo_remain_day],['id'=>$item['id']]);
114 } 137 }
115 - //同时包括白帽版本+默认版本的项目  
116 - $this->project->edit(['seo_remain_day'=>$seo_remain_day],['id'=>$item['id']]);  
117 } 138 }
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; 139 + }
  140 + return true;
  141 + }
129 142
130 - }else{  
131 - $compliance_day = ($item['finish_remain_day'] ?? 0);  
132 - $remain_day = $deploy_build['service_duration'] - $compliance_day; 143 + /**
  144 + * @remark :普通版本剩余服务时常
  145 + * @name :RemainDay
  146 + * @author :lyh
  147 + * @method :post
  148 + * @time :2025/4/25 14:31
  149 + */
  150 + public function remainDay($item,$deploy_build){
  151 + //默认版本计算剩余服务时常
  152 + if($item['type'] == Project::TYPE_TWO || $item['type'] == Project::TYPE_FOUR){
  153 + if(in_array($item['id'],$this->projectId)){//已开始优化的时间结算
  154 + $optimizeModel = new DeployOptimize();
  155 + $opInfo = $optimizeModel->read(['project_id'=>$item['id']],['start_date']);
  156 + if($opInfo === false){
  157 + return true;
133 } 158 }
  159 + $diff = time() - strtotime($opInfo['start_date'] ?? $item['uptime']);
  160 + $compliance_day = floor($diff / (60 * 60 * 24));
  161 + $remain_day = $deploy_build['service_duration'] - $compliance_day;
134 }else{ 162 }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 - } 163 + $compliance_day = ($item['finish_remain_day'] ?? 0);
  164 + $remain_day = $deploy_build['service_duration'] - $compliance_day;
143 } 165 }
144 - $extend_type = 0;  
145 - if($remain_day < 0 && $deploy_build['service_duration'] != 0){  
146 - $remain_day = 0;  
147 - $extend_type = Project::TYPE_FIVE; 166 + }else{
  167 + //普通建站项目
  168 + if($item['uptime']){
  169 + $diff = time() - strtotime($item['uptime']);
  170 + $compliance_day = floor($diff / (60 * 60 * 24));
  171 + $remain_day = $deploy_build['service_duration'] - $compliance_day;
  172 + }else{
  173 + $remain_day = $deploy_build['service_duration'];
148 } 174 }
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 } 175 }
  176 + $extend_type = 0;
  177 + if($remain_day < 0 && $deploy_build['service_duration'] != 0){
  178 + $remain_day = 0;
  179 + $extend_type = Project::TYPE_FIVE;
  180 + }
  181 + $this->project->edit(['remain_day'=>$remain_day,'extend_type'=>$extend_type,'finish_remain_day'=>$compliance_day ?? 0],['id'=>$item['id']]);
152 return true; 182 return true;
153 } 183 }
154 } 184 }
@@ -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 }
@@ -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',
@@ -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
@@ -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] = [];
@@ -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;
@@ -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 ]