environment(['local', 'development', 'testing'])) { $this->error('此命令仅用于本地开发环境,不修改生产服务器连接。'); return self::FAILURE; } $current = $configuration->current(); $password = $this->option('password-stdin') ? rtrim((string) fgets(STDIN, 1002), "\r\n") : (string) ($current['password'] ?? ''); try { $settings = $profile->settings($password); } catch (Throwable) { $this->warn('本机尚未保存有效的团队密码。请在系统数据库页面输入一次密码;已有配置未修改,无需另配上游账号。'); return VerifySystemDatabase::EXIT_SHARED_NOT_CONFIGURED; } try { // 只探测最新端点,不先连接可能已停用的旧服务器。 $result = $configuration->probe($settings); $settings['prefix'] = $result['prefix']; if ($this->matches($current, $settings)) { $this->info('本机已连接最新团队系统数据库,业务镜像共用此连接。'); return self::SUCCESS; } } catch (Throwable) { $this->error('最新团队数据库接入未通过验证,原配置已保留。请检查网络、TLS和共享库访问权限;不要改填上游账号。'); return self::FAILURE; } try { $configuration->persist($settings); } catch (Throwable) { $this->error('本机配置保存或复核失败。请核对私有配置备份和系统连接状态;不要仅修改运行模式或绕过验证。'); return self::FAILURE; } $this->info('已备份并更新本机系统库、业务镜像库连接。请重新登录;未迁移或同步业务数据。'); return self::SUCCESS; } private function matches(array $current, array $settings): bool { foreach (['host', 'port', 'database', 'username', 'password', 'prefix', 'tls_required', 'tls_verify_server_cert', 'tls_ca'] as $key) { if (($current[$key] ?? null) != ($settings[$key] ?? null)) return false; } $mirror = (array) config('database.connections.business_mirror'); return ($current['mode'] ?? '') === 'shared' && config('upstreams.stored_configuration.enabled', false) && ! config('upstreams.local_configuration.enabled', false) && data_get($mirror, 'read.host.0') === $settings['host'] && data_get($mirror, 'write.host.0') === $settings['host'] && (int) ($mirror['port'] ?? 0) === (int) $settings['port'] && ($mirror['database'] ?? '') === $settings['mirror_database'] && ($mirror['username'] ?? '') === $settings['username'] && ($mirror['password'] ?? '') === $settings['password'] && empty($mirror['unix_socket']); } }