store-manage/app/Console/Commands/TaskUpdateCommand.php

111 lines
3.8 KiB
PHP

<?php
namespace App\Console\Commands;
use App\Enums\TaskHygieneStatus;
use App\Enums\TaskLedgerStatus;
use App\Enums\TaskPerformanceStatus;
use App\Enums\TaskStatus;
use App\Models\Task;
use App\Models\TaskHygiene;
use App\Models\TaskLedger;
use App\Models\TaskPerformance;
use Illuminate\Console\Command;
use Illuminate\Database\Eloquent\Relations\MorphTo;
use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Support\Facades\DB;
use Throwable;
class TaskUpdateCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'app:task-update';
/**
* The console command description.
*
* @var string
*/
protected $description = '生成门店每天的总账录入任务';
/**
* Execute the console command.
*/
public function handle()
{
$datetime = now();
Task::with(['taskable' => 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);
}
});
}
}