main
Jing Li 2024-04-17 21:57:32 +08:00
parent 9dbb4b0af7
commit 28382facf7
2 changed files with 66 additions and 43 deletions

View File

@ -6,6 +6,9 @@ use App\Admin\Controllers\AdminController;
use App\Admin\Services\Plan\PlanService; use App\Admin\Services\Plan\PlanService;
use App\Enums\PlanStatus; use App\Enums\PlanStatus;
use App\Enums\TaskStatus; use App\Enums\TaskStatus;
use App\Models\PlanHygiene;
use App\Models\PlanLedger;
use App\Models\PlanPerformance;
use Illuminate\Support\Arr; use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Slowlyo\OwlAdmin\Admin; use Slowlyo\OwlAdmin\Admin;
@ -21,18 +24,6 @@ class PlanController extends AdminController
{ {
protected string $serviceName = PlanService::class; protected string $serviceName = PlanService::class;
protected array $planableTypes = [
'plan_ledgers' => '总账录入',
'plan_performances' => '业绩指标',
'plan_hygienes' => '清洁卫生',
];
protected array $planableTypeLabelMap = [
'plan_ledgers' => '<span class="label label-primary">总账录入</span>',
'plan_performances' => '<span class="label label-danger">业绩指标</span>',
'plan_hygienes' => '<span class="label label-success">清洁卫生</span>',
];
public function list(): Page public function list(): Page
{ {
$crud = $this->baseCRUD() $crud = $this->baseCRUD()
@ -54,7 +45,7 @@ class PlanController extends AdminController
->name('planable_type') ->name('planable_type')
->label(__('plan.plan.type')) ->label(__('plan.plan.type'))
->multiple() ->multiple()
->options($this->planableTypes) ->options($this->planableTypeOptions())
->clearable(), ->clearable(),
amis()->SelectControl() amis()->SelectControl()
@ -68,7 +59,7 @@ class PlanController extends AdminController
->columns([ ->columns([
amis()->TableColumn('id', __('plan.plan.id')), amis()->TableColumn('id', __('plan.plan.id')),
amis()->TableColumn('name', __('plan.plan.name')), amis()->TableColumn('name', __('plan.plan.name')),
amis()->TableColumn('planable_type', __('plan.plan.type'))->type('mapping')->map($this->planableTypeLabelMap), amis()->TableColumn('planable_type', __('plan.plan.type'))->type('mapping')->map($this->planableTypeLabelMap()),
amis()->TableColumn('plan_status', __('plan.plan.status'))->type('mapping')->map(PlanStatus::labelMap()), amis()->TableColumn('plan_status', __('plan.plan.status'))->type('mapping')->map(PlanStatus::labelMap()),
amis()->TableColumn('created_at', __('plan.plan.created_at')), amis()->TableColumn('created_at', __('plan.plan.created_at')),
$this->rowActions([ $this->rowActions([
@ -91,11 +82,14 @@ class PlanController extends AdminController
public function form(): Form public function form(): Form
{ {
$planableTypePerformance = (new PlanPerformance())->getMorphClass();
$planableTypeHygiene = (new PlanHygiene())->getMorphClass();
return $this->baseForm()->title('')->body([ return $this->baseForm()->title('')->body([
amis()->SelectControl() amis()->SelectControl()
->name('planable_type') ->name('planable_type')
->label(__('plan.plan.type')) ->label(__('plan.plan.type'))
->options(Arr::except($this->planableTypes, ['plan_ledgers'])) ->options(Arr::except($this->planableTypeOptions(), [(new PlanLedger())->getMorphClass()]))
->required() ->required()
->disabledOn('${planable_id > 0}'), ->disabledOn('${planable_id > 0}'),
@ -112,7 +106,7 @@ class PlanController extends AdminController
->value('${planable.month}') ->value('${planable.month}')
->required() ->required()
->valueFormat('YYYY-MM') ->valueFormat('YYYY-MM')
->visibleOn('${planable_type == "plan_performances"}'), ->visibleOn('${planable_type == "'.$planableTypePerformance.'"}'),
amis()->TreeSelectControl() amis()->TreeSelectControl()
->name('plan_performance[store_category_id]') ->name('plan_performance[store_category_id]')
->label(__('plan.plan_performance.store_category')) ->label(__('plan.plan_performance.store_category'))
@ -122,7 +116,7 @@ class PlanController extends AdminController
->onlyLeaf(true) ->onlyLeaf(true)
->value('${planable.store_category_id}') ->value('${planable.store_category_id}')
->required() ->required()
->visibleOn('${planable_type == "plan_performances"}'), ->visibleOn('${planable_type == "'.$planableTypePerformance.'"}'),
amis()->SelectControl() amis()->SelectControl()
->name('plan_performance[store_level_id]') ->name('plan_performance[store_level_id]')
->label(__('plan.plan_performance.store_level')) ->label(__('plan.plan_performance.store_level'))
@ -131,7 +125,7 @@ class PlanController extends AdminController
->valueField('key') ->valueField('key')
->value('${planable.store_level_id}') ->value('${planable.store_level_id}')
->clearable() ->clearable()
->visibleOn('${planable_type == "plan_performances"}'), ->visibleOn('${planable_type == "'.$planableTypePerformance.'"}'),
amis()->NumberControl() amis()->NumberControl()
->name('plan_performance[performance]') ->name('plan_performance[performance]')
->label(__('plan.plan_performance.performance')) ->label(__('plan.plan_performance.performance'))
@ -140,7 +134,7 @@ class PlanController extends AdminController
->precision(2) ->precision(2)
->showSteps(false) ->showSteps(false)
->required() ->required()
->visibleOn('${planable_type == "plan_performances"}'), ->visibleOn('${planable_type == "'.$planableTypePerformance.'"}'),
// 清洁卫生 // 清洁卫生
amis()->MonthControl() amis()->MonthControl()
@ -149,7 +143,7 @@ class PlanController extends AdminController
->value('${planable.month}') ->value('${planable.month}')
->required() ->required()
->valueFormat('YYYY-MM') ->valueFormat('YYYY-MM')
->visibleOn('${planable_type == "plan_hygienes"}'), ->visibleOn('${planable_type == "'.$planableTypeHygiene.'"}'),
amis()->SelectControl() amis()->SelectControl()
->name('plan_hygiene[store_ids]') ->name('plan_hygiene[store_ids]')
->label(__('plan.plan_hygiene.store')) ->label(__('plan.plan_hygiene.store'))
@ -161,26 +155,30 @@ class PlanController extends AdminController
->labelField('title') ->labelField('title')
->valueField('id') ->valueField('id')
->searchable() ->searchable()
->visibleOn('${planable_type == "plan_hygienes"}'), ->visibleOn('${planable_type == "'.$planableTypeHygiene.'"}'),
]); ]);
} }
public function detail(): Form public function detail(): Form
{ {
$planableTypeLedger = (new PlanLedger())->getMorphClass();
$planableTypePerformance = (new PlanPerformance())->getMorphClass();
$planableTypeHygiene = (new PlanHygiene())->getMorphClass();
return $this->baseDetail()->title('')->body([ return $this->baseDetail()->title('')->body([
amis()->Property()->items([ amis()->Property()->items([
['label' => __('plan.plan.name'), 'content' => '${name}'], ['label' => __('plan.plan.name'), 'content' => '${name}'],
['label' => __('plan.plan.type'), 'content' => amis()->Mapping()->name('planable_type')->map($this->planableTypeLabelMap)], ['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())], ['label' => __('plan.plan.status'), 'content' => amis()->Mapping()->name('plan_status')->map(PlanStatus::labelMap())],
// 总账录入 // 总账录入
['label' => __('plan.plan_ledger.date'), 'content' => '${planable.date}', 'visibleOn' => '${planable_type == "plan_ledgers"}'], ['label' => __('plan.plan_ledger.date'), 'content' => '${planable.date}', 'visibleOn' => '${planable_type == "'.$planableTypeLedger.'"}'],
// 业绩指标 // 业绩指标
['label' => __('plan.plan_performance.month'), 'content' => '${planable.month}', 'visibleOn' => '${planable_type == "plan_performances"}'], ['label' => __('plan.plan_performance.month'), 'content' => '${planable.month}', 'visibleOn' => '${planable_type == "'.$planableTypePerformance.'"}'],
['label' => __('plan.plan_performance.store_category'), 'content' => '${planable.store_category.name}', 'visibleOn' => '${planable_type == "plan_performances"}'], ['label' => __('plan.plan_performance.store_category'), 'content' => '${planable.store_category.name}', 'visibleOn' => '${planable_type == "'.$planableTypePerformance.'"}'],
['label' => __('plan.plan_performance.store_level'), 'content' => '${planable.store_level.name}', 'visibleOn' => '${planable_type == "plan_performances"}'], ['label' => __('plan.plan_performance.store_level'), 'content' => '${planable.store_level.name}', 'visibleOn' => '${planable_type == "'.$planableTypePerformance.'"}'],
['label' => __('plan.plan_performance.performance'), 'content' => '${planable.performance}', 'visibleOn' => '${planable_type == "plan_performances"}'], ['label' => __('plan.plan_performance.performance'), 'content' => '${planable.performance}', 'visibleOn' => '${planable_type == "'.$planableTypePerformance.'"}'],
// 清洁卫生 // 清洁卫生
['label' => __('plan.plan_hygiene.month'), 'content' => '${planable.month}', 'visibleOn' => '${planable_type == "plan_hygienes"}'], ['label' => __('plan.plan_hygiene.month'), 'content' => '${planable.month}', 'visibleOn' => '${planable_type == "'.$planableTypeHygiene.'"}'],
[ [
'label' => __('plan.plan_hygiene.store'), 'label' => __('plan.plan_hygiene.store'),
'content' => amis()->Each() 'content' => amis()->Each()
@ -188,7 +186,7 @@ class PlanController extends AdminController
->items( ->items(
amis()->Tpl()->tpl('<span class="label label-primary m-l-sm">${title}</span>') amis()->Tpl()->tpl('<span class="label label-primary m-l-sm">${title}</span>')
), ),
'visibleOn' => '${planable_type == "plan_hygienes"}', 'visibleOn' => '${planable_type == "'.$planableTypeHygiene.'"}',
], ],
]), ]),
@ -207,7 +205,7 @@ class PlanController extends AdminController
amis()->TableColumn('completed_at', __('plan.task.completed_at')), amis()->TableColumn('completed_at', __('plan.task.completed_at')),
amis()->TableColumn('created_at', __('plan.task.created_at')), amis()->TableColumn('created_at', __('plan.task.created_at')),
]) ])
->visibleOn('${planable_type == "plan_ledgers"}'), ->visibleOn('${planable_type == "'.$planableTypeLedger.'"}'),
// 业绩指标 // 业绩指标
amis()->CRUDTable() amis()->CRUDTable()
@ -227,7 +225,7 @@ class PlanController extends AdminController
amis()->TableColumn('completed_at', __('plan.task.completed_at')), amis()->TableColumn('completed_at', __('plan.task.completed_at')),
amis()->TableColumn('created_at', __('plan.task.created_at')), amis()->TableColumn('created_at', __('plan.task.created_at')),
]) ])
->visibleOn('${planable_type == "plan_performances"}'), ->visibleOn('${planable_type == "'.$planableTypePerformance.'"}'),
// 清洁卫生 // 清洁卫生
amis()->CRUDTable() amis()->CRUDTable()
@ -245,7 +243,7 @@ class PlanController extends AdminController
amis()->TableColumn('completed_at', __('plan.task.completed_at')), amis()->TableColumn('completed_at', __('plan.task.completed_at')),
amis()->TableColumn('created_at', __('plan.task.created_at')), amis()->TableColumn('created_at', __('plan.task.created_at')),
]) ])
->visibleOn('${planable_type == "plan_hygienes"}'), ->visibleOn('${planable_type == "'.$planableTypeHygiene.'"}'),
]); ]);
} }
@ -275,4 +273,26 @@ class PlanController extends AdminController
->confirmText('是否发布选中的任务计划?') ->confirmText('是否发布选中的任务计划?')
->api('post:' . admin_url('/plan/plans/${id}/publish')); ->api('post:' . admin_url('/plan/plans/${id}/publish'));
} }
protected function planableTypeOptions(): array
{
return [
(new PlanLedger())->getMorphClass() => '总账录入',
(new PlanPerformance())->getMorphClass() => '业绩指标',
(new PlanHygiene())->getMorphClass() => '清洁卫生',
];
}
protected function planableTypeLabelMap(): array
{
$planableTypeLedger = (new PlanLedger())->getMorphClass();
$planableTypePerformance = (new PlanPerformance())->getMorphClass();
$planableTypeHygiene = (new PlanHygiene())->getMorphClass();
return [
$planableTypeLedger => '<span class="label label-primary">'.$this->planableTypeOptions()[$planableTypeLedger ].'</span>',
$planableTypePerformance => '<span class="label label-danger">'.$this->planableTypeOptions()[$planableTypePerformance ].'</span>',
$planableTypeHygiene => '<span class="label label-success">'.$this->planableTypeOptions()[$planableTypeHygiene ].'</span>',
];
}
} }

View File

@ -32,19 +32,22 @@ class PlanService extends BaseService
public function store($data): bool public function store($data): bool
{ {
$planableTypePerformance = (new PlanPerformance())->getMorphClass();
$planableTypeHygiene = (new PlanHygiene())->getMorphClass();
$rules = array_merge( $rules = array_merge(
[ [
'name' => ['bail', 'required', 'max:255'], 'name' => ['bail', 'required', 'max:255'],
'planable_type' => ['bail', 'required', Rule::in(['plan_performances', 'plan_hygienes'])], 'planable_type' => ['bail', 'required', Rule::in([$planableTypePerformance, $planableTypeHygiene])],
], ],
match ($data['planable_type'] ?? '') { match ($data['planable_type'] ?? '') {
'plan_performances' => [ $planableTypePerformance => [
'plan_performance.month' => ['bail', 'required', 'date_format:Y-m'], 'plan_performance.month' => ['bail', 'required', 'date_format:Y-m'],
'plan_performance.store_category_id' => ['bail', 'required', Rule::exists(Keyword::class, 'key')], '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.store_level_id' => ['bail', 'nullable', Rule::exists(Keyword::class, 'key')],
'plan_performance.performance' => ['bail', 'required', 'numeric', 'min:0'], 'plan_performance.performance' => ['bail', 'required', 'numeric', 'min:0'],
], ],
'plan_hygienes' => [ $planableTypeHygiene => [
'plan_hygiene.month' => ['bail', 'required', 'date_format:Y-m'], 'plan_hygiene.month' => ['bail', 'required', 'date_format:Y-m'],
], ],
}, },
@ -65,11 +68,11 @@ class PlanService extends BaseService
); );
switch ($data['planable_type']) { switch ($data['planable_type']) {
case 'plan_performances': case $planableTypePerformance:
$planable = PlanPerformance::create($data['plan_performance']); $planable = PlanPerformance::create($data['plan_performance']);
break; break;
case 'plan_hygienes': case $planableTypeHygiene:
$planable = PlanHygiene::create($data['plan_hygiene']); $planable = PlanHygiene::create($data['plan_hygiene']);
break; break;
} }
@ -95,14 +98,14 @@ class PlanService extends BaseService
[ [
'name' => ['filled', 'max:255'], 'name' => ['filled', 'max:255'],
], ],
match ($plan->planable_type) { match (get_class($plan->planable)) {
'plan_performances' => [ PlanPerformance::class => [
'plan_performance.month' => ['bail', 'required', 'date_format:Y-m'], 'plan_performance.month' => ['bail', 'required', 'date_format:Y-m'],
'plan_performance.store_category_id' => ['bail', 'required', Rule::exists(Keyword::class, 'key')], '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.store_level_id' => ['bail', 'nullable', Rule::exists(Keyword::class, 'key')],
'plan_performance.performance' => ['bail', 'required', 'numeric', 'min:0'], 'plan_performance.performance' => ['bail', 'required', 'numeric', 'min:0'],
], ],
'plan_hygienes' => [ PlanHygiene::class => [
'plan_hygiene.month' => ['bail', 'required', 'date_format:Y-m'], 'plan_hygiene.month' => ['bail', 'required', 'date_format:Y-m'],
], ],
}, },
@ -126,12 +129,12 @@ class PlanService extends BaseService
} }
$plan->save(); $plan->save();
switch ($plan->planable_type) { switch (get_class($plan->planable)) {
case 'plan_performances': case PlanPerformance::class:
$plan->planable->update($data['plan_performance']); $plan->planable->update($data['plan_performance']);
break; break;
case 'plan_hygienes': case PlanHygiene::class:
$plan->planable->update($data['plan_hygiene']); $plan->planable->update($data['plan_hygiene']);
break; break;
} }