123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249 |
- <?php
- namespace App\Jobs\OrangeSite;
- use App\Modules\Callback\Models\ChannelCallbackConfig;
- use App\Modules\Callback\Services\CallbackBaseService;
- use App\Modules\OrangeSite\Services\CheckReport\EnableReportCheck;
- use App\Modules\OrangeSite\Services\CheckReport\OrderAlreadyReportCheck;
- use App\Modules\OrangeSite\Services\CheckReport\PromotionProtectCheck;
- use App\Modules\OrangeSite\Services\CheckReport\RechargeAmountCheck;
- use App\Modules\OrangeSite\Services\CheckReport\ReportRateCheck;
- use App\Modules\OrangeSite\Services\CheckReport\ReportRechargeTypeCheck;
- use App\Modules\OrangeSite\Services\OrangeSitePromotionService;
- use App\Modules\OrangeSite\Services\OrangeSiteRechargeReportCheckContext;
- use App\Modules\OrangeSite\Services\OrangeSiteReportRateService;
- use App\Modules\Order\Models\ReportUserChargeRecord;
- use App\Modules\Trace\TraceContext;
- use Illuminate\Bus\Queueable;
- use Illuminate\Contracts\Queue\ShouldQueue;
- use Illuminate\Foundation\Bus\Dispatchable;
- use Illuminate\Pipeline\Pipeline;
- use Illuminate\Queue\InteractsWithQueue;
- use Illuminate\Queue\SerializesModels;
- use Illuminate\Support\Facades\DB;
- class RechargeReport implements ShouldQueue
- {
- use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
- public const QUEUE = '{orangeSite}.report.recharge';
- public const CONNECTION = 'redis_queue';
- public const PLATFORM = 'orange';
- /**
- * @var array
- * <pre>
- * [
- * 'channelId' => 'xxx, // 站点id
- * 'orderId' => 'xxx', // 订单id
- * 'uid' => 'xxx', // 充值用户uid
- * ]
- * </pre>
- */
- private $reportInfo;
- /**
- * Create a new job instance.
- *
- * @return void
- */
- public function __construct(array $reportInfo)
- {
- $this->reportInfo = $reportInfo;
- }
- /**
- * Execute the job.
- *
- * @return void
- */
- public function handle()
- {
- $traceContext = new TraceContext();
- \Log::info('[orangeSiteRechargeReport]开始回传', [
- 'reportInfo' => $this->reportInfo,
- 'traceInfo' => $traceContext->getTraceInfo()
- ]);
- $user = DB::table('users')->find(($this->reportInfo['uid'] ?? -1));
- $order = DB::table('orders')->where([
- ['id', '=', ($this->reportInfo['orderId'] ?? -1)],
- ['status', '=', 'PAID']
- ])->first();
- $channelCallbackConfig = ChannelCallbackConfig::where('channel_id', ($this->reportInfo['channelId'] ?? -1))
- ->where('platform', self::PLATFORM)->first();
- $channelSettingRate = OrangeSiteReportRateService::getChannelSettingReportRate($user->distribution_channel_id);
- $reportCheckContext = new OrangeSiteRechargeReportCheckContext($user, $order, $channelCallbackConfig,
- $traceContext, $channelSettingRate);
- try {
- $reportCheckContext->checkNecessaryInfo();
- } catch (\Exception $exception) {
- \Log::error('[orangeSiteRechargeReport]回传基础信息有误', [
- 'message' => $exception->getMessage(),
- 'traceInfo' => $traceContext->getTraceInfo()
- ]);
- dingTalkAlert(config('common.orangeSite.dingTalkUrl'), "[orangeSite]订单回传基础信息有误报警:\r\n" .
- \json_encode([
- 'reportInfo' => $this->reportInfo,
- 'message' => $exception->getMessage(),
- 'traceInfo' => $traceContext->getTraceInfo()
- ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
- return;
- }
- $pipes = [
- EnableReportCheck::class,
- OrderAlreadyReportCheck::class,
- ReportRechargeTypeCheck::class,
- RechargeAmountCheck::class,
- PromotionProtectCheck::class,
- ReportRateCheck::class
- ];
- $content = app(Pipeline::class)
- ->send($reportCheckContext)
- ->through($pipes)
- ->then(function ($content) {
- return $content;
- });
- $result = $content->result;
- \Log::info('[orangeSiteRechargeReport]回传判定结果', [
- 'result' => $result,
- 'traceInfo' => $traceContext->getTraceInfo()]);
- if ($result['needRecord'] ?? true) {
- $this->saveReportUserChargeReportInfo($reportCheckContext, $result);
- }
- if ($result['result']) {
- $this->reportRecharge($reportCheckContext, $result);
- }
- }
- private function reportRecharge(OrangeSiteRechargeReportCheckContext $reportCheckContext, array $checkResult)
- {
- $params = [
- 'uid' => $reportCheckContext->user->id,
- 'source' => 'zsy',
- 'amount' => $reportCheckContext->order->price ?? 0,
- 'link_source' => 'tiktok_event',
- ];
- $result = $this->reprotResultDeal(CallbackBaseService::directlyCharge($params));
- $resultContent = \json_decode(($result['content'] ?? '[]'), true);
- $updateInfo = [
- 'status' => $result['status'] ?? 0,
- 'request_param' => $result['request_param'] ?? '',
- 'updated_at' => date('Y-m-d H:i:s'),
- 'content' => \json_encode(array_merge($resultContent,
- ['log_content' => ($reportCheckContext->result['content'] ?? '')]))
- ];
- \Log::info('[orangeSiteRechargeReport]请求回传接口结果:' . ($updateInfo['status'] ? '成功' : '失败'), [
- 'status' => $updateInfo['status'],
- 'traceInfo' => $reportCheckContext->traceContext->getTraceInfo()]);
- DB::transaction(function () use ($reportCheckContext, $updateInfo, $checkResult, $result) {
- DB::table('report_user_charge_records')->where([
- 'order_no' => $reportCheckContext->order->trade_no,
- 'uid' => $reportCheckContext->order->uid,
- 'link_source' => $reportCheckContext->platform,
- ])->update($updateInfo);
- if (1 == $result['status']) {
- /**
- * 如果是计划保护回传成功的,只增加 orange_site_recharge_report_protect_records.current_protect_num,
- * 而不增加 orange_site_recharge_report_records.rate_total_num 和 orange_site_recharge_report_records.rate_success_num
- */
- if ('promotionProtect' == ($checkResult['result_ok_reason'] ?? '')) {
- \Log::debug('[orangeSiteRechargeReport]回传成功,增加对应计划的成功数', [
- 'traceInfo' => $reportCheckContext->traceContext->getTraceInfo(),
- 'promotionId' => $reportCheckContext->reportInfo['promotionId']]);
- OrangeSitePromotionService::setCurrentPromotionProtectNum($reportCheckContext->user->distribution_channel_id,
- $reportCheckContext->reportInfo['promotionId'],
- $reportCheckContext->channelCallbackConfig->eligible_count ?: 0);
- } else {
- OrangeSiteReportRateService::increaseSuccessNum($reportCheckContext->user->distribution_channel_id,
- $reportCheckContext->reportInfo['configRate']);
- }
- } else {
- if ('promotionProtect' != ($checkResult['result_ok_reason'] ?? '')) {
- \Log::error('[orangeSiteRechargeReport]订单回传失败', [
- 'traceInfo' => $reportCheckContext->traceContext->getTraceInfo()]);
- OrangeSiteReportRateService::increaseFailNum($reportCheckContext->user->distribution_channel_id,
- $reportCheckContext->reportInfo['configRate']);
- } else {
- \Log::error('[orangeSiteRechargeReport]计划保护订单回传失败', [
- 'traceInfo' => $reportCheckContext->traceContext->getTraceInfo()]);
- }
- }
- });
- }
- /**
- * [调用tiktok 接口回传后,数据处理逻辑]
- * @return [type] [description]
- */
- public function reprotResultDeal($result)
- {
- $status = 0;
- $content = '';
- $result_data = isset($result['data']) ? $result['data'] : [];
- if (!empty($result_data['content'])) {
- $content = $result_data['content'];
- $con_arr = json_decode($content, true);
- $content = json_encode($con_arr);
- if (isset($con_arr['code']) && 0 == $con_arr['code']) {
- //tiktok_event
- $status = 1;
- }
- }
- //处理请求参数
- $request_param = '';
- if (isset($result_data['query_params'])) {
- if (is_string($result_data['query_params'])) {
- $request_param = $result_data['query_params'];
- }
- if (is_array($result_data['query_params'])) {
- $request_param = json_encode($result_data['query_params']);
- }
- }
- $data = [
- 'status' => $status,
- 'request_param' => $request_param,
- ];
- if ($content) {
- $data['content'] = $content;
- }
- return $data;
- }
- private function saveReportUserChargeReportInfo(OrangeSiteRechargeReportCheckContext $reportCheckContext, array $result)
- {
- $data = [
- 'uid' => $this->reportInfo['uid'],
- 'config_percent' => round($reportCheckContext->reportInfo['configRate'] / 100, 4),
- 'report_percent' => round($reportCheckContext->reportInfo['reportRate'] / 100, 4),
- 'order_no' => $reportCheckContext->order->trade_no,
- 'timestamp' => time(),
- 'status' => 0,
- 'type' => $result['type'] ?? '',
- 'content' => $result['content'] ?? '',
- 'channel_id' => $reportCheckContext->user->distribution_channel_id,
- 'request_param' => '',
- 'link_source' => $reportCheckContext->platform,
- ];
- ReportUserChargeRecord::updateOrCreate([
- 'order_no' => $data['order_no'],
- 'uid' => $data['uid'],
- 'link_source' => $data['link_source'],
- ], $data);
- }
- }
|