store-manage/app/Admin/Controllers/Plan/PlanController.php

299 lines
14 KiB
PHP

<?php
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 App\Models\PlanHygiene;
use App\Models\PlanLedger;
use App\Models\PlanPerformance;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
use Slowlyo\OwlAdmin\Admin;
use Slowlyo\OwlAdmin\Renderers\AjaxAction;
use Slowlyo\OwlAdmin\Renderers\Form;
use Slowlyo\OwlAdmin\Renderers\Page;
use Throwable;
/**
* @property PlanService $service
*/
class PlanController extends AdminController
{
protected string $serviceName = PlanService::class;
public function list(): Page
{
$crud = $this->baseCRUD()
->headerToolbar([
$this->createTypeButton('drawer', 'lg')
->visible(Admin::user()->can('admin.plan.plans.create')),
...$this->baseHeaderToolBar(),
])
->bulkActions([])
->filter($this->baseFilter()->body([
amis()->GroupControl()->mode('horizontal')->body([
amis()->TextControl()
->name('name')
->label(__('plan.plan.name'))
->placeholder(__('plan.plan.name'))
->clearable(),
amis()->SelectControl()
->name('planable_type')
->label(__('plan.plan.type'))
->multiple()
->options($this->planableTypeOptions())
->clearable(),
amis()->SelectControl()
->name('plan_status')
->label(__('plan.plan.status'))
->multiple()
->options(PlanStatus::options())
->clearable(),
]),
]))
->columns([
amis()->TableColumn('id', __('plan.plan.id')),
amis()->TableColumn('name', __('plan.plan.name')),
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('created_at', __('plan.plan.created_at')),
$this->rowActions([
$this->rowPublishButton()
->visible(Admin::user()->can('admin.plan.plans.publish'))
->visibleOn('${plan_status == '.PlanStatus::Pending->value.'}'),
$this->rowEditTypeButton('drawer', 'lg')
->visible(Admin::user()->can('admin.plan.plans.update'))
->visibleOn('${plan_status == '.PlanStatus::Pending->value.'}'),
$this->rowDeleteButton()
->visible(Admin::user()->can('admin.plan.plans.delete'))
->visibleOn('${plan_status == '.PlanStatus::Pending->value.'}'),
$this->rowShowButton()
->visible(Admin::user()->can('admin.plan.plans.view')),
]),
]);
return $this->baseList($crud);
}
public function form(): Form
{
$planableTypePerformance = (new PlanPerformance())->getMorphClass();
$planableTypeHygiene = (new PlanHygiene())->getMorphClass();
return $this->baseForm()->title('')->body([
amis()->SelectControl()
->name('planable_type')
->label(__('plan.plan.type'))
->options(Arr::except($this->planableTypeOptions(), [(new PlanLedger())->getMorphClass()]))
->required()
->disabledOn('${planable_id > 0}'),
amis()->TextControl()
->name('name')
->label(__('plan.plan.name'))
->placeholder(__('plan.plan.name'))
->required(),
// 业绩指标
amis()->MonthControl()
->name('plan_performance[month]')
->label(__('plan.plan_performance.month'))
->value('${planable.month}')
->required()
->valueFormat('YYYY-MM')
->visibleOn('${planable_type == "'.$planableTypePerformance.'"}'),
amis()->TreeSelectControl()
->name('plan_performance[store_category_id]')
->label(__('plan.plan_performance.store_category'))
->source(admin_url('api/keywords/tree-list?parent_key=store_category'))
->labelField('name')
->valueField('key')
->onlyLeaf(true)
->value('${planable.store_category_id}')
->required()
->visibleOn('${planable_type == "'.$planableTypePerformance.'"}'),
amis()->SelectControl()
->name('plan_performance[store_level_id]')
->label(__('plan.plan_performance.store_level'))
->source(admin_url('api/keywords/tree-list?parent_key=store_level'))
->labelField('name')
->valueField('key')
->value('${planable.store_level_id}')
->clearable()
->visibleOn('${planable_type == "'.$planableTypePerformance.'"}'),
amis()->NumberControl()
->name('plan_performance[performance]')
->label(__('plan.plan_performance.performance'))
->placeholder(__('plan.plan_performance.performance'))
->value('${planable.performance}')
->precision(2)
->showSteps(false)
->required()
->visibleOn('${planable_type == "'.$planableTypePerformance.'"}'),
// 清洁卫生
amis()->MonthControl()
->name('plan_hygiene[month]')
->label(__('plan.plan_hygiene.month'))
->value('${planable.month}')
->required()
->valueFormat('YYYY-MM')
->visibleOn('${planable_type == "'.$planableTypeHygiene.'"}'),
amis()->SelectControl()
->name('plan_hygiene[store_ids]')
->label(__('plan.plan_hygiene.store'))
->value('${planable.store_ids}')
->multiple()
->joinValues(false)
->extractValue(true)
->source(admin_url('api/stores?_all=1'))
->labelField('title')
->valueField('id')
->searchable()
->visibleOn('${planable_type == "'.$planableTypeHygiene.'"}'),
]);
}
public function detail(): Form
{
$planableTypeLedger = (new PlanLedger())->getMorphClass();
$planableTypePerformance = (new PlanPerformance())->getMorphClass();
$planableTypeHygiene = (new PlanHygiene())->getMorphClass();
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())],
// 总账录入
['label' => __('plan.plan_ledger.date'), 'content' => '${planable.date}', 'visibleOn' => '${planable_type == "'.$planableTypeLedger.'"}'],
// 业绩指标
['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 == "'.$planableTypePerformance.'"}'],
['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 == "'.$planableTypePerformance.'"}'],
// 清洁卫生
['label' => __('plan.plan_hygiene.month'), 'content' => '${planable.month}', 'visibleOn' => '${planable_type == "'.$planableTypeHygiene.'"}'],
[
'label' => __('plan.plan_hygiene.store'),
'content' => amis()->Each()
->name('planable.stores')
->items(
amis()->Tpl()->tpl('<span class="label label-primary m-l-sm">${title}</span>')
),
'visibleOn' => '${planable_type == "'.$planableTypeHygiene.'"}',
],
]),
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 == "'.$planableTypeLedger.'"}'),
// 业绩指标
amis()->CRUDTable()
->api(admin_url('api/tasks?plan_id=${id}'))
->headerToolbar([
amis('reload')->align('right'),
])
->columns([
amis()->TableColumn('id', __('plan.task.id')),
amis()->TableColumn('name', __('plan.task.name')),
amis()->TableColumn('taskable.month', __('plan.task_performance.month')),
amis()->TableColumn('taskable.store.title', __('plan.task_performance.store')),
amis()->TableColumn('taskable.store_master.name', __('plan.task_performance.store_master')),
amis()->TableColumn('taskable.actual_performance', __('plan.task_performance.actual_performance')),
amis()->TableColumn('taskable.expected_performance', __('plan.task_performance.expected_performance')),
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 == "'.$planableTypePerformance.'"}'),
// 清洁卫生
amis()->CRUDTable()
->api(admin_url('api/tasks?plan_id=${id}'))
->headerToolbar([
amis('reload')->align('right'),
])
->columns([
amis()->TableColumn('id', __('plan.task.id')),
amis()->TableColumn('name', __('plan.task.name')),
amis()->TableColumn('taskable.month', __('plan.plan_hygiene.month')),
amis()->TableColumn('taskable.store.title', __('plan.plan_hygiene.store')),
amis()->TableColumn('taskable.store_master.name', __('plan.plan_hygiene.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 == "'.$planableTypeHygiene.'"}'),
]);
}
/**
* 发布任务计划
*/
public function publish($id)
{
try {
DB::transaction(fn () => $this->service->publish($id));
} catch (Throwable $th) {
return $this->renderException($th);
}
return $this->response()->successMessage('发布成功');
}
/**
* 行发布按钮
*/
protected function rowPublishButton(): AjaxAction
{
return amis()->AjaxAction()
->label('发布')
->icon('fa fa-send-o')
->level('link')
->confirmText('是否发布选中的任务计划?')
->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>',
];
}
}