diff --git a/app/Console/Commands/TaskUpdateCommand.php b/app/Console/Commands/TaskUpdateCommand.php new file mode 100644 index 0000000..b9145d5 --- /dev/null +++ b/app/Console/Commands/TaskUpdateCommand.php @@ -0,0 +1,110 @@ + function (MorphTo $morphTo) { + $morphTo->morphWith([ + TaskLedger::class, + TaskPerformance::class, + TaskHygiene::class => ['workflow'], + ]); + }]) + ->where('task_status', TaskStatus::Pending) + ->where('end_at', '<', $datetime) + ->lazyById() + ->each(function ($task) use ($datetime) { + try { + DB::beginTransaction(); + + switch (Relation::getMorphedModel($task->taskable_type)) { + case TaskLedger::class: + if ($task->taskable->task_status === TaskLedgerStatus::Success) { + $task->update([ + 'task_status' => TaskStatus::Success, + 'completed_at' => $datetime, + ]); + } else { + $task->update([ + 'task_status' => TaskStatus::Failed, + ]); + } + break; + + case TaskPerformance::class: + if ($task->taskable->task_status === TaskPerformanceStatus::Success) { + $task->update([ + 'task_status' => TaskStatus::Success, + 'completed_at' => $datetime, + ]); + } else { + $task->update([ + 'task_status' => TaskStatus::Failed, + ]); + } + break; + + case TaskHygiene::class: + switch ($task->taskable->task_status) { + case TaskHygieneStatus::Success: + $task->update([ + 'task_status' => TaskStatus::Success, + 'completed_at' => $datetime, + ]); + break; + + case TaskHygieneStatus::Unpassed: + case TaskHygieneStatus::Failed: + $task->update([ + 'task_status' => TaskStatus::Failed, + ]); + break; + } + break; + } + + DB::commit(); + } catch (Throwable $e) { + DB::rollBack(); + + report($e); + } + }); + } +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index ba61e75..a510075 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -12,6 +12,7 @@ class Kernel extends ConsoleKernel */ protected function schedule(Schedule $schedule): void { + $schedule->command(Commands\TaskUpdateCommand::class)->hourly(); $schedule->command(Commands\TaskLedgerGenerateCommand::class)->dailyAt('01:00'); // $schedule->call(fn() => logger('schedule running'))->everyMinute(); }