baseUrl = rtrim((string) config('services.crm.base_uri'), '/'); $this->timeout = (int) config('services.crm.timeout', 15); } /** * 是否已配置 CRM 接口 */ public function isConfigured(): bool { return $this->baseUrl !== ''; } /** * 获取一级代理详情,包含 productList[].productCode / agentAccountingPeriod * * 对应 agent-be Client::getAgentByCode -> GET /api/group/detail/{code} * * @return array|null 成功返回响应 JSON 解码数据;失败返回 null。 */ public function getAgentByCode(string $rootAgentCode): ?array { if (!$this->isConfigured()) { return null; } try { $response = $this->http()->get($this->baseUrl.'/api/group/detail/'.$rootAgentCode); if (!$response->successful()) { Log::warning('CRM getAgentByCode non-2xx', [ 'code' => $rootAgentCode, 'status' => $response->status(), 'body' => $response->body(), ]); return null; } return $response->json(); } catch (\Throwable $e) { Log::warning('CRM getAgentByCode failed', [ 'code' => $rootAgentCode, 'message' => $e->getMessage(), ]); return null; } } /** * 解析 getAgentByCode 返回,构建 productCode => hasCredit 的映射 */ public function firstAgentCreditMap(string $rootAgentCode): array { $data = $this->getAgentByCode($rootAgentCode); if (!is_array($data)) { return []; } // 与 agent-be AgentCredit::getFirstAgentCredit 保持一致:要求 code == 200 if (!isset($data['code']) || (int) $data['code'] !== 200) { return []; } $productList = $data['data']['productList'] ?? []; $map = []; foreach ($productList as $product) { $productCode = (string) ($product['productCode'] ?? ''); if ($productCode === '') { continue; } $map[$productCode] = ((int) ($product['agentAccountingPeriod'] ?? 0)) > 0; } return $map; } private function http(): PendingRequest { return Http::timeout($this->timeout) ->withoutVerifying() ->acceptJson(); } }