master
cody 3 months ago
parent f3fced0de8
commit c44ac9901c

@ -0,0 +1,89 @@
<?php
namespace App\Console\Commands;
use App\Models\Company;
use App\Models\User;
use Illuminate\Console\Command;
class SyncCompany extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'sync:company';
/**
* 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()
{
// 全量同步所有有公司名称的用户
$this->syncAllCompanies();
return $this->info('全量同步完成');
}
/**
* 全量同步公司信息
*/
public function syncAllCompanies()
{
// 获取所有有公司名称的用户全量同步不限制company_id
$users = User::whereNotNull('company_name')
->orderBy('id', 'desc')
->get();
$total = $users->count();
if ($total == 0) {
return $this->info('没有需要同步的用户');
}
$this->info("开始全量同步公司信息,共 {$total} 个用户");
$bar = $this->output->createProgressBar($total);
$bar->start();
$successCount = 0;
$failCount = 0;
foreach ($users as $user) {
// 调用模型方法同步公司信息(不包含经纬度和地址)
$result = Company::syncCompanyFromUser($user);
if ($result['success']) {
$successCount++;
$bar->setMessage($result['company']->company_name . ' 同步成功', 'status');
} else {
$failCount++;
$bar->setMessage($user->company_name . ' ' . $result['message'], 'status');
}
$bar->advance();
}
$bar->finish();
$this->newLine();
$this->info("同步完成:成功 {$successCount} 个,失败 {$failCount} 个");
return $this->info('公司信息-全量同步完成');
}
}

@ -32,6 +32,8 @@ class Kernel extends ConsoleKernel
$schedule->command('auto_schoolmate')->everyThirtyMinutes();
// 更新公司信息
$schedule->command('update_company')->everyTenMinutes();
// 全量同步公司信息(每天凌晨执行,不同步经纬度和地址)
$schedule->command('sync:company')->dailyAt('02:00');
// 同步老师课程方向
$schedule->command('sync:teacher_direction')->hourly();
}

@ -176,11 +176,15 @@ class Company extends SoftDeletesModel
}
/**
* 根据用户信息更新公司信息
* 根据用户信息更新/同步公司信息(统一方法)
* @param User $user 用户对象
* @param bool $skipIfHasCompany 如果已有公司关联company_id > 0是否跳过默认true
* @param bool $updateAddress 是否更新地址默认true
* @param bool $updateLocation 是否更新经纬度默认true
* @param bool $setCompanyIdOnFail 失败时是否设置company_id=0默认true
* @return array 返回结果 ['success' => bool, 'message' => string, 'company' => Company|null]
*/
public static function updateCompanyFromUser($user)
public static function updateCompanyFromUser($user, $skipIfHasCompany = true, $updateAddress = true, $updateLocation = true, $setCompanyIdOnFail = true)
{
if (!$user || empty($user->company_name)) {
return ['success' => false, 'message' => '用户或公司名称为空', 'company' => null];
@ -188,7 +192,7 @@ class Company extends SoftDeletesModel
// 如果已经有有效的公司关联company_id > 0跳过
// 允许处理 company_id = -1待更新或 null初始状态的情况
if ($user->company_id && $user->company_id > 0) {
if ($skipIfHasCompany && $user->company_id && $user->company_id > 0) {
return ['success' => false, 'message' => '用户已有公司关联', 'company' => null];
}
@ -213,27 +217,32 @@ class Company extends SoftDeletesModel
if (!$result) {
// 标识一下未匹配到公司,后续可以根据这个字段筛选出未匹配到公司的用户
$user->company_id = 0;
$user->save();
if ($setCompanyIdOnFail) {
$user->company_id = 0;
$user->save();
}
return ['success' => false, 'message' => '公司不存在', 'company' => null];
}
// 如果$result['enterpriseName']存在数字,跳过
if (preg_match('/\d/', $result['enterpriseName'])) {
$user->company_id = 0;
$user->save();
if ($setCompanyIdOnFail) {
$user->company_id = 0;
$user->save();
}
return ['success' => false, 'message' => '公司名称包含数字,跳过', 'company' => null];
}
if ($result['status'] == '未注册') {
$user->company_id = 0;
$user->save();
if ($setCompanyIdOnFail) {
$user->company_id = 0;
$user->save();
}
return ['success' => false, 'message' => '公司未注册,跳过', 'company' => null];
}
$where = ['company_name' => $result['enterpriseName']];
$data = [
'company_address' => $result['address'],
'business_scope' => $result['businessScope'],
'company_city' => $result['city'],
'contact_mail' => $result['contactMail'],
@ -266,6 +275,11 @@ class Company extends SoftDeletesModel
'partners' => $result['partners'] ?? null,
];
// 根据参数决定是否更新地址
if ($updateAddress) {
$data['company_address'] = $result['address'];
}
$company = Company::updateOrCreate($where, $data);
// 更新用户关联
@ -275,12 +289,25 @@ class Company extends SoftDeletesModel
// 更新上市状态
self::updateMarketStatus($company->id);
// 更新位置
self::updateLocation($company->id);
// 根据参数决定是否更新位置(经纬度)
if ($updateLocation) {
self::updateLocation($company->id);
}
return ['success' => true, 'message' => '更新成功', 'company' => $company];
}
/**
* 全量同步公司信息(不包含地址和经纬度)
* @param User $user 用户对象
* @return array 返回结果 ['success' => bool, 'message' => string, 'company' => Company|null]
*/
public static function syncCompanyFromUser($user)
{
// 调用统一方法参数设置为不跳过已有公司、不更新地址、不更新经纬度、失败时不设置company_id
return self::updateCompanyFromUser($user, false, false, false, false);
}
/**
* 更新经纬度信息
* @param int $companyId 公司ID

Loading…
Cancel
Save