From ac0e1c616f27bc89d0acd240097a0aa9c98c65c8 Mon Sep 17 00:00:00 2001 From: Jing Li Date: Mon, 15 Apr 2024 18:49:15 +0800 Subject: [PATCH] Update --- app/Admin/Controllers/Plan/PlanController.php | 23 ++++++++++++ app/Admin/Controllers/Plan/TaskController.php | 35 +++++++++++++++++++ app/Admin/Filters/TaskFilter.php | 13 +++++++ app/Admin/Services/Plan/TaskService.php | 19 ++++++++++ app/Admin/routes.php | 3 ++ .../Commands/TaskLedgerGenerateCommand.php | 29 +++++++++------ app/Models/PlanLedger.php | 4 --- app/Models/Task.php | 4 ++- app/Models/TaskLedger.php | 7 ++-- lang/zh_CN/plan.php | 14 ++++++++ 10 files changed, 130 insertions(+), 21 deletions(-) create mode 100644 app/Admin/Controllers/Plan/TaskController.php create mode 100644 app/Admin/Filters/TaskFilter.php create mode 100644 app/Admin/Services/Plan/TaskService.php diff --git a/app/Admin/Controllers/Plan/PlanController.php b/app/Admin/Controllers/Plan/PlanController.php index e51793b..34cc2ec 100644 --- a/app/Admin/Controllers/Plan/PlanController.php +++ b/app/Admin/Controllers/Plan/PlanController.php @@ -5,6 +5,7 @@ namespace App\Admin\Controllers\Plan; use App\Admin\Controllers\AdminController; use App\Admin\Services\Plan\PlanService; use App\Enums\PlanStatus; +use App\Enums\TaskStatus; use Illuminate\Support\Arr; use Slowlyo\OwlAdmin\Admin; use Slowlyo\OwlAdmin\Renderers\Form; @@ -161,6 +162,28 @@ class PlanController extends AdminController public function detail(): Form { return $this->baseDetail()->title('')->body([ + amis()->Property()->items([ + ['label' => __('plan.plan.name'), 'content' => '${name}'], + ['label' => __('plan.plan.type'), 'content' => amis()->Mapping()->name('planable_type')->map($this->planableTypeLabelMap)], + ['label' => __('plan.plan.status'), 'content' => amis()->Mapping()->name('plan_status')->map(PlanStatus::labelMap())], + ]), + + amis()->Divider(), + + // 总账录入 + amis()->CRUDTable() + ->api(admin_url('api/tasks?plan_id=${id}')) + ->columns([ + amis()->TableColumn('id', __('plan.task.id')), + amis()->TableColumn('name', __('plan.task.name')), + amis()->TableColumn('taskable.date', __('plan.task_ledger.date')), + amis()->TableColumn('taskable.store.title', __('plan.task_ledger.store')), + amis()->TableColumn('taskable.store.master.name', __('plan.task_ledger.store_master')), + amis()->TableColumn('task_status', __('plan.task.status'))->type('mapping')->map(TaskStatus::labelMap()), + amis()->TableColumn('completed_at', __('plan.task.completed_at')), + amis()->TableColumn('created_at', __('plan.task.created_at')), + ]) + ->visibleOn('${planable_type == "plan_ledgers"}'), ]); } } diff --git a/app/Admin/Controllers/Plan/TaskController.php b/app/Admin/Controllers/Plan/TaskController.php new file mode 100644 index 0000000..32298d6 --- /dev/null +++ b/app/Admin/Controllers/Plan/TaskController.php @@ -0,0 +1,35 @@ +input(), TaskFilter::class) + ->with([ + 'taskable' => function (MorphTo $morphTo) { + $morphTo->morphWith([ + TaskLedger::class => ['store.master'], + ]); + }, + ]) + ->latest('id') + ->get(); + + return $this->response()->success($tasks); + } +} diff --git a/app/Admin/Filters/TaskFilter.php b/app/Admin/Filters/TaskFilter.php new file mode 100644 index 0000000..e33157a --- /dev/null +++ b/app/Admin/Filters/TaskFilter.php @@ -0,0 +1,13 @@ +where('plan_id', $id); + } +} diff --git a/app/Admin/Services/Plan/TaskService.php b/app/Admin/Services/Plan/TaskService.php new file mode 100644 index 0000000..9a839d6 --- /dev/null +++ b/app/Admin/Services/Plan/TaskService.php @@ -0,0 +1,19 @@ +post('workflow/success', [WorkflowController::class, 'success']); $router->post('workflow/fail', [WorkflowController::class, 'fail']); $router->get('workflow/logs', [WorkflowController::class, 'logs']); + + $router->get('tasks', [TaskController::class, 'shareList']); }); }); diff --git a/app/Console/Commands/TaskLedgerGenerateCommand.php b/app/Console/Commands/TaskLedgerGenerateCommand.php index 8b16678..aa01cbb 100644 --- a/app/Console/Commands/TaskLedgerGenerateCommand.php +++ b/app/Console/Commands/TaskLedgerGenerateCommand.php @@ -44,28 +44,33 @@ class TaskLedgerGenerateCommand extends Command { /** @var \App\Models\PlanLedger */ $planable = DB::transaction(function () use ($datetime) { - $date = $datetime->format('Y-m-d'); + /** @var \App\Models\PlanLedger */ + $planable = PlanLedger::firstOrNew([ + 'date' => $datetime->format('Y-m-d'), + ]); - if (! is_null($planable = PlanLedger::where('date', $date)->first())) { + if ($planable->exists) { return $planable; } - /** @var \App\Models\PlanLedger */ - $planable = PlanLedger::create(['date' => $date]); + $planable->save(); $plan = $planable->plan()->create([ - 'name' => "{$date} 总账录入", + 'name' => "{$planable->date} 总账录入", 'plan_status' => PlanStatus::Published, ]); return $planable->setRelation('plan', $plan); }); - Store::lazyById()->each(function (Store $store) use ($planable) { + $stores = Store::all(); + + /** @var \App\Models\Store */ + foreach ($stores as $store) { DB::transaction(function () use ($store, $planable) { $taskable = TaskLedger::firstOrNew([ 'store_id' => $store->id, - 'date' => $planable->date->format('Y-m-d'), + 'date' => $planable->date, ]); if ($taskable->exists) { @@ -75,18 +80,20 @@ class TaskLedgerGenerateCommand extends Command $taskable->save(); $ledger = Ledger::where('store_id', $store->id) - ->where('date', $planable->date->format('Y-m-d')) + ->where('date', $planable->date) ->first(); + $date = Carbon::parse($planable->date); + $taskable->task()->create([ 'plan_id' => $planable->plan->id, 'name' => '总账录入', - 'start_at' => $planable->date->copy()->startOfDay(), - 'end_at' => $planable->date->copy()->endOfDay(), + 'start_at' => $date->copy()->startOfDay(), + 'end_at' => $date->copy()->endOfDay(), 'task_status' => $ledger ? TaskStatus::Success : TaskStatus::Pending, 'completed_at' => $ledger?->created_at, ]); }); - }); + } } } diff --git a/app/Models/PlanLedger.php b/app/Models/PlanLedger.php index befaae7..c53ec6f 100644 --- a/app/Models/PlanLedger.php +++ b/app/Models/PlanLedger.php @@ -11,10 +11,6 @@ class PlanLedger extends Model { use HasFactory, HasDateTimeFormatter; - protected $casts = [ - 'date' => 'date', - ]; - protected $fillable = [ 'date', ]; diff --git a/app/Models/Task.php b/app/Models/Task.php index 54307cd..c95e87b 100644 --- a/app/Models/Task.php +++ b/app/Models/Task.php @@ -3,13 +3,15 @@ namespace App\Models; use App\Enums\TaskStatus; +use App\Traits\HasDateTimeFormatter; +use EloquentFilter\Filterable; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\MorphTo; class Task extends Model { - use HasFactory; + use Filterable, HasFactory, HasDateTimeFormatter; protected $attributes = [ 'task_status' => TaskStatus::Pending, diff --git a/app/Models/TaskLedger.php b/app/Models/TaskLedger.php index d0aeaf1..3bed357 100644 --- a/app/Models/TaskLedger.php +++ b/app/Models/TaskLedger.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Traits\HasDateTimeFormatter; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -9,11 +10,7 @@ use Illuminate\Database\Eloquent\Relations\MorphOne; class TaskLedger extends Model { - use HasFactory; - - protected $casts = [ - 'date' => 'date', - ]; + use HasFactory, HasDateTimeFormatter; protected $fillable = [ 'store_id', diff --git a/lang/zh_CN/plan.php b/lang/zh_CN/plan.php index ec98acb..0e86ad2 100644 --- a/lang/zh_CN/plan.php +++ b/lang/zh_CN/plan.php @@ -14,4 +14,18 @@ return [ 'store_level' => '门店等级', 'performance' => '业绩', ], + + 'task' => [ + 'id' => 'ID', + 'name' => '任务名称', + 'status' => '状态', + 'completed_at' => '完成时间', + 'created_at' => '创建时间', + ], + + 'task_ledger' => [ + 'date' => '日期', + 'store' => '门店', + 'store_master' => '店长', + ], ];