123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- <?php
- namespace Modules\ContentManage\Services\CpManage;
- use GuzzleHttp\Client;
- use Modules\Common\Support\Trace\CustomizeLogger;
- use Modules\Common\Support\Trace\TraceContext;
- use Modules\ContentManage\Exceptions\ChannelBusinessException;
- use Modules\ContentManage\Exceptions\Errors;
- use Modules\ContentManage\Models\Cp\CpSubscribeStatisticDataModel;
- class SyncSubscribe
- {
- private $httpClient = null;
- public $syncUrl;
- public $syncStartDate;
- public $syncEndDate;
- private $logger;
- private $perPage = 200;
- public function __construct()
- {
- $this->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']
- ];
- }
- }
|