['bail', 'required', 'max:255'], 'planable_type' => ['bail', 'required', Rule::in(['plan_performances', 'plan_hygienes'])], ], match ($data['planable_type'] ?? '') { 'plan_performances' => [ 'plan_performance.month' => ['bail', 'required', 'date_format:Y-m'], 'plan_performance.store_category_id' => ['bail', 'required', Rule::exists(Keyword::class, 'key')], 'plan_performance.store_level_id' => ['bail', 'nullable', Rule::exists(Keyword::class, 'key')], 'plan_performance.performance' => ['bail', 'required', 'numeric', 'min:0'], ], 'plan_hygienes' => [ 'plan_hygiene.month' => ['bail', 'required', 'date_format:Y-m'], ], }, ); Validator::validate( data: $data, rules: $rules, attributes: [ 'name' => __('plan.plan.name'), 'planable_type' => __('plan.plan.type'), 'plan_performance.month' => __('plan.plan.month'), 'plan_performance.store_category_id' => __('plan.plan.store_category_id'), 'plan_performance.store_level_id' => __('plan.plan.store_level_id'), 'plan_performance.performance' => __('plan.plan.performance'), 'plan_hygiene.month' => __('plan.plan.month'), ], ); switch ($data['planable_type']) { case 'plan_performances': $planable = PlanPerformance::create($data['plan_performance']); break; case 'plan_hygienes': $planable = PlanHygiene::create($data['plan_hygiene']); break; } $planable->plan()->create([ 'name' => $data['name'], 'plan_status' => PlanStatus::Pending, ]); return true; } public function update($primaryKey, $data): bool { /** @var \App\Models\Plan|null */ $plan = Plan::findOrFail($primaryKey); if ($plan->isPublished()) { admin_abort('任务计划已发布'); } $rules = array_merge( [ 'name' => ['filled', 'max:255'], ], match ($plan->planable_type) { 'plan_performances' => [ 'plan_performance.month' => ['bail', 'required', 'date_format:Y-m'], 'plan_performance.store_category_id' => ['bail', 'required', Rule::exists(Keyword::class, 'key')], 'plan_performance.store_level_id' => ['bail', 'nullable', Rule::exists(Keyword::class, 'key')], 'plan_performance.performance' => ['bail', 'required', 'numeric', 'min:0'], ], 'plan_hygienes' => [ 'plan_hygiene.month' => ['bail', 'required', 'date_format:Y-m'], ], }, ); Validator::validate( data: $data, rules: $rules, attributes: [ 'name' => __('plan.plan.name'), 'plan_performance.month' => __('plan.plan.month'), 'plan_performance.store_category_id' => __('plan.plan.store_category_id'), 'plan_performance.store_level_id' => __('plan.plan.store_level_id'), 'plan_performance.performance' => __('plan.plan.performance'), 'plan_hygiene.month' => __('plan.plan.month'), ], ); if (array_key_exists('name', $data)) { $plan->name = $data['name']; } $plan->save(); switch ($plan->planable_type) { case 'plan_performances': $plan->planable->update($data['plan_performance']); break; case 'plan_hygienes': $plan->planable->update($data['plan_hygiene']); break; } return true; } public function preDelete(array $ids): void { /** @var \Illuminate\Database\Eloquent\Collection */ $plans = Plan::findMany($ids); if ($plans->contains(fn (Plan $plan) => $plan->isPublished())) { admin_abort('不能删除已发布的任务计划'); } } public function addRelations($query, string $scene = 'list') { if (in_array($scene, ['edit', 'detail'])) { $query->with(['planable']); } } }