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