Как сделать задачу планировщика для каждой новой записи после 20 минут в Laravel? - PullRequest
0 голосов
/ 14 января 2019

У меня есть система парковки, в которой я использую Angular 6 + Laravel для бэкэнда, и у меня есть особая проблема, которую я не знаю, правильный подход.

В парке есть два тотема, которые отправляют на мой сервер запись. Я проверяю, является ли клиент недействительным, только когда он выходит на тотем с выхода и когда он идет в зону оплаты.

Это мой код, когда он положил билет со считанным штрих-кодом EAN_13. Это мой код, который готов тотем выхода:

public function getEntrysDataByEan(Request $request)
{
    if (isset($request)) {
        $entryean = $request->input('entryean13');
        $entry = $this->mdMovEntry->getEntrysDataByEan($entryean);

        if (empty($entry)) {
            $response["success"] = 0;
            $response["message"] = "Não existe nenhuma entrada correspondente";
        } else {
            $nowHour = Carbon::now();
            $enterHour = Carbon::parse($entry[0]->updated_at);

            $difmin = $enterHour->diffInMinutes($nowHour);
            $dif = $enterHour->diffInHours($nowHour);

            if ($difmin <= 20) {
                $this->mdMovEntry->validatedEntryByEan($entryean, Carbon::parse($entry[0]->updated_at), $nowHour);
                $entry[0]->validated = 'S';
            } else {
                $this->mdMovEntry->devaluedEntryByEan($entryean, Carbon::parse($entry[0]->updated_at));
                $entry[0]->validated = 'N';
            }

            $response["success"] = 1;
            $response["message"] = "Entrada retornada com sucesso";
            $response["entry"] = $entry;
        }
    } else {
        $response["success"] = 0;
        $response["message"] = "Nenhum dado enviado";
    }

    return $response;
}

Проблема в том, что я думаю, что это так много обработки, чтобы просто читать, может ли клиент выйти или нет, поэтому я ищу в Laravel подходы «Планирование задач» и «Работа» и не вижу ничего для моей проблемы.

Что я хочу, так это когда тотем из области ввода делает вставку в мою базу данных, и я создаю какое-то задание или задание, которое через 20 минут для каждой новой записи, которую он помещает в недействительную.

А когда клиент выходит из системы, система просто выполняет getEntry для базы данных и проверяет, подтвержден ли он или нет.

Как мне этого добиться? Я спрашиваю об этом, потому что каждый пример для Задачи является глобальным выполнением, но я хочу задание только для каждой новой записи, это возможно?

1 Ответ

0 голосов
/ 14 января 2019

Рассмотрите возможность использования событий модели в сочетании с отложенной диспетчеризацией для заданий в очереди.

Следующее будет прослушивать событие created, когда новые записи вставляются в базу данных, и отправлять задание, отложенное на 20 минут, чтобы позже сделать запись недействительной.

InvalidateEntry Job

class InvalidateEntry implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $entry;

    /**
     * Create a new job instance.
     *
     * @param  Entry  $entry
     * @return void
     */
    public function __construct(Entry $entry)
    {
        $this->entry = $entry;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        // you'll probably need to add some conditional logic 
        // before updating the entry to determine if the 
        // action is still required.
        $isEntryInvalid = ...;

        if ($isEntryInvalid) { 
            $this->entry->update([
                'validated' => 'N'
            ]);
        } else {
            // delete the job from the queue
            $this->delete();
        }
    }
}

Модель входа

class Entry extends Model
{
    public static function boot()
    {
        parent::boot();

        static::created(function (Entry $entry) {
            InvalidateEntry::dispatch($entry)->delay(now()->addMinutes(20));
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...