httpClient = new Client(['timeout' => 10]); $this->logger = CustomizeLogger::getSubscribeLogger(); } private function getSyncUrl() { return $this->syncUrl ?: join('/', [ trim(config('contentManage.zhushuyunpublicapi.public_domain'), '/'), 'outapi/zhiyu/getSubsByZhiyu' ]); } private function buildQuery($page = 0) { $query = []; if ($this->syncStartDate) { $query['start_time'] = $this->syncStartDate; } if ($this->syncEndDate) { $query['end_time'] = $this->syncEndDate; } $query['is_all'] = 0; $query['page'] = $page; $query['per_page'] = $this->perPage; $query['timestamp'] = time(); $privateKey = config('contentManage.zhushuyunpublicapi.external_private_key'); $query['sign'] = md5(md5($query['timestamp'] . $privateKey) . $privateKey); return $query; } public function sync() { try { $this->doSync(); } catch (\Exception $exception) { $this->logger->error('同步失败,再次重试', [ 'traceInfo' => app(TraceContext::class)->getTraceInfo(), 'errCode' => $exception->getCode(), 'errMsg' => $exception->getMessage() ]); usleep(500000); $this->doSync(); } } private function doSync() { $page = 0; $dataCollect = collect(); while (true) { try { $result = $this->httpClient->get($this->getSyncUrl(), [ 'query' => $this->buildQuery($page) ]); } catch (\Exception $exception) { $this->logger->error('请求上游接口报错,准备重试', [ 'traceInfo' => app(TraceContext::class)->getTraceInfo(), 'errCode' => $exception->getCode(), 'errMsg' => $exception->getMessage() ]); usleep(500000); $result = $this->httpClient->get($this->getSyncUrl(), [ 'query' => $this->buildQuery($page) ]); } $parsedResult = $this->parseResult($result); if (0 == count($parsedResult['data'])) { break; } foreach ($parsedResult['data'] as $tempData) { $tempData['bid'] = 0; if($dataCollect->has($tempData['zhiyu_book_id'])) { $t = $dataCollect->get($tempData['zhiyu_book_id']); $t['yestoday_available_amount'] += $tempData['yestoday_available_amount']; $t['yestoday_last_amount'] += $tempData['yestoday_last_amount']; $t['yestoday_total_amount'] += $tempData['yestoday_total_amount']; $dataCollect->put($tempData['zhiyu_book_id'], $t); } else { $dataCollect->put($tempData['zhiyu_book_id'], $tempData); } } $page = $parsedResult['current_page'] + 1; if ($page > $parsedResult['last_page']) { break; } } $this->saveResult($dataCollect); } /** * note1: * 接口中的书籍id(zhiyu_book_id)去植宇书库zy_books去查, * @param $datas */ private function saveResult($datas) { foreach ($datas as $data) { $bookSubscribe = new BookSubscribe($data); $insertData = $bookSubscribe->dealSubscribeInfo(); if(is_null($insertData)) { continue; } CpSubscribeStatisticDataModel::updateOrCreate([ 'cp_name' => $insertData['cp_name'], 'bid' => $insertData['zy_bid'], 'calculate_date' => $insertData['calculate_date'] ], [ 'month' => $insertData['month'], 'settlement_date' => date_sub(date_create($insertData['calculate_date']), date_interval_create_from_date_string('1 day'))->format('Y-m-d'), 'yesterday_available_amount' => $insertData['yesterday_available_amount'], 'yesterday_final_amount' => $insertData['yesterday_final_amount'], 'yesterday_total_coins' => $insertData['yesterday_total_coins'], 'book_settlement_type' => $insertData['book_settlement_type'], 'data_source_id' => $data['id'] ?? 0, 'data_source_from' => 'zhuishuyun', 'data_source_bid' => $data['bid'] ?? 0, ]); } } private function parseResult($rawResult) { $httpStatus = $rawResult->getStatusCode(); if (200 != $httpStatus) { ChannelBusinessException::throwError(Errors::REQUEST_HTTP_STATUS_ERROR); } $rawContent = $rawResult->getBody()->getContents(); $parsedContent = \json_decode($rawContent, true); $this->logger->debug('请求接口结果', [ 'traceInfo' => app(TraceContext::class)->getTraceInfo(), 'url' => $this->syncUrl, 'parsedContent' => $parsedContent, ]); $code = $parsedContent['code'] ?? -1; if (0 != $code) { ChannelBusinessException::throwError(Errors::REQUEST_CODE_STATUS_ERROR); } return [ 'current_page' => $parsedContent['data']['current_page'], 'last_page' => $parsedContent['data']['last_page'], 'data' => $parsedContent['data']['data'] ]; } }