You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

259 lines
9.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace App\Console\Commands;
use App\Models\Company;
use App\Models\User;
use App\Repositories\MeetRepository;
use App\Repositories\YuanheRepository;
use Illuminate\Console\Command;
class UpdateCompany extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'update_company {--user_id=} {--address=0} {--market=0}';
/**
* The console command description.
*
* @var string
*/
protected $description = '批量更新公司信息';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$user_id = $this->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,.TW,.HK,.SG,.US,.DE,.FR,.JP,.KR,.N,.O,.A,.PK,.Q,.TO,.AX,.L,-S,-B,-SB,-P,-Z,-W,-SW,-SWR,-R,-WR,-X,-SS,-RS,.WS,.U,.PR,.B,.DB,.UN,.RT,.WT,.E,.C,.D,.F,.G,.H,.I,.J,.K,.L,.M,.N,.O,.P,.V,.Y,.Z
// 简化匹配:只要字符串中包含分隔符(.或-)+指定后缀,就算上市
// 支持格式688001.SH、AAPG.O、TSLA.US、华兴源创688001.SH
// 后缀按长度从长到短排序,避免短后缀误匹配
$stockCodePattern = '/[.\-](SWR|SW|WR|SS|RS|SB|PK|TO|AX|WS|PR|DB|UN|RT|WT|SH|SZ|BJ|TW|HK|SG|US|DE|FR|JP|KR|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|U|V|W|X|Y|Z)(?![A-Za-z0-9])/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} 个公司");
}
}