planable)) { case PlanPerformance::class: $payload = $data['task_performance'] ?? []; Validator::validate( data: $payload, rules: [ 'store_id' => ['bail', 'required'], 'expected_performance' => ['bail', 'required', 'numeric', 'min:0'], ], attributes: [ 'store_id' => __('plan.task_performance.store'), 'expected_performance' => __('plan.task_performance.expected_performance'), ], ); /** @var \App\Models\Store */ $store = Store::findOrFail($payload['store_id']); if ( TaskPerformance::where('store_id', $store->id) ->where('month', $planable->month) ->exists() ) { admin_abort('门店已有业绩指标任务'); } // 月份 $month = Carbon::createFromFormat('Y-m', $planable->month); // 开始时间 $startAt = $month->copy()->startOfMonth(); // 结束时间 $endAt = $month->copy()->endOfMonth(); // 门店实际业绩 $totalSales = Ledger::where('store_id', $store->id) ->whereBetween('date', [$startAt->format('Y-m-d'), $endAt->format('Y-m-d')]) ->sum('sales'); /** @var \App\Models\TaskPerformance */ $taskable = TaskPerformance::create([ 'month' => $planable->month, 'store_id' => $store->id, 'store_master_id' => $store->master_id, 'expected_performance' => $payload['expected_performance'], 'actual_performance' => $totalSales, ]); // 月份 $month = Carbon::createFromFormat('Y-m', $planable->month); $taskable->task()->create([ 'plan_id' => $plan->id, 'name' => '业绩指标', 'start_at' => $month->copy()->startOfMonth(), 'end_at' => $month->copy()->endOfMonth(), 'task_status' => $taskable->isCompleted() ? TaskStatus::Success : TaskStatus::Pending, 'completed_at' => $taskable->isCompleted() ? now() : null, ]); break; case PlanHygiene::class: $payload = $data['task_hygiene'] ?? []; Validator::validate( data: $payload, rules: [ 'store_id' => ['bail', 'required'], ], attributes: [ 'store_id' => __('plan.task_hygiene.store'), ], ); /** @var \App\Models\Store */ $store = Store::findOrFail($payload['store_id']); if ( TaskHygiene::where('store_id', $store->id) ->where('month', $planable->month) ->exists() ) { admin_abort('门店已有清洁卫生任务'); } $taskable = TaskHygiene::create([ 'month' => $planable->month, 'store_id' => $store->id, 'store_master_id' => $store->master_id, ]); // 月份 $month = Carbon::createFromFormat('Y-m', $planable->month); $taskable->task()->create([ 'plan_id' => $plan->id, 'name' => '清洁卫生', 'start_at' => $month->copy()->startOfMonth(), 'end_at' => $month->copy()->endOfMonth(), 'task_status' => TaskStatus::Pending, ]); break; default: admin_abort('任务计划不可新增任务'); break; } return true; } public function update($primaryKey, $data): bool { $task = Task::findOrFail($primaryKey); if (in_array($task->task_status, [TaskStatus::Success, TaskStatus::Failed])) { admin_abort("[{$task->task_status->text()}]任务不可修改"); } switch (get_class($taskable = $task->taskable)) { case TaskPerformance::class: $payload = $data['task_performance'] ?? []; Validator::validate( data: $payload, rules: [ 'expected_performance' => ['bail', 'required', 'numeric', 'min:0'], ], attributes: [ 'expected_performance' => __('plan.task_performance.expected_performance'), ], ); $taskable->update([ 'expected_performance' => $payload['expected_performance'], ]); if ($taskable->isCompleted() && ! $task->isSuccess()) { $task->update([ 'task_status' => TaskStatus::Success, 'completed_at' => now(), ]); } break; default: admin_abort('任务不可修改'); break; } return true; } public function preDelete(array $ids): void { /** @var \Illuminate\Database\Eloquent\Collection */ $tasks = Task::findMany($ids); $tasks->each(fn (Task $task) => $task->taskable()->delete()); } }