store-manage/app/Admin/Services/Plan/PlanService.php

152 lines
5.1 KiB
PHP

<?php
namespace App\Admin\Services\Plan;
use App\Admin\Filters\PlanFilter;
use App\Admin\Services\BaseService;
use App\Enums\PlanStatus;
use App\Models\Keyword;
use App\Models\Plan;
use App\Models\PlanHygiene;
use App\Models\PlanPerformance;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
/**
* @method Plan getModel()
* @method Plan|Builder query()
*/
class PlanService extends BaseService
{
protected string $modelName = Plan::class;
protected string $modelFilterName = PlanFilter::class;
public function store($data): bool
{
$rules = array_merge(
[
'name' => ['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']);
}
}
}