diff --git a/app/Console/Commands/SyncCompany.php b/app/Console/Commands/SyncCompany.php new file mode 100644 index 0000000..3874ce9 --- /dev/null +++ b/app/Console/Commands/SyncCompany.php @@ -0,0 +1,89 @@ +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('公司信息-全量同步完成'); + } +} + diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index bf141d1..bbf5911 100755 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -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(); } diff --git a/app/Models/Company.php b/app/Models/Company.php index e289ffc..71adeef 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -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