store-manage/app/Admin/Controllers/Hr/EmployeeController.php

158 lines
8.4 KiB
PHP

<?php
namespace App\Admin\Controllers\Hr;
use App\Admin\Controllers\AdminController;
use App\Admin\Services\EmployeeService;
use App\Enums\EmployeeStatus;
use App\Models\Employee;
use Illuminate\Http\Request;
use Slowlyo\OwlAdmin\Admin;
use Slowlyo\OwlAdmin\Renderers\Form;
use Slowlyo\OwlAdmin\Renderers\Page;
class EmployeeController extends AdminController
{
protected string $serviceName = EmployeeService::class;
public function list(): Page
{
$crud = $this->baseCRUD()
->tableLayout('fixed')
->headerToolbar([
$this->createTypeButton('drawer', 'lg')->visible(Admin::user()->can('admin.hr.employees.create')),
...$this->baseHeaderToolBar(),
$this->exportAction(true)->visible($user->can('admin.hr.employees.export')),
])
->bulkActions([])
->filter($this->baseFilter()->body([
amis()->GroupControl()->mode('horizontal')->body([
amisMake()->TextControl()->name('name')->label(__('employee.name'))->columnRatio(3)->clearable(),
amisMake()->TextControl()->name('phone')->label(__('employee.phone'))->columnRatio(3)->clearable(),
amisMake()->SelectControl()->name('employee_status')->label(__('employee.employee_status'))->columnRatio(3)->clearable()->options(EmployeeStatus::options()),
]),
]))
->filterDefaultVisible()
->columns([
amisMake()->TableColumn()->name('id')->label(__('employee.id')),
amisMake()->TableColumn()->name('name')->label(__('employee.name')),
amisMake()->TableColumn()->name('avatar')->label(__('employee.avatar'))->type('avatar')->src('${avatar}'),
amisMake()->TableColumn()->name('jobs')->label(__('employee.jobs'))->type('each')->items(amisMake()->Tag()->label('${name}')),
amisMake()->TableColumn()->name('phone')->label(__('employee.phone')),
amisMake()->TableColumn()->name('employee_status_text')->label(__('employee.employee_status'))->set('type', 'tag')->set('color', '${employee_status_color}'),
amisMake()->TableColumn()->name('store.title')->label(__('employee.store_id')),
amisMake()->TableColumn()->name('remarks')->label(__('employee.remarks')),
amis()->TableColumn()->name('is_sign')->label(__('employee.is_sign'))->type('switch'),
$this->rowActions([
$this->rowShowButton()->visible(Admin::user()->can('admin.hr.employees.view')),
$this->rowEditTypeButton('drawer', 'lg')->visible(Admin::user()->can('admin.hr.employees.update')),
$this->rowDeleteButton()->visible(Admin::user()->can('admin.hr.employees.delete')),
amisMake()->AjaxAction()
->label(__('employee.leave'))
->level('link')
->icon('fa fa-sign-out')
->confirmText(__('employee.leave_confirm'))
->api('post:'.admin_url('hr/employees/${id}/leave'))
->visible(Admin::user()->can('admin.hr.employees.leave'))
->visibleOn('${employee_status == '.EmployeeStatus::Online->value.'}'),
amisMake()->AjaxAction()
->label(__('employee.reback'))
->level('link')
->icon('fa fa-sign-out')
->confirmText(__('employee.leave_confirm'))
->api('post:'.admin_url('hr/employees/${id}/leave'))
->visible(Admin::user()->can('admin.hr.employees.leave'))
->visibleOn('${employee_status == '.EmployeeStatus::Offline->value.'}'),
]),
]);
return $this->baseList($crud);
}
public function form($edit): Form
{
return $this->baseForm()->title('')->body([
amisMake()->ImageControl()->name('avatar')->label(__('employee.avatar'))->receiver($this->uploadImagePath().'?full-url=1'),
amisMake()->TextControl()->name('name')->label(__('employee.name'))->required(),
amisMake()->TextControl()->name('phone')->label(__('employee.phone'))->required(),
amisMake()->TagControl()->name('jobs')->label(__('employee.jobs'))
->source(admin_url('api/keywords/tree-list').'?parent_key='.Employee::JOB_KEY)
->labelField('name')
->valueField('key')
->extractValue(true)
->joinValues(false),
amisMake()->DateControl()->name('join_at')->label(__('employee.join_at'))->format('YYYY-MM-DD'),
amisMake()->TextControl()->name('remarks')->label(__('employee.remarks')),
amisMake()->ImageControl()->name('prize_images')->label(__('employee.prize_images'))
->multiple()
->receiver($this->uploadImagePath().'?full-url=1')
->joinValues(false)
->extractValue(true),
amisMake()->ImageControl()->name('skill_images')->label(__('employee.skill_images'))
->multiple()
->receiver($this->uploadImagePath().'?full-url=1')
->joinValues(false)
->extractValue(true),
amisMake()->TextControl()->name('username')->label(__('admin.username'))->value('${admin_user.username}')->visible(! $edit)->required(! $edit),
amisMake()->TextControl()->name('password')->set('type', 'input-password')->label(__('admin.password'))->visible(! $edit)->required(! $edit),
amisMake()->TextControl()->name('confirm_password')->set('type', 'input-password')->label(__('admin.confirm_password'))->visible(! $edit)->required(! $edit),
]);
}
public function detail(): Form
{
return $this->baseDetail()->title('')->body(amisMake()->Property()->items([
['label' => __('employee.store_id'), 'content' => '${store.title}', 'span' => 3],
['label' => __('employee.avatar'), 'content' => amisMake()->Avatar()->src('${avatar}')],
['label' => __('employee.name'), 'content' => '${name}'],
['label' => __('admin.username'), 'content' => '${admin_user.username}'],
['label' => __('employee.phone'), 'content' => '${phone}'],
['label' => __('employee.jobs'), 'content' => amisMake()->Each()->name('jobs')->items(amisMake()->Tag()->label('${name}'))],
['label' => __('employee.employee_status'), 'content' => amisMake()->Tag()->label('${employee_status_text}')->color('${employee_status_color}')],
['label' => __('employee.join_at'), 'content' => '${join_at}'],
['label' => __('employee.leave_at'), 'content' => '${leave_at}'],
['label' => __('employee.remarks'), 'content' => '${remarks}'],
['label' => __('employee.prize_images'), 'content' => amisMake()->Images()->source('${prize_images}')->enlargeAble(), 'span' => 3],
['label' => __('employee.skill_images'), 'content' => amisMake()->Images()->source('${skill_images}')->enlargeAble(), 'span' => 3],
]));
}
// 员工离职
public function leave($id, Request $request)
{
$user = Employee::findOrFail($id);
if ($this->service->leave($user, $request->only(['leave_at']))) {
return $this->response()->success(null, '操作成功');
}
return $this->response()->fail($this->service->getError());
}
public function shareList()
{
return $this->service->listQuery()->get(['id', 'name', 'phone']);
}
protected function exportFileName()
{
return '员工记录';
}
protected function exportMap($row)
{
$jobs = data_get($row, 'jobs', []);
return [
__('employee.id') => data_get($row, 'id'),
__('employee.name') => data_get($row, 'name'),
__('employee.jobs') => data_get($row, 'name'),
__('employee.jobs') => implode(',', array_column($jobs, 'name')),
__('employee.phone') => data_get($row, 'phone'),
__('employee.employee_status') => data_get($row, 'employee_status_text'),
__('employee.store_id') => data_get($row, 'store.title'),
__('employee.remarks') => data_get($row, 'remarks'),
__('employee.is_sign') => data_get($row, 'is_sign') ? '是' : '否',
];
}
}