option('user_id'); $updateLocal = (int)$this->option('address'); $updateMarket = (int)$this->option('market'); // 更新公司信息 $this->compnay($user_id); // 更新经纬度信息(可选) if ($updateLocal) { $this->local($user_id); } // 更新上市状态(可选) if ($updateMarket) { $this->updateMarketStatus(); } return $this->info('全部更新完成'); } /** * 更新公司信息 */ public function compnay($user_id = null) { if ($user_id) { // 强制单个更新 $users = User::whereHas('courseSigns', function ($query) { $query->where('status', 1); })->where('id', $user_id)->get(); } else { // 批量更新(只更新有报名审核通过的用户) $users = User::whereHas('courseSigns', function ($query) { $query->where('status', 1); })->whereNotNull('company_name')->get(); } $total = $users->count(); if ($total == 0) { return $this->info('没有需要更新的用户'); } $this->info("开始更新公司信息,共 {$total} 个用户"); $bar = $this->output->createProgressBar($total); $bar->start(); $YuanheRepository = new YuanheRepository(); foreach ($users as $user) { // 获取公司详细信息 $result = $YuanheRepository->companyInfo(['enterpriseName' => $user->company_name]); if (!$result) { $bar->setMessage($user->company_name . ' 公司不存在', 'status'); $bar->advance(); continue; } // 如果$result['enterpriseName']存在数字,跳过 if (preg_match('/\d/', $result['enterpriseName'])) { $bar->setMessage($user->company_name . ' 公司名称包含数字,跳过', 'status'); $bar->advance(); continue; } if ($result['status'] == '未注册') { $bar->setMessage($user->company_name . ' 公司未注册,跳过', 'status'); $bar->advance(); continue; } $where = ['company_name' => $result['enterpriseName']]; $data = [ 'company_address' => $result['address'], 'business_scope' => $result['businessScope'], 'company_city' => $result['city'], 'contact_mail' => $result['contactMail'], 'contact_phone' => $result['contactPhone'], 'company_area' => $result['country'], 'credit_code' => $result['creditCode'], 'enterprise_id' => $result['enterpriseId'], 'company_name' => $result['enterpriseName'], 'is_abroad' => $result['isAbroad'], 'company_market' => $result['isOnStock'], 'is_yh_invested' => $result['isYhInvested'], 'logo' => $result['logo'], 'company_legal_representative' => $result['operName'], 'company_province' => $result['province'], 'company_industry' => combineKeyValue($result['qccIndustry']), 'regist_amount' => $result['registAmount'], 'regist_capi_type' => $result['registCapiType'], 'company_date' => $result['startDate'], 'status' => $result['status'], 'stock_date' => $result['stockDate'], 'currency_type' => $result['currencyType'], 'stock_number' => $result['stockNumber'], 'stock_type' => $result['stockType'], 'company_tag' => implode(',', $result['tagList']), // 更新日期 'update_date' => $result['updatedDate'] ?? null, // 管理平台 'project_users' => $result['projectUsers'] ?? null, // 股东信息 'partners' => $result['partners'] ?? null, ]; $company = Company::updateOrCreate($where, $data); // 更新用户关联 $user->company_id = $company->id; $user->save(); // 更新上市状态 $this->updateMarketStatus($company->id); $bar->setMessage($result['enterpriseName'] . ' 更新成功', 'status'); $bar->advance(); } $bar->finish(); $this->newLine(); return $this->info('公司信息-全部更新完成'); } /** * 更新经纬度信息 */ public function local($user_id = null) { if ($user_id) { // 强制单个更新 $user = User::find($user_id); if (empty($user->company_id)) { return $this->error('用户没有关联公司'); } $companys = Company::where('id', $user->company_id)->get(); } else { // 批量更新 $companys = Company::whereNull('company_longitude') ->whereNotNUll('company_address') ->where('company_address', '!=', '') ->get(); } $total = $companys->count(); if ($total == 0) { return $this->info('没有需要更新经纬度的公司'); } $this->info("开始更新经纬度信息,共 {$total} 个公司"); $bar = $this->output->createProgressBar($total); $bar->start(); // 每3个数据分一个chunk 。接口限制了一秒只能3次请求 $companysChunk = $companys->chunk(3); foreach ($companysChunk as $companyChunk) { foreach ($companyChunk as $item) { $local = Company::addressTolocation($item->company_address); $item->company_longitude = $local['lng']; $item->company_latitude = $local['lat']; $item->save(); $bar->setMessage($item->company_name . " 经纬度({$local['lng']}, {$local['lat']})更新成功", 'status'); $bar->advance(); } sleep(1); } $bar->finish(); $this->newLine(); return $this->info('经纬度信息-全部更新完成'); } /** * 根据 company_tag 更新上市状态 * 判断是否包含上市代码标签,如 688001.SH、000001.SZ、830001.BJ 等 */ public function updateMarketStatus($companyId = null) { $this->info('开始更新上市状态...'); // 获取所有有 company_tag 的公司 if ($companyId) { $companies = Company::where('id', $companyId)->get(); } else { $companies = Company::whereNotNull('company_tag') ->where('company_tag', '!=', '') ->get(); } $total = $companies->count(); if ($total == 0) { return $this->info('没有需要更新上市状态的公司'); } $bar = $this->output->createProgressBar($total); $bar->start(); // 上市代码正则:数字.SH 或 数字.SZ 或 数字.BJ $stockCodePattern = '/\d{6}\.(SH|SZ|BJ)/i'; $updatedCount = 0; foreach ($companies as $company) { $hasStockCode = preg_match($stockCodePattern, $company->company_tag); $newMarketStatus = $hasStockCode ? 1 : 0; // 只有状态变化才更新 if ($company->company_market != $newMarketStatus) { $company->company_market = $newMarketStatus; $company->save(); $updatedCount++; $statusText = $newMarketStatus ? '上市' : '非上市'; $bar->setMessage("{$company->company_name} => {$statusText}", 'status'); } $bar->advance(); } $bar->finish(); $this->newLine(); return $this->info("上市状态更新完成,共更新 {$updatedCount} 个公司"); } }