BrokerPushLevelRecordItemSendJob.php 3.07 KB
<?php

namespace App\Jobs;

use App\Enums\BrokerPushLevelRecordStatusEnum;
use App\Helpers\IMHelper;
use App\Models\BrokerPushLevelRecord;
use App\Models\BrokerPushLevelRecordItem;
use Illuminate\Bus\Batchable;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Redis;

class BrokerPushLevelRecordItemSendJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels, Batchable;

    public BrokerPushLevelRecord $record;

    public BrokerPushLevelRecordItem $recordItem;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct(BrokerPushLevelRecord $record, BrokerPushLevelRecordItem $recordItem)
    {
        $this->record     = $record;
        $this->recordItem = $recordItem;
        $this->queue      = 'im';
    }

    /**
     * Execute the job.
     *
     * @return void
     * @throws \JsonException
     * @throws \Exception
     */
    public function handle(): void
    {
        Redis::throttle('im-single-send')->allow(200)->every(1)->then(function () {
            $this->recordItem->update(['status' => BrokerPushLevelRecordStatusEnum::PROCESSING, 'send_at' => now()->toDateTimeString()]);

            $result = IMHelper::sendSingleChatMessage(IMHelper::SYSTEM_USER, $this->recordItem->getAttribute('user_id'), [
                'MsgBody'         => [
                    IMHelper::createCustomMessage([
                        "Data" => [
                            'businessID'         => 'system_notice',
                            'notification_id'    => $this->recordItem->getAttribute('record_id'),
                            'notification_class' => 'broker_level_record',
                            'type'               => 1,
                            'title'              => $this->recordItem->getAttribute('title'),
                            'cover'              => '',
                            'content'            => $this->recordItem->getAttribute('content'),
                            'link_type'          => 'none',
                            'link_id'            => 0,
                            'link_url'           => '',
                        ],
                        'Desc' => $this->recordItem->getAttribute('title'),
                    ], ['is_alert' => $this->record->value('is_alert') ?? 0]),
                ],
                "CloudCustomData" => [],
                "OfflinePushInfo" => IMHelper::createOfflineMessage('系统消息', $this->recordItem->getAttribute('title'))
            ]);

            if ($result->json('ActionStatus') === 'FAIL') {
                $this->recordItem->update(['status' => BrokerPushLevelRecordStatusEnum::FAIL]);
            } else {
                $this->recordItem->update(['status' => BrokerPushLevelRecordStatusEnum::SUCCESS, 'message_id' => $result->json('MsgKey', '')]);
            }
        }, function () {
            $this->release(1);
        });
    }
}