Merge branch 'master' of http://47.244.231.31:8099/zhl/globalso-v6 into lyh-server
正在显示
6 个修改的文件
包含
167 行增加
和
19 行删除
| @@ -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 | } |
| @@ -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 | + |
| @@ -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 | } |
| @@ -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 | } |
| @@ -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端工单操作日志更新,完成工单'); |
-
请 注册 或 登录 后发表评论