作者 赵彬吉
@@ -256,7 +256,7 @@ class AiBlogTask extends Command @@ -256,7 +256,7 @@ class AiBlogTask extends Command
256 $page = 1; 256 $page = 1;
257 $saveData = []; 257 $saveData = [];
258 $result = $aiBlogService->getAiBlogList($page,15); 258 $result = $aiBlogService->getAiBlogList($page,15);
259 - if(!isset($result['status']) && $result['status'] != 200){ 259 + if(!isset($result['status']) || $result['status'] != 200){
260 return true; 260 return true;
261 } 261 }
262 $total_page = $result['data']['total_page']; 262 $total_page = $result['data']['total_page'];
@@ -109,6 +109,16 @@ class DomainInfo extends Command @@ -109,6 +109,16 @@ class DomainInfo extends Command
109 $v->save(); 109 $v->save();
110 } 110 }
111 111
  112 + if (empty($v['domain_end_time']) || $v['domain_end_time'] < date('Y-m-d H:i:s')) {
  113 + //获取主站域名有效期并更新
  114 + $valid_time = $this->getDomainValidTime($v['domain']);
  115 + if ($valid_time['start'] && $valid_time['end']) {
  116 + $v->domain_start_time = $valid_time['start'];
  117 + $v->domain_end_time = $valid_time['end'];
  118 + $v->save();
  119 + }
  120 + }
  121 +
112 if ($v['amp_status'] == 1) { 122 if ($v['amp_status'] == 1) {
113 $domain_array = parse_url($v['domain']); 123 $domain_array = parse_url($v['domain']);
114 $host = $domain_array['host'] ?? $domain_array['path']; 124 $host = $domain_array['host'] ?? $domain_array['path'];
@@ -332,4 +342,24 @@ class DomainInfo extends Command @@ -332,4 +342,24 @@ class DomainInfo extends Command
332 } 342 }
333 return ['from' => $valid_from, 'to' => $valid_to]; 343 return ['from' => $valid_from, 'to' => $valid_to];
334 } 344 }
  345 +
  346 + /**
  347 + * 获取域名有效时间
  348 + * @param $domain
  349 + * @return array
  350 + * @author Akun
  351 + * @date 2024/08/29 9:43
  352 + */
  353 + public function getDomainValidTime($domain)
  354 + {
  355 + $url = 'http://openai.waimaoq.com/v1/whois_api?domain=' . $domain;
  356 + $response = curlGet($url);
  357 + $start = '';
  358 + $end = '';
  359 + if (isset($response['code']) && $response['code'] == 200) {
  360 + $start = $response['text']['creation_date'] != 'None' ? $response['text']['creation_date'] : '';
  361 + $end = $response['text']['expiration_date'] != 'None' ? $response['text']['expiration_date'] : '';
  362 + }
  363 + return ['start' => $start, 'end' => $end];
  364 + }
335 } 365 }
@@ -121,6 +121,7 @@ class RemainDay extends Command @@ -121,6 +121,7 @@ class RemainDay extends Command
121 if($deploy_build['seo_plan'] == 1){ 121 if($deploy_build['seo_plan'] == 1){
122 if($deploy_build['seo_service_duration'] != 0){ 122 if($deploy_build['seo_service_duration'] != 0){
123 if(in_array($item['id'],$this->bm_projectId)){ 123 if(in_array($item['id'],$this->bm_projectId)){
  124 + $compliance_day = (int)$item['bm_finish_remain_day'];
124 $seo_remain_day = $deploy_build['seo_service_duration'] - (int)$item['bm_finish_remain_day']; 125 $seo_remain_day = $deploy_build['seo_service_duration'] - (int)$item['bm_finish_remain_day'];
125 }else{ 126 }else{
126 //按自然日统计 127 //按自然日统计
@@ -133,7 +134,7 @@ class RemainDay extends Command @@ -133,7 +134,7 @@ class RemainDay extends Command
133 $this->project->edit(['seo_remain_day'=>$seo_remain_day,'bm_finish_remain_day'=>$compliance_day ?? 0],['id'=>$item['id']]); 134 $this->project->edit(['seo_remain_day'=>$seo_remain_day,'bm_finish_remain_day'=>$compliance_day ?? 0],['id'=>$item['id']]);
134 }else{ 135 }else{
135 //同时包括白帽版本+默认版本的项目 136 //同时包括白帽版本+默认版本的项目
136 - $this->project->edit(['seo_remain_day'=>$seo_remain_day],['id'=>$item['id']]); 137 + $this->project->edit(['seo_remain_day'=>$seo_remain_day,'bm_finish_remain_day'=>$compliance_day ?? 0],['id'=>$item['id']]);
137 } 138 }
138 } 139 }
139 } 140 }
@@ -99,7 +99,7 @@ class GeoQuestionRes extends Command @@ -99,7 +99,7 @@ class GeoQuestionRes extends Command
99 $data = $geo_service->getDeepSeekResult($question); 99 $data = $geo_service->getDeepSeekResult($question);
100 $result = $this->dealDeepSeek($data); 100 $result = $this->dealDeepSeek($data);
101 break; 101 break;
102 - case 'gpt-4o-mini': 102 + case 'openai-not-network':
103 $data = $geo_service->getDeepSeekResult($question,'gpt-4o-mini'); 103 $data = $geo_service->getDeepSeekResult($question,'gpt-4o-mini');
104 $result = $this->dealDeepSeek($data,'gpt-4o-mini'); 104 $result = $this->dealDeepSeek($data,'gpt-4o-mini');
105 break; 105 break;
@@ -21,6 +21,7 @@ use App\Models\Project\ProjectWhiteHatAffix; @@ -21,6 +21,7 @@ use App\Models\Project\ProjectWhiteHatAffix;
21 use App\Models\Template\BTemplateMain; 21 use App\Models\Template\BTemplateMain;
22 use App\Models\Template\TemplateTypeMain; 22 use App\Models\Template\TemplateTypeMain;
23 use App\Services\AiBlogService; 23 use App\Services\AiBlogService;
  24 +use App\Services\Geo\GeoService;
24 use App\Services\ProjectServer; 25 use App\Services\ProjectServer;
25 use Illuminate\Console\Command; 26 use Illuminate\Console\Command;
26 use Illuminate\Support\Facades\DB; 27 use Illuminate\Support\Facades\DB;
@@ -53,22 +54,25 @@ class lyhDemo extends Command @@ -53,22 +54,25 @@ class lyhDemo extends Command
53 * @time :2025/7/22 15:14 54 * @time :2025/7/22 15:14
54 */ 55 */
55 public function _actionRoute(){ 56 public function _actionRoute(){
56 - $projectModel = new Project();  
57 - $lists = $projectModel->list(['delete_status' => 0,'project_type'=>0,'extend_type'=>0,'type'=>['in',[2,3,4,6]]], 'id', ['id']);  
58 - $data = [];  
59 - foreach ($lists as $item){  
60 - echo date('Y-m-d H:i:s') . '开始--项目的id:'. $item['id'] . PHP_EOL;  
61 - ProjectServer::useProject($item['id']);  
62 - $aiBlogModel = new AiBlog();  
63 - $info = $aiBlogModel->read(['route'=>null],['id']);  
64 - if($info !== false){  
65 - echo '项目id:'.$item['id'].PHP_EOL;  
66 - $data[] = $item['id'];  
67 - }  
68 - dd($data);  
69 - echo 'end';  
70 - DB::disconnect('custom_mysql');  
71 - } 57 + $geo_service = new GeoService();
  58 + $data = $geo_service->getDeepSeekResult("创贸总共多少人?",'gpt-4o-mini');
  59 + dd($data);
  60 +// $projectModel = new Project();
  61 +// $lists = $projectModel->list(['delete_status' => 0,'project_type'=>0,'extend_type'=>0,'type'=>['in',[2,3,4,6]]], 'id', ['id']);
  62 +// $data = [];
  63 +// foreach ($lists as $item){
  64 +// echo date('Y-m-d H:i:s') . '开始--项目的id:'. $item['id'] . PHP_EOL;
  65 +// ProjectServer::useProject($item['id']);
  66 +// $aiBlogModel = new AiBlog();
  67 +// $info = $aiBlogModel->read(['route'=>null],['id']);
  68 +// if($info !== false){
  69 +// echo '项目id:'.$item['id'].PHP_EOL;
  70 +// $data[] = $item['id'];
  71 +// }
  72 +// dd($data);
  73 +// echo 'end';
  74 +// DB::disconnect('custom_mysql');
  75 +// }
72 } 76 }
73 77
74 public function _actionTemplateMain(){ 78 public function _actionTemplateMain(){
@@ -151,12 +151,13 @@ class SyncProject extends Command @@ -151,12 +151,13 @@ class SyncProject extends Command
151 'contract' => json_encode($param['files']), 151 'contract' => json_encode($param['files']),
152 'bill' => json_encode($param['images']), 152 'bill' => json_encode($param['images']),
153 ]; 153 ];
154 - if($param['plan_marketing'] == '白帽SEO方案'){  
155 - $data['seo_service_duration'] = $param['years'] ?? 0;  
156 - $data['seo_plan'] = 1;  
157 - }else{  
158 - $data['service_duration'] = $param['years'] ?? 0;  
159 - $data['plan'] = $this->versionData($param['plan_marketing']); 154 + $seoPlan = Project::seoMap();
  155 + if (in_array($param['plan_marketing'], $seoPlan)) {
  156 + $data['deploy_build']['seo_service_duration'] = $param['years'] ?? 0;
  157 + $data['deploy_build']['seo_plan'] = $this->versionSeoData($param['plan_marketing'],$seoPlan);
  158 + } else {
  159 + $data['deploy_build']['service_duration'] = $param['years'] ?? 0;
  160 + $data['deploy_build']['plan'] = $this->versionData($param['plan_marketing']);
160 } 161 }
161 $renewModel = new ProjectRenew(); 162 $renewModel = new ProjectRenew();
162 $rs = $renewModel->add($data); 163 $rs = $renewModel->add($data);
@@ -183,8 +184,7 @@ class SyncProject extends Command @@ -183,8 +184,7 @@ class SyncProject extends Command
183 } 184 }
184 } 185 }
185 186
186 - public function versionSeoData($param){  
187 - $data = Project::seoMap(); 187 + public function versionSeoData($param,$data){
188 $data = array_flip($data); 188 $data = array_flip($data);
189 if(isset($data[$param])){ 189 if(isset($data[$param])){
190 return $data[$param]; 190 return $data[$param];
@@ -240,10 +240,11 @@ class SyncProject extends Command @@ -240,10 +240,11 @@ class SyncProject extends Command
240 'bill'=>$param['images'] 240 'bill'=>$param['images']
241 ], 241 ],
242 ]; 242 ];
243 - if($param['plan_marketing'] == '白帽SEO方案'){ 243 + $seoPlan = Project::seoMap();
  244 + if (in_array($param['plan_marketing'], $seoPlan)) {
244 $data['deploy_build']['seo_service_duration'] = $param['years'] ?? 0; 245 $data['deploy_build']['seo_service_duration'] = $param['years'] ?? 0;
245 - $data['deploy_build']['seo_plan'] = $this->versionSeoData($param['plan_marketing']);  
246 - }else{ 246 + $data['deploy_build']['seo_plan'] = $this->versionSeoData($param['plan_marketing'],$seoPlan);
  247 + } else {
247 $data['deploy_build']['service_duration'] = $param['years'] ?? 0; 248 $data['deploy_build']['service_duration'] = $param['years'] ?? 0;
248 $data['deploy_build']['plan'] = $this->versionData($param['plan_marketing']); 249 $data['deploy_build']['plan'] = $this->versionData($param['plan_marketing']);
249 } 250 }
@@ -82,9 +82,9 @@ class FetchTicketProjects extends Command @@ -82,9 +82,9 @@ class FetchTicketProjects extends Command
82 elseif ($item['cate'] == "建站中") 82 elseif ($item['cate'] == "建站中")
83 $status=1; // 建站中 83 $status=1; // 建站中
84 84
85 - $assm_id = Manage::where('name', $item['assm'])->value('id') ?? Manage::where('name', '张鸿飞')->value('id') ?? 0; //售后服务经理  
86 - $seom_id = Manage::where('name', $item['yhs'])->value('id') ?? Manage::where('name', '陶婵')->value('id') ?? 0; //优化师  
87 - $pm_id = Manage::where('name', $item['pm'])->value('id') ?? Manage::where('name', '李洁玉')->value('id') ?? 0; // 项目经理 85 + $assm_id = ManageHr::where('name', $item['assm'])->where('status', 1)->value('manage_id') ?? ManageHr::where('name', '张鸿飞')->where('status', 1)->value('manage_id') ?? 0; //售后服务经理
  86 + $seom_id = ManageHr::where('name', $item['yhs'])->where('status', 1)->value('manage_id') ?? ManageHr::where('name', '陶婵')->where('status', 1)->value('manage_id') ?? 0; //优化师
  87 + $pm_id = ManageHr::where('name', $item['pm'])->where('status', 1)->value('manage_id') ?? ManageHr::where('name', '李洁玉')->where('status', 1)->value('manage_id') ?? 0; // 项目经理
88 88
89 /** 89 /**
90 * 第一负责人逻即说明: 90 * 第一负责人逻即说明:
@@ -100,6 +100,22 @@ class FetchTicketProjects extends Command @@ -100,6 +100,22 @@ class FetchTicketProjects extends Command
100 elseif ($status == 1) 100 elseif ($status == 1)
101 $engineer_id = $pm_id; // 建站中找项目经理 101 $engineer_id = $pm_id; // 建站中找项目经理
102 102
  103 + $team_names = [
  104 + $item['pm'],
  105 + $item['assm'],
  106 + $item['yhs'],
  107 + $item['team_leader'],
  108 + $item['technology'],
  109 + $item['designer'],
  110 + $item['yhszl'],
  111 + ];
  112 + // 过滤掉空值,去掉重复
  113 + $team_ids = ManageHr::whereIn('name', $team_names)->where('status', 1)->pluck('manage_id')
  114 + ->unique()
  115 + ->filter(fn($v) => !is_null($v) && $v !== 0)
  116 + ->values()
  117 + ->toArray();
  118 +
103 $fields = [ 119 $fields = [
104 'post_id' => $item['postid'], 120 'post_id' => $item['postid'],
105 'company_name' => $item['company'], 121 'company_name' => $item['company'],
@@ -114,7 +130,8 @@ class FetchTicketProjects extends Command @@ -114,7 +130,8 @@ class FetchTicketProjects extends Command
114 'project_cate' => 1, 130 'project_cate' => 1,
115 'pm_id' => $pm_id, 131 'pm_id' => $pm_id,
116 'status' => $status, // 项目状态 132 'status' => $status, // 项目状态
117 - 'wechat_group_id' => $item['wx_id'] 133 + 'wechat_group_id' => $item['wx_id'],
  134 + 'team' => $team_ids ? json_encode($team_ids) : null,
118 ]; 135 ];
119 if (!$project) { 136 if (!$project) {
120 $new = new TicketProject(); 137 $new = new TicketProject();
@@ -186,22 +203,22 @@ class FetchTicketProjects extends Command @@ -186,22 +203,22 @@ class FetchTicketProjects extends Command
186 203
187 // 售后服务经理 204 // 售后服务经理
188 $assm_id = collect([ 205 $assm_id = collect([
189 - ManageHr::find($item->deploy_optimize->manager_mid)->manage_id ?? 0,  
190 - ManageHr::find($item->deploy_optimize->tech_leader)->manage_id ?? 0, 206 + ManageHr::where('status', 1)->find($item->deploy_optimize->manager_mid)->manage_id ?? 0,
  207 + ManageHr::where('status', 1)->find($item->deploy_optimize->tech_leader)->manage_id ?? 0,
191 8, //张鸿飞 208 8, //张鸿飞
192 ])->first(fn($v) => $v !== null && $v !== 0, 0); 209 ])->first(fn($v) => $v !== null && $v !== 0, 0);
193 210
194 // 优化师 211 // 优化师
195 - $seom_id = ManageHr::find($item->deploy_optimize->optimist_mid) ? ManageHr::find($item->deploy_optimize->optimist_mid)->manage_id : 0; 212 + $seom_id = ManageHr::where('status', 1)->find($item->deploy_optimize->optimist_mid) ? ManageHr::where('status', 1)->find($item->deploy_optimize->optimist_mid)->manage_id : 0;
196 213
197 // 项目经理 214 // 项目经理
198 - $pm_id = ManageHr::find($item->deploy_build->manager_mid)->manage_id ?? ManageHr::where('name', '李洁玉')->value('manage_id') ?? 0; 215 + $pm_id = ManageHr::where('status', 1)->find($item->deploy_build->manager_mid)->manage_id ?? ManageHr::where('status', 1)->where('name', '李洁玉')->value('manage_id') ?? 0;
199 216
200 // 第一负责人 217 // 第一负责人
201 if ($status == 1) 218 if ($status == 1)
202 $engineer_id = $pm_id; // 建站中找项目经理 219 $engineer_id = $pm_id; // 建站中找项目经理
203 elseif ($status == 2) 220 elseif ($status == 2)
204 - $engineer_id = Manage::where('name', '杨长远')->value('id') ?? 0; // 建站完成找杨长远 221 + $engineer_id = Manage::where('status', 1)->where('name', '杨长远')->value('id') ?? 0; // 建站完成找杨长远
205 else 222 else
206 $engineer_id = $assm_id; // 推广找售后服务经理 223 $engineer_id = $assm_id; // 推广找售后服务经理
207 224
@@ -212,6 +229,30 @@ class FetchTicketProjects extends Command @@ -212,6 +229,30 @@ class FetchTicketProjects extends Command
212 || $item->site_status == 1 229 || $item->site_status == 1
213 ) ? 1 : 0; 230 ) ? 1 : 0;
214 231
  232 + $team_ids_in = [
  233 + $item->deploy_build->leader_mid,
  234 + $item->deploy_build->manager_mid,
  235 + $item->deploy_build->designer_mid,
  236 + $item->deploy_build->tech_mid,
  237 + $item->deploy_optimize->manager_mid,
  238 + $item->deploy_optimize->optimist_mid,
  239 + $item->deploy_optimize->assist_mid,
  240 + $item->deploy_optimize->tech_mid,
  241 + $item->deploy_optimize->tech_leader,
  242 + ];
  243 +
  244 + // $team_ids 去重复
  245 + $team_ids_in = array_unique($team_ids_in);
  246 + $team_ids_in = array_filter($team_ids_in);
  247 + // $team_ids 去掉下标
  248 + $team_ids_in = array_values($team_ids_in);
  249 +
  250 + $team_ids = ManageHr::whereIn('manage_id', $team_ids_in)->where('status', 1)->pluck('manage_id')
  251 + ->unique()
  252 + ->filter(fn($v) => !is_null($v) && $v !== 0)
  253 + ->values()
  254 + ->toArray();
  255 +
215 $fields = [ 256 $fields = [
216 'company_name' => $item->company, 257 'company_name' => $item->company,
217 'title' => $item->title . " - V6", 258 'title' => $item->title . " - V6",
@@ -230,6 +271,7 @@ class FetchTicketProjects extends Command @@ -230,6 +271,7 @@ class FetchTicketProjects extends Command
230 ->value('friend_id'), 271 ->value('friend_id'),
231 'pm_id' => $pm_id, 272 'pm_id' => $pm_id,
232 'status' => $status, // 项目状态 273 'status' => $status, // 项目状态
  274 + 'team' => $team_ids ? json_encode($team_ids) : null,
233 ]; 275 ];
234 if (!$project) { 276 if (!$project) {
235 $project = new TicketProject(); 277 $project = new TicketProject();
@@ -289,14 +331,14 @@ class FetchTicketProjects extends Command @@ -289,14 +331,14 @@ class FetchTicketProjects extends Command
289 { 331 {
290 // 售后服务经理 332 // 售后服务经理
291 $assm_id = collect([ 333 $assm_id = collect([
292 - ManageHr::where('name', $item['cj_assm']['real_name'] ?? '')->first()->manage_id ?? 0, 334 + ManageHr::where('status', 1)->where('name', $item['cj_assm']['real_name'] ?? '')->first()->manage_id ?? 0,
293 20, //徐莹 335 20, //徐莹
294 ])->first(fn($v) => $v !== null && $v !== 0, 0); 336 ])->first(fn($v) => $v !== null && $v !== 0, 0);
295 }else 337 }else
296 { 338 {
297 // 域途 339 // 域途
298 $assm_id = collect([ 340 $assm_id = collect([
299 - ManageHr::where('name', $item['yutu_assm']['real_name'] ?? '')->first()->manage_id ?? 0, 341 + ManageHr::where('status', 1)->where('name', $item['yutu_assm']['real_name'] ?? '')->first()->manage_id ?? 0,
300 85, //黄小玉 342 85, //黄小玉
301 ])->first(fn($v) => $v !== null && $v !== 0, 0); 343 ])->first(fn($v) => $v !== null && $v !== 0, 0);
302 } 344 }
@@ -822,7 +822,7 @@ if(!function_exists('curlGet')){ @@ -822,7 +822,7 @@ if(!function_exists('curlGet')){
822 */ 822 */
823 function curlGet($url){ 823 function curlGet($url){
824 $ch1 = curl_init(); 824 $ch1 = curl_init();
825 - $timeout = 0; 825 + $timeout = 60;
826 curl_setopt($ch1, CURLOPT_URL, $url); 826 curl_setopt($ch1, CURLOPT_URL, $url);
827 curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true); 827 curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
828 curl_setopt($ch1, CURLOPT_ENCODING, ''); 828 curl_setopt($ch1, CURLOPT_ENCODING, '');
@@ -1077,17 +1077,37 @@ if (!function_exists('check_domain_record')) { @@ -1077,17 +1077,37 @@ if (!function_exists('check_domain_record')) {
1077 function check_domain_record($domain, $server_info) 1077 function check_domain_record($domain, $server_info)
1078 { 1078 {
1079 try { 1079 try {
  1080 + $is_record = false;
  1081 +
  1082 + //获取域名解析记录
1080 $records = dns_get_record($domain,DNS_A); 1083 $records = dns_get_record($domain,DNS_A);
1081 - if(count($records) != 1){  
1082 - return false; 1084 + if(count($records) == 1 && ($records[0]['host'] == $server_info['domain'] || $records[0]['ip'] == $server_info['ip'])){
  1085 + $is_record = true;
1083 } 1086 }
1084 1087
1085 - $record = $records[0];  
1086 - if($record['host'] == $server_info['domain'] || $record['ip'] == $server_info['ip']){  
1087 - return $domain;  
1088 - }else{  
1089 - return false; 1088 + if(!$is_record){
  1089 + //解析不正确,再判断是否开启cnd
  1090 + $top_domain = getTopDomain($domain);
  1091 + $cnd = curlGet('http://sitebak.globalso.com/get_records?domain=' . $top_domain);
  1092 + if (isset($cnd['data']) && $cnd['data']) {
  1093 + if($domain == $top_domain || substr($domain,0,4) == 'www.'){
  1094 + $check_domain = $domain;
  1095 + }else{
  1096 + $check_domain = '*.'.$top_domain;
  1097 + }
  1098 + foreach ($cnd['data'] as $vc) {
  1099 + if ($vc['name'] == $check_domain && $vc['type'] == 'A' && $vc['content'] == $server_info['ip']) {
  1100 + $is_record = true;
  1101 + break;
  1102 + }elseif ($vc['name'] == $check_domain && $vc['type'] == 'CNAME' && $vc['content'] == $server_info['domain']){
  1103 + $is_record = true;
  1104 + break;
  1105 + }
  1106 + }
  1107 + }
1090 } 1108 }
  1109 +
  1110 + return $is_record;
1091 }catch (\Exception $e){ 1111 }catch (\Exception $e){
1092 errorLog('dns_get_record',['domain'=>$domain],$e); 1112 errorLog('dns_get_record',['domain'=>$domain],$e);
1093 return false; 1113 return false;
@@ -1373,3 +1393,31 @@ function analysisRoute($pathInfo) @@ -1373,3 +1393,31 @@ function analysisRoute($pathInfo)
1373 } 1393 }
1374 return $router; 1394 return $router;
1375 } 1395 }
  1396 +
  1397 +function getTopDomain ($url) {
  1398 + $url = strtolower($url); //首先转成小写
  1399 + $url = mb_ereg_replace('^( | )+', '', trim($url));
  1400 + $url = mb_ereg_replace('( | )+$', '', $url);
  1401 + if (!preg_match('/^(http:\/\/|https)/', $url)) {
  1402 + $url = "https://".$url;
  1403 + }
  1404 + $hosts = parse_url($url);
  1405 + $host = $hosts['host'] ?? '';
  1406 + //查看是几级域名
  1407 + $data = explode('.', $host);
  1408 + $n = count($data);
  1409 + if ($n < 2) {
  1410 + return $host;
  1411 + }
  1412 + //判断是否是双后缀
  1413 + $preg = '/[\w].+\.(com|net|org|gov|edu|co|ne)\.[\w]/';
  1414 + if (($n > 2) && preg_match($preg, $host)) {
  1415 + //双后缀取后3位
  1416 + $host = $data[$n - 3].'.'.$data[$n - 2].'.'.$data[$n - 1];
  1417 + } else {
  1418 + //非双后缀取后两位
  1419 + $host = $data[$n - 2].'.'.$data[$n - 1];
  1420 + }
  1421 + return $host;
  1422 +}
  1423 +
@@ -78,8 +78,7 @@ class AsideTicketController extends BaseController @@ -78,8 +78,7 @@ class AsideTicketController extends BaseController
78 */ 78 */
79 public function getProjects($search) 79 public function getProjects($search)
80 { 80 {
81 - $projects = TicketProject::where('is_del', 0)  
82 - ->where(function ($query) use ($search) { 81 + $projects = TicketProject::where(function ($query) use ($search) {
83 // 查找项目名称或公司名称 82 // 查找项目名称或公司名称
84 $query->where('title', 'like', '%' . $search . '%') 83 $query->where('title', 'like', '%' . $search . '%')
85 ->orWhere('company_name', 'like', '%' . $search . '%'); 84 ->orWhere('company_name', 'like', '%' . $search . '%');
@@ -99,8 +98,7 @@ class AsideTicketController extends BaseController @@ -99,8 +98,7 @@ class AsideTicketController extends BaseController
99 $dept_id = ManageHr::where('manage_id', $this->manage['id']) 98 $dept_id = ManageHr::where('manage_id', $this->manage['id'])
100 ->value('dept_id'); 99 ->value('dept_id');
101 100
102 - $lists = TicketProject::where('is_del', 0)  
103 - ->when(($this->manage['role'] != 1 && $dept_id != 5), function ($query) use ($dept_id) { 101 + $lists = TicketProject::when(($this->manage['role'] != 1 && $dept_id != 5), function ($query) use ($dept_id) {
104 /** 102 /**
105 * 超管看所有项目 $this->manage['role']=1 103 * 超管看所有项目 $this->manage['role']=1
106 * 全球搜: 技术部ID 1、售后部ID 2 104 * 全球搜: 技术部ID 1、售后部ID 2
@@ -171,12 +169,13 @@ class AsideTicketController extends BaseController @@ -171,12 +169,13 @@ class AsideTicketController extends BaseController
171 $ticket->submit_username = $this->manage['name']; 169 $ticket->submit_username = $this->manage['name'];
172 $ticket->star = $request->input('star', 3); 170 $ticket->star = $request->input('star', 3);
173 $ticket->plan_end_at = $request->input('plan_end_at', null); 171 $ticket->plan_end_at = $request->input('plan_end_at', null);
  172 + $ticket->close_wechat = $request->input('close_wechat', false);
174 $ticket->save(); 173 $ticket->save();
175 174
176 // 分配工单参与人 175 // 分配工单参与人
177 $ticket->saveEngineers($request->input('engineer_ids', [])); 176 $ticket->saveEngineers($request->input('engineer_ids', []));
178 $nickname = ManageHr::where('manage_id', $this->manage['id'])->value('nickname') ?? mb_substr($ticket->submit_username, 0, 1) . '**'; 177 $nickname = ManageHr::where('manage_id', $this->manage['id'])->value('nickname') ?? mb_substr($ticket->submit_username, 0, 1) . '**';
179 - if ($project->wechat_switch) 178 + if ($project->wechat_switch && !$ticket->close_wechat)
180 $project->pushWechatGroupMsg("创贸({$nickname})新增了工单(ID:{$ticket->id}),请及时处理!"); 179 $project->pushWechatGroupMsg("创贸({$nickname})新增了工单(ID:{$ticket->id}),请及时处理!");
181 return $ticket; 180 return $ticket;
182 }); 181 });
@@ -237,7 +236,7 @@ class AsideTicketController extends BaseController @@ -237,7 +236,7 @@ class AsideTicketController extends BaseController
237 ->update(['status' => TicketLog::STATUS_COMPLETED, 'end_at' => now()]); 236 ->update(['status' => TicketLog::STATUS_COMPLETED, 'end_at' => now()]);
238 // 推动微信通知 237 // 推动微信通知
239 $project = $ticket->project; 238 $project = $ticket->project;
240 - if ($project->wechat_switch) 239 + if ($project->wechat_switch && !$ticket->close_wechat)
241 $project->pushWechatGroupMsg("工单(ID:{$ticket->id})已全部完成,请访问查看详情!"); 240 $project->pushWechatGroupMsg("工单(ID:{$ticket->id})已全部完成,请访问查看详情!");
242 $ticket->pushDing('finish'); 241 $ticket->pushDing('finish');
243 242
@@ -92,7 +92,7 @@ class AsideTicketLogController extends BaseController @@ -92,7 +92,7 @@ class AsideTicketLogController extends BaseController
92 $ticket->status = Tickets::STATUS_COMPLETED; 92 $ticket->status = Tickets::STATUS_COMPLETED;
93 $ticket->end_at = now(); 93 $ticket->end_at = now();
94 $project = $ticket->project; 94 $project = $ticket->project;
95 - if ($project->wechat_switch) 95 + if ($project->wechat_switch && !$ticket->close_wechat)
96 $project->pushWechatGroupMsg("工单(ID:{$ticket->id})已全部完成,请访问查看详情!"); 96 $project->pushWechatGroupMsg("工单(ID:{$ticket->id})已全部完成,请访问查看详情!");
97 $ticket->pushDing('finish'); 97 $ticket->pushDing('finish');
98 } 98 }
@@ -66,7 +66,8 @@ class TicketChatController extends BaseController @@ -66,7 +66,8 @@ class TicketChatController extends BaseController
66 $chat->save(); 66 $chat->save();
67 $project = $ticket->project; 67 $project = $ticket->project;
68 $nickname = ManageHr::where('manage_id', $this->manage['id'])->value('nickname') ?? mb_substr($ticket->submit_username, 0, 1) . '**'; 68 $nickname = ManageHr::where('manage_id', $this->manage['id'])->value('nickname') ?? mb_substr($ticket->submit_username, 0, 1) . '**';
69 - $project->pushWechatGroupMsg("创贸({$nickname})对工单(ID:{$ticket->id})进行了补充,请及时查看处理!"); 69 + if ($project->wechat_switch && !$ticket->close_wechat)
  70 + $project->pushWechatGroupMsg("创贸({$nickname})对工单(ID:{$ticket->id})进行了补充,请及时查看处理!");
70 $this->response('success', Code::SUCCESS, $chat); 71 $this->response('success', Code::SUCCESS, $chat);
71 } 72 }
72 73
@@ -93,4 +93,24 @@ class TicketProjectController extends BaseController @@ -93,4 +93,24 @@ class TicketProjectController extends BaseController
93 { 93 {
94 // 94 //
95 } 95 }
  96 +
  97 + /**
  98 + * 获取项目团队信息
  99 + *
  100 + * @param string $id 项目UUID
  101 + * @return mixed 返回项目团队信息或错误响应
  102 + */
  103 + public function team($id)
  104 + {
  105 + // 根据UUID查找项目
  106 + $project = TicketProject::where('uuid', $id)->first();
  107 +
  108 + // 如果项目不存在,返回错误响应
  109 + if (!$project) $this->response('Project not found', Code::USER_MODEL_NOTFOUND_ERROE);
  110 +
  111 + // 返回项目团队信息
  112 + // 修改: 使用 getTeam() 方法而不是 getTeam 属性
  113 + return $this->response('Project team', Code::SUCCESS, $project->getTeam());
  114 + }
  115 +
96 } 116 }
@@ -210,7 +210,7 @@ class CNoticeController extends BaseController @@ -210,7 +210,7 @@ class CNoticeController extends BaseController
210 * 更新通知C端 210 * 更新通知C端
211 * @param Request $request 211 * @param Request $request
212 * @return \Illuminate\Http\JsonResponse 212 * @return \Illuminate\Http\JsonResponse
213 - * @param : type : 1->主站更新 4->聚合页更新 7->ai博客 213 + * @param : route : 1->主站更新 4->聚合页更新 7->ai博客
214 */ 214 */
215 public function sendNotify(Request $request) 215 public function sendNotify(Request $request)
216 { 216 {
@@ -223,7 +223,7 @@ class CNoticeController extends BaseController @@ -223,7 +223,7 @@ class CNoticeController extends BaseController
223 $url = $request->input('url', []); 223 $url = $request->input('url', []);
224 $language = $request->input('language', []); 224 $language = $request->input('language', []);
225 $is_sitemap = intval($request->input('is_sitemap', 0)); 225 $is_sitemap = intval($request->input('is_sitemap', 0));
226 - if($type == 4){//代表聚合页更新 226 + if($route == 4){//代表聚合页更新
227 $keywordModel = new Keyword(); 227 $keywordModel = new Keyword();
228 $keywordInfo = $keywordModel->whereNull('seo_title')->orWhereNull('seo_keywords')->orWhereNull('seo_description')->first(); 228 $keywordInfo = $keywordModel->whereNull('seo_title')->orWhereNull('seo_keywords')->orWhereNull('seo_description')->first();
229 if(!empty($keywordInfo)){ 229 if(!empty($keywordInfo)){
@@ -302,7 +302,7 @@ class CNoticeController extends BaseController @@ -302,7 +302,7 @@ class CNoticeController extends BaseController
302 'is_sitemap' => $is_sitemap 302 'is_sitemap' => $is_sitemap
303 ]; 303 ];
304 try { 304 try {
305 - http_post($c_url, json_encode($c_param)); 305 + http_post($c_url, json_encode($c_param,true));
306 }catch (\Exception $e){ 306 }catch (\Exception $e){
307 NoticeLog::createLog(NoticeLog::GENERATE_PAGE, ['c_url'=>$c_url,'c_params'=>$c_param]); 307 NoticeLog::createLog(NoticeLog::GENERATE_PAGE, ['c_url'=>$c_url,'c_params'=>$c_param]);
308 } 308 }
@@ -117,21 +117,4 @@ class GeoQuestionResController extends BaseController @@ -117,21 +117,4 @@ class GeoQuestionResController extends BaseController
117 $data = $this->logic->getSearchDate(); 117 $data = $this->logic->getSearchDate();
118 $this->response('success',Code::SUCCESS,$data); 118 $this->response('success',Code::SUCCESS,$data);
119 } 119 }
120 -  
121 - /**  
122 - * @remark :获取搜索列表  
123 - * @name :getSearchList  
124 - * @author :lyh  
125 - * @method :post  
126 - * @time :2025/7/21 16:47  
127 - */  
128 - public function getSearchList(){  
129 - $this->request->validate([  
130 - 'created_at'=>'required',  
131 - ],[  
132 - 'created_at.required' => 'created_at不能为空',  
133 - ]);  
134 - $data = $this->logic->getSearchList($this->map,$this->page,$this->row);  
135 - $this->response('success',Code::SUCCESS,$data);  
136 - }  
137 } 120 }
@@ -652,7 +652,10 @@ class ProductController extends BaseController @@ -652,7 +652,10 @@ class ProductController extends BaseController
652 } 652 }
653 if(isset($this->map['title']) && !empty($this->map['title'])){ 653 if(isset($this->map['title']) && !empty($this->map['title'])){
654 $this->map['title'] = str_replace('+',' ',$this->map['title']); 654 $this->map['title'] = str_replace('+',' ',$this->map['title']);
655 - $query = $query->where('title','like','%'.$this->map['title'].'%'); 655 + $query->where(function ($subQuery) {
  656 + $subQuery->where('title','like','%'.$this->map['title'].'%')
  657 + ->orwhere('route','like','%'.$this->map['title'].'%');
  658 + });
656 } 659 }
657 if(isset($this->map['keyword_title']) && !empty($this->map['keyword_title'])){ 660 if(isset($this->map['keyword_title']) && !empty($this->map['keyword_title'])){
658 $keywordModel = new Keyword(); 661 $keywordModel = new Keyword();
@@ -37,6 +37,9 @@ class GeoLinkLogic extends BaseLogic @@ -37,6 +37,9 @@ class GeoLinkLogic extends BaseLogic
37 */ 37 */
38 public function getLinkList($map = [],$page = 1,$row = 20,$order = 'id'){ 38 public function getLinkList($map = [],$page = 1,$row = 20,$order = 'id'){
39 $filed = ['*']; 39 $filed = ['*'];
  40 + if(isset($map['url']) && !empty($map['url'])){
  41 + $map['url'] = ['like','%'.$map['url'].'%'];
  42 + }
40 $lists = $this->model->lists($map,$page,$row,$order,$filed); 43 $lists = $this->model->lists($map,$page,$row,$order,$filed);
41 return $this->success($lists); 44 return $this->success($lists);
42 } 45 }
@@ -64,13 +67,6 @@ class GeoLinkLogic extends BaseLogic @@ -64,13 +67,6 @@ class GeoLinkLogic extends BaseLogic
64 * @time :2025/7/14 16:50 67 * @time :2025/7/14 16:50
65 */ 68 */
66 public function saveLink(){ 69 public function saveLink(){
67 - $data = [  
68 - 'project_id' => 1,  
69 - 'data' => [  
70 - ['da'=>'ce_shi1', 'url'=>'www.baidu.com', 'send_time'=>'2021-07-09 11:12:12'],  
71 - ['da'=>'ce_shi2', 'url'=>'www.baidu1.com', 'send_time'=>'2021-07-10 11:13:12'],  
72 - ],  
73 - ];  
74 try { 70 try {
75 if(!empty($this->param['data'])){ 71 if(!empty($this->param['data'])){
76 $data = []; 72 $data = [];
@@ -47,12 +47,15 @@ class GeoQuestionResLogic extends BaseLogic @@ -47,12 +47,15 @@ class GeoQuestionResLogic extends BaseLogic
47 * @time :2025/7/4 9:48 47 * @time :2025/7/4 9:48
48 */ 48 */
49 public function getResultList($map = [],$page = 1,$row = 20){ 49 public function getResultList($map = [],$page = 1,$row = 20){
  50 + $map['project_id'] = $this->user['project_id'];
50 $filed = ['id','project_id','question_id','platform','question','en_question','keywords','url','created_at','updated_at']; 51 $filed = ['id','project_id','question_id','platform','question','en_question','keywords','url','created_at','updated_at'];
51 if(!empty($map['created_at'])){ 52 if(!empty($map['created_at'])){
52 - $map['project_id'] = $this->user['project_id'];  
53 $map['created_at'] = ['between',[$map['created_at'].' 00:00:00',$map['created_at'].' 23:59:59']]; 53 $map['created_at'] = ['between',[$map['created_at'].' 00:00:00',$map['created_at'].' 23:59:59']];
54 $this->model = new GeoQuestionLog(); 54 $this->model = new GeoQuestionLog();
55 } 55 }
  56 + if(!empty($map['keywords'])){
  57 + $map['keywords'] = ['like','%'.$map['keywords'].'%'];
  58 + }
56 $query = $this->model->formatQuery($map); 59 $query = $this->model->formatQuery($map);
57 $query = $query->where(function ($q) { 60 $query = $query->where(function ($q) {
58 $q->whereRaw('JSON_LENGTH(keywords) > 0') 61 $q->whereRaw('JSON_LENGTH(keywords) > 0')
@@ -85,20 +88,17 @@ class GeoQuestionResLogic extends BaseLogic @@ -85,20 +88,17 @@ class GeoQuestionResLogic extends BaseLogic
85 $questionModel = new GeoQuestion(); 88 $questionModel = new GeoQuestion();
86 $list = $questionModel->list(['project_id'=>$this->user['project_id']],['question','keywords','url']); 89 $list = $questionModel->list(['project_id'=>$this->user['project_id']],['question','keywords','url']);
87 $questionTotalCount = $urlTotalCount = $keywordsTotalCount = $keywordUrlCount = 0; 90 $questionTotalCount = $urlTotalCount = $keywordsTotalCount = $keywordUrlCount = 0;
  91 + $keywordArr = [];
  92 + $questionLogModel = new GeoQuestionLog();
  93 + $keywordUrlCount = $questionLogModel->counts(['project_id'=>$this->user['project_id'],'hit'=>['!=',0]]);
88 foreach ($list as $item){ 94 foreach ($list as $item){
89 $questionTotalCount += count($item['question'] ?? []); 95 $questionTotalCount += count($item['question'] ?? []);
90 $keywordsTotalCount += count($item['keywords'] ?? []); 96 $keywordsTotalCount += count($item['keywords'] ?? []);
91 $urlTotalCount += count($item['url'] ?? []); 97 $urlTotalCount += count($item['url'] ?? []);
92 - }  
93 - $keywordUrlCount = 0;  
94 - $keywordArr = [];  
95 - $questionResModel = new GeoQuestionLog();  
96 - $resList = $questionResModel->list(['project_id'=>$this->user['project_id']],['keywords','url','keywords_num','url_num']);  
97 - foreach ($resList as $resItem){  
98 - $keywordUrlCount += count($resItem['keywords']);  
99 - $keywordUrlCount += count($resItem['url']);  
100 - foreach ($resItem['keywords_num'] as $key => $value) {  
101 - $keywordArr[$key] = ($keywordArr[$key] ?? 0) + (($value != 0) ? 1 : 0); 98 + foreach ($item['keywords'] as $keyWordItem){
  99 + if (!array_key_exists($keyWordItem, $keywordArr)) {
  100 + $keywordArr[$keyWordItem] = $questionLogModel->counts(['project_id'=>$this->user['project_id'],'keywords'=>['like','%"'.$keyWordItem.'"%']]);
  101 + }
102 } 102 }
103 } 103 }
104 $data = [ 104 $data = [
@@ -122,7 +122,7 @@ class GeoQuestionResLogic extends BaseLogic @@ -122,7 +122,7 @@ class GeoQuestionResLogic extends BaseLogic
122 $data = []; 122 $data = [];
123 $platformModel = new GeoPlatform(); 123 $platformModel = new GeoPlatform();
124 $list = $platformModel->list(['status'=>1],'id',['name','en_name']); 124 $list = $platformModel->list(['status'=>1],'id',['name','en_name']);
125 - $questionResModel = new GeoQuestionResult(); 125 + $questionResModel = new GeoQuestionLog();
126 foreach ($list as $item){ 126 foreach ($list as $item){
127 $data[$item['name']] = $questionResModel->counts(['project_id'=>$this->user['project_id'],'hit'=>['!=',0],'platform'=>$item['en_name']]); 127 $data[$item['name']] = $questionResModel->counts(['project_id'=>$this->user['project_id'],'hit'=>['!=',0],'platform'=>$item['en_name']]);
128 } 128 }
@@ -137,7 +137,7 @@ class GeoQuestionResLogic extends BaseLogic @@ -137,7 +137,7 @@ class GeoQuestionResLogic extends BaseLogic
137 * @time :2025/7/21 16:36 137 * @time :2025/7/21 16:36
138 */ 138 */
139 public function getSearchDate(){ 139 public function getSearchDate(){
140 - $dates = $this->model->select(DB::raw('DATE(created_at) as date_only'))->distinct()->pluck('date_only'); 140 + $dates = $this->model->where('project_id',$this->user['project_id'])->select(DB::raw('DATE(created_at) as date_only'))->distinct()->pluck('date_only');
141 return $this->success($dates); 141 return $this->success($dates);
142 } 142 }
143 143
@@ -31,6 +31,7 @@ class AsideTicketStoreRequest extends FormRequest @@ -31,6 +31,7 @@ class AsideTicketStoreRequest extends FormRequest
31 'engineer_ids' => 'array', 31 'engineer_ids' => 'array',
32 'star' => 'nullable|in:1,2,3|integer', 32 'star' => 'nullable|in:1,2,3|integer',
33 'plan_end_at' => 'nullable|date', 33 'plan_end_at' => 'nullable|date',
  34 + 'close_wechat' => 'nullable|boolean',
34 ]; 35 ];
35 } 36 }
36 } 37 }
@@ -35,7 +35,7 @@ class GeoPlatform extends Base @@ -35,7 +35,7 @@ class GeoPlatform extends Base
35 public function getList(){ 35 public function getList(){
36 // $data = Cache::get('geo_platform'); 36 // $data = Cache::get('geo_platform');
37 // if(empty($data)){ 37 // if(empty($data)){
38 - $data = $this->list(['status'=>$this::STATUS_ON],'id',['name','en_name','icon','sort'],'desc'); 38 + $data = $this->list(['status'=>$this::STATUS_ON],'id',['name','en_name','icon','sort'],'asc');
39 Cache::put('geo_platform',$data,'12 * 3600'); 39 Cache::put('geo_platform',$data,'12 * 3600');
40 // } 40 // }
41 return $data; 41 return $data;
@@ -93,4 +93,11 @@ class TicketProject extends Base @@ -93,4 +93,11 @@ class TicketProject extends Base
93 $message_push->save(); 93 $message_push->save();
94 } 94 }
95 } 95 }
  96 +
  97 + public function getTeam()
  98 + {
  99 + return ManageHr::whereIn('manage_id', json_decode($this->team, true))
  100 + ->where('manage_id', '>', 0)
  101 + ->select(['manage_id', 'name', 'nickname', 'mobile'])->get()->toArray();
  102 + }
96 } 103 }
@@ -53,7 +53,25 @@ class Tickets extends Base @@ -53,7 +53,25 @@ class Tickets extends Base
53 elseif ($this->project->project_cate == 4) 53 elseif ($this->project->project_cate == 4)
54 $canyu[] = 85; // 黄小玉 54 $canyu[] = 85; // 黄小玉
55 else{ 55 else{
56 - // todo 待完善 56 + // todo V5V6 的项目, 组长能够给看到组员的工单
  57 + $leaders = [];
  58 + foreach (array_merge($engineer_ids, $canyu) as $engineer_id)
  59 + {
  60 + $engineer = ManageHr::where('manage_id', $engineer_id)->first();
  61 + if ($engineer)
  62 + {
  63 + $leader = ManageHr::where('is_leader', 1)
  64 + ->where('status', ManageHr::STATUS_ONE)
  65 + ->where('dept_id', $engineer->dept_id)
  66 + ->where('belong_group', $engineer->belong_group)
  67 + ->value('manage_id');
  68 + if ($leader)
  69 + $leaders[] = $leader;
  70 + }
  71 +
  72 + }
  73 + // 合并组长 id 到 $canyu
  74 + $canyu = array_merge($canyu, $leaders);
57 } 75 }
58 76
59 $all_engineer_ids = array_unique(array_merge($canyu, $engineer_ids)); 77 $all_engineer_ids = array_unique(array_merge($canyu, $engineer_ids));
@@ -62,7 +62,7 @@ class MessagePush extends Base @@ -62,7 +62,7 @@ class MessagePush extends Base
62 } 62 }
63 63
64 //特殊处理, 要求任何时候收到询盘都要及时推送到群里面 64 //特殊处理, 要求任何时候收到询盘都要及时推送到群里面
65 - $special_project_ids = [650, 2045]; 65 + $special_project_ids = [650, 2045, 916];
66 //9-21 点,每条消息及时通知 66 //9-21 点,每条消息及时通知
67 //21-第二天 9 点,整合一起通知 67 //21-第二天 9 点,整合一起通知
68 $hour = date('H', strtotime($submit_at)); 68 $hour = date('H', strtotime($submit_at));
@@ -78,6 +78,17 @@ class GeoService @@ -78,6 +78,17 @@ class GeoService
78 */ 78 */
79 public function getDeepSeekResult($content,$model = 'deepseek-r1'){ 79 public function getDeepSeekResult($content,$model = 'deepseek-r1'){
80 $url = $this->api_url . 'v1/chat'; 80 $url = $this->api_url . 'v1/chat';
  81 + switch ($model){
  82 + case 'deepseek-r1':
  83 + $supplier = 'bailian';
  84 + break;
  85 + case 'gpt-4o-mini':
  86 + $supplier = 'azure';
  87 + break;
  88 + default:
  89 + $supplier = '';
  90 + break;
  91 + }
81 $header = [ 92 $header = [
82 'accept: application/json', 93 'accept: application/json',
83 'X-CmerApi-Host: llm-chat.p.cmer.com', 94 'X-CmerApi-Host: llm-chat.p.cmer.com',
@@ -92,7 +103,7 @@ class GeoService @@ -92,7 +103,7 @@ class GeoService
92 ], 103 ],
93 ], 104 ],
94 'model' => $model, 105 'model' => $model,
95 - "supplier"=> "bailian", 106 + "supplier"=> $supplier,
96 'security_check' => true 107 'security_check' => true
97 ]; 108 ];
98 $data = http_post($url,json_encode($message,true),$header); 109 $data = http_post($url,json_encode($message,true),$header);
@@ -258,6 +258,7 @@ Route::middleware(['aloginauth'])->group(function () { @@ -258,6 +258,7 @@ Route::middleware(['aloginauth'])->group(function () {
258 Route::get('/pushNotify/{id}', [Aside\WorkOrder\AsideTicketController::class, 'pushNotify'])->name('admin.tickets.pushNotify')->summary('A端工单推送企微群'); 258 Route::get('/pushNotify/{id}', [Aside\WorkOrder\AsideTicketController::class, 'pushNotify'])->name('admin.tickets.pushNotify')->summary('A端工单推送企微群');
259 Route::get('/projects/{search}', [Aside\WorkOrder\AsideTicketController::class, 'getProjects'])->name('admin.tickets.projects')->summary('A端V5V6项目列表'); 259 Route::get('/projects/{search}', [Aside\WorkOrder\AsideTicketController::class, 'getProjects'])->name('admin.tickets.projects')->summary('A端V5V6项目列表');
260 Route::patch('/projects/{id}', [Aside\WorkOrder\TicketProjectController::class, 'update'])->name('admin.tickets.projects.update')->summary('A端修改工单项目'); 260 Route::patch('/projects/{id}', [Aside\WorkOrder\TicketProjectController::class, 'update'])->name('admin.tickets.projects.update')->summary('A端修改工单项目');
  261 + Route::get('/projects_team/{id}', [Aside\WorkOrder\TicketProjectController::class, 'team'])->name('admin.tickets.projects_team')->summary('A端工单项目团队');
261 Route::get('/v56_projects/list', [Aside\WorkOrder\AsideTicketController::class, 'projectList'])->name('admin.tickets.projectList')->summary('A端V5V6项目列表') 262 Route::get('/v56_projects/list', [Aside\WorkOrder\AsideTicketController::class, 'projectList'])->name('admin.tickets.projectList')->summary('A端V5V6项目列表')
262 ->description("project_cate[项目分类1]: 1 V5, 2 V6, 3 超迹, 4 域途"); 263 ->description("project_cate[项目分类1]: 1 V5, 2 V6, 3 超迹, 4 域途");
263 Route::post('/log/{id}', [Aside\WorkOrder\AsideTicketLogController::class, 'update'])->name('admin.tickets.log.update')->summary('A端工单操作日志更新,完成工单'); 264 Route::post('/log/{id}', [Aside\WorkOrder\AsideTicketLogController::class, 'update'])->name('admin.tickets.log.update')->summary('A端工单操作日志更新,完成工单');