generated from liutk/owl-admin-base
admin 员工状态
parent
7df41cc799
commit
a29abff979
|
|
@ -1,65 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Admin\Controllers;
|
|
||||||
|
|
||||||
use Slowlyo\OwlAdmin\Controllers\AdminController;
|
|
||||||
use App\Services\Admin\EmployeeService;
|
|
||||||
use Slowlyo\OwlAdmin\Renderers\Page;
|
|
||||||
use Slowlyo\OwlAdmin\Renderers\Form;
|
|
||||||
use App\Enums\EmployeeStatus;
|
|
||||||
|
|
||||||
class EmployeeController extends AdminController
|
|
||||||
{
|
|
||||||
protected string $serviceName = EmployeeService::class;
|
|
||||||
|
|
||||||
public function list(): Page
|
|
||||||
{
|
|
||||||
$crud = $this->baseCRUD()
|
|
||||||
->tableLayout('fixed')
|
|
||||||
->headerToolbar([
|
|
||||||
$this->createButton(true),
|
|
||||||
...$this->baseHeaderToolBar(),
|
|
||||||
])
|
|
||||||
->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()),
|
|
||||||
]),
|
|
||||||
]))
|
|
||||||
->columns([
|
|
||||||
amisMake()->TableColumn()->name('id')->label(__('employee.id')),
|
|
||||||
amisMake()->TableColumn()->name('name')->label(__('employee.name')),
|
|
||||||
amisMake()->TableColumn()->name('phone')->label(__('employee.phone')),
|
|
||||||
amisMake()->TableColumn()->name('employee_status_text')->label(__('employee.employee_status')),
|
|
||||||
amisMake()->TableColumn()->name('created_at')->label(__('employee.created_at')),
|
|
||||||
$this->rowActions([
|
|
||||||
$this->rowShowButton(),
|
|
||||||
$this->rowEditButton(true),
|
|
||||||
$this->rowDeleteButton(),
|
|
||||||
]),
|
|
||||||
]);
|
|
||||||
|
|
||||||
return $this->baseList($crud);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function form($edit): Form
|
|
||||||
{
|
|
||||||
return $this->baseForm()->title('')->body([
|
|
||||||
amisMake()->TextControl()->name('name')->label(__('employee.name'))->required(),
|
|
||||||
amisMake()->TextControl()->name('phone')->label(__('employee.phone'))->required(),
|
|
||||||
|
|
||||||
amisMake()->TextControl()->name('username')->label(__('admin.username'))->value('${admin_user.username}')->required(!$edit),
|
|
||||||
amisMake()->TextControl()->name('password')->set('type', 'input-password')->label(__('admin.password'))->required(!$edit),
|
|
||||||
amisMake()->TextControl()->name('confirm_password')->set('type', 'input-password')->label(__('admin.confirm_password'))->required(!$edit),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function detail(): Form
|
|
||||||
{
|
|
||||||
return $this->baseDetail()->title('')->body(amisMake()->Property()->items([
|
|
||||||
['label' => __('employee.name'), 'content' => '${name}'],
|
|
||||||
['label' => __('employee.phone'), 'content' => '${phone}'],
|
|
||||||
]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -7,6 +7,7 @@ use App\Services\Admin\EmployeeService;
|
||||||
use Slowlyo\OwlAdmin\Renderers\Page;
|
use Slowlyo\OwlAdmin\Renderers\Page;
|
||||||
use Slowlyo\OwlAdmin\Renderers\Form;
|
use Slowlyo\OwlAdmin\Renderers\Form;
|
||||||
use App\Enums\EmployeeStatus;
|
use App\Enums\EmployeeStatus;
|
||||||
|
use App\Models\Employee;
|
||||||
|
|
||||||
class EmployeeController extends AdminController
|
class EmployeeController extends AdminController
|
||||||
{
|
{
|
||||||
|
|
@ -31,7 +32,10 @@ class EmployeeController extends AdminController
|
||||||
amisMake()->TableColumn()->name('id')->label(__('employee.id')),
|
amisMake()->TableColumn()->name('id')->label(__('employee.id')),
|
||||||
amisMake()->TableColumn()->name('name')->label(__('employee.name')),
|
amisMake()->TableColumn()->name('name')->label(__('employee.name')),
|
||||||
amisMake()->TableColumn()->name('phone')->label(__('employee.phone')),
|
amisMake()->TableColumn()->name('phone')->label(__('employee.phone')),
|
||||||
amisMake()->TableColumn()->name('employee_status_text')->label(__('employee.employee_status')),
|
// amisMake()->TableColumn()->name('employee_status_text')->label(__('employee.employee_status')),
|
||||||
|
|
||||||
|
amisMake()->TableColumn()->name('employee_status_text')->label(__('employee.employee_status'))->set('type', 'tag')->set('color', '${employee_status_color}'),
|
||||||
|
|
||||||
amisMake()->TableColumn()->name('created_at')->label(__('employee.created_at')),
|
amisMake()->TableColumn()->name('created_at')->label(__('employee.created_at')),
|
||||||
$this->rowActions([
|
$this->rowActions([
|
||||||
$this->rowShowButton(),
|
$this->rowShowButton(),
|
||||||
|
|
@ -49,6 +53,13 @@ class EmployeeController extends AdminController
|
||||||
amisMake()->TextControl()->name('name')->label(__('employee.name'))->required(),
|
amisMake()->TextControl()->name('name')->label(__('employee.name'))->required(),
|
||||||
amisMake()->TextControl()->name('phone')->label(__('employee.phone'))->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')
|
||||||
|
->joinValues(),
|
||||||
|
|
||||||
|
amisMake()->SelectControl()->name('employee_status')->label(__('employee.employee_status'))->options(EmployeeStatus::options()),
|
||||||
amisMake()->TextControl()->name('username')->label(__('admin.username'))->value('${admin_user.username}')->required(!$edit),
|
amisMake()->TextControl()->name('username')->label(__('admin.username'))->value('${admin_user.username}')->required(!$edit),
|
||||||
amisMake()->TextControl()->name('password')->set('type', 'input-password')->label(__('admin.password'))->required(!$edit),
|
amisMake()->TextControl()->name('password')->set('type', 'input-password')->label(__('admin.password'))->required(!$edit),
|
||||||
amisMake()->TextControl()->name('confirm_password')->set('type', 'input-password')->label(__('admin.confirm_password'))->required(!$edit),
|
amisMake()->TextControl()->name('confirm_password')->set('type', 'input-password')->label(__('admin.confirm_password'))->required(!$edit),
|
||||||
|
|
@ -60,6 +71,10 @@ class EmployeeController extends AdminController
|
||||||
return $this->baseDetail()->title('')->body(amisMake()->Property()->items([
|
return $this->baseDetail()->title('')->body(amisMake()->Property()->items([
|
||||||
['label' => __('employee.name'), 'content' => '${name}'],
|
['label' => __('employee.name'), 'content' => '${name}'],
|
||||||
['label' => __('employee.phone'), 'content' => '${phone}'],
|
['label' => __('employee.phone'), 'content' => '${phone}'],
|
||||||
|
['label' => __('employee.jobs'), 'content' => amisMake()->TagControl()->size('full')->name('jobs')->labelField('name')->valueField('key')->joinValues()->static()],
|
||||||
|
|
||||||
|
['label' => __('admin.username'), 'content' => '${admin_user.username}'],
|
||||||
|
['label' => __('employee.employee_status'), 'content' => amisMake()->Tag()->label('${employee_status_text}')->color('${employee_status_color}')],
|
||||||
]));
|
]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,10 +15,18 @@ enum EmployeeStatus: int
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function coplorMap()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
self::Online->value => 'success',
|
||||||
|
self::Offline->value => 'warning',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
public static function options()
|
public static function options()
|
||||||
{
|
{
|
||||||
$list = [];
|
$list = [];
|
||||||
foreach (static::map() as $key => $value) {
|
foreach (self::map() as $key => $value) {
|
||||||
array_push($list, ['label' => $value, 'value' => $key]);
|
array_push($list, ['label' => $value, 'value' => $key]);
|
||||||
}
|
}
|
||||||
return $list;
|
return $list;
|
||||||
|
|
@ -28,4 +36,9 @@ enum EmployeeStatus: int
|
||||||
{
|
{
|
||||||
return data_get(self::map(), $this->value);
|
return data_get(self::map(), $this->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function color()
|
||||||
|
{
|
||||||
|
return data_get(self::coplorMap(), $this->value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,12 +30,13 @@ class Employee extends Model
|
||||||
'employee_status' => EmployeeStatus::Online,
|
'employee_status' => EmployeeStatus::Online,
|
||||||
];
|
];
|
||||||
|
|
||||||
protected $appends = ['employee_status_text'];
|
protected $appends = ['employee_status_text', 'employee_status_color'];
|
||||||
|
|
||||||
// 拥有的职位
|
// 拥有的职位
|
||||||
public function jobs()
|
public function jobs()
|
||||||
{
|
{
|
||||||
return $this->belongsToMany(Keyword::class, 'emplyee_jobs', 'employee_id', 'job');
|
// $related, $table = null, $foreignPivotKey = null, $relatedPivotKey = null, $parentKey = null, $relatedKey = null, $relation = null
|
||||||
|
return $this->belongsToMany(Keyword::class, 'employee_jobs', 'employee_id', 'job', null, 'key');
|
||||||
}
|
}
|
||||||
|
|
||||||
// 关联登录账户
|
// 关联登录账户
|
||||||
|
|
@ -50,4 +51,11 @@ class Employee extends Model
|
||||||
get: fn () => $this->employee_status ? $this->employee_status->text() : '',
|
get: fn () => $this->employee_status ? $this->employee_status->text() : '',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function employeeStatusColor(): Attribute
|
||||||
|
{
|
||||||
|
return new Attribute(
|
||||||
|
get: fn () => $this->employee_status ? $this->employee_status->color() : '',
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,4 +28,9 @@ class KeywordFilter extends ModelFilter
|
||||||
Keyword::where('name','like', '%'.$parent_name.'%')->orWhere('key','like', '%'.$parent_name.'%')->value('id')
|
Keyword::where('name','like', '%'.$parent_name.'%')->orWhere('key','like', '%'.$parent_name.'%')->value('id')
|
||||||
. '-%' ?? '');
|
. '-%' ?? '');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function parentKey($key)
|
||||||
|
{
|
||||||
|
return $this->where('parent_key', $key);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,42 @@ class EmployeeService extends BaseService
|
||||||
|
|
||||||
protected string $modelFilterName = EmployeeFilter::class;
|
protected string $modelFilterName = EmployeeFilter::class;
|
||||||
|
|
||||||
|
public function store($data): bool
|
||||||
|
{
|
||||||
|
$data = $this->resloveData($data);
|
||||||
|
|
||||||
|
$validate = $this->validate($data);
|
||||||
|
if ($validate !== true) {
|
||||||
|
$this->setError($validate);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$model = $this->modelName::create($data);
|
||||||
|
|
||||||
|
if (isset($data['jobs']) && is_string($data['jobs'])) {
|
||||||
|
$this->resloveJob($model, explode(',', $data['jobs']));
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function update($primaryKey, $data): bool
|
||||||
|
{
|
||||||
|
$model = $this->query()->whereKey($primaryKey)->firstOrFail();
|
||||||
|
$data = $this->resloveData($data, $model);
|
||||||
|
$validate = $this->validate($data, $model);
|
||||||
|
if ($validate !== true) {
|
||||||
|
$this->setError($validate);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($data['jobs']) && is_string($data['jobs'])) {
|
||||||
|
$this->resloveJob($model, explode(',', $data['jobs']));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $model->update($data);
|
||||||
|
}
|
||||||
|
|
||||||
public function getEditData($id): Model|\Illuminate\Database\Eloquent\Collection|Builder|array|null
|
public function getEditData($id): Model|\Illuminate\Database\Eloquent\Collection|Builder|array|null
|
||||||
{
|
{
|
||||||
$model = $this->getModel();
|
$model = $this->getModel();
|
||||||
|
|
@ -27,7 +63,7 @@ class EmployeeService extends BaseService
|
||||||
->filter(fn($item) => $item !== null)
|
->filter(fn($item) => $item !== null)
|
||||||
->toArray();
|
->toArray();
|
||||||
|
|
||||||
return $this->query()->with(['adminUser'])->find($id)->makeHidden($hidden);
|
return $this->query()->with(['adminUser', 'jobs'])->find($id)->makeHidden($hidden);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function resloveData($data, $model = null)
|
public function resloveData($data, $model = null)
|
||||||
|
|
@ -54,15 +90,23 @@ class EmployeeService extends BaseService
|
||||||
return $data;
|
return $data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理职位
|
||||||
|
*
|
||||||
|
* @param Employee $model
|
||||||
|
* @param array $jobs(字典表 key 组成的数组)
|
||||||
|
*/
|
||||||
|
public function resloveJob($model, $jobs)
|
||||||
|
{
|
||||||
|
$model->jobs()->sync($jobs);
|
||||||
|
}
|
||||||
|
|
||||||
public function preDelete(array $ids)
|
public function preDelete(array $ids)
|
||||||
{
|
{
|
||||||
// 删除管理员
|
// 删除管理员
|
||||||
$adminUserIds = Employee::whereIn('id', $ids)->pluck('admin_user_id')->implode(',');
|
$adminUserIds = Employee::whereIn('id', $ids)->pluck('admin_user_id')->implode(',');
|
||||||
$adminUserService = AdminUserService::make();
|
$adminUserService = AdminUserService::make();
|
||||||
if (!$adminUserService->delete($adminUserIds)) {
|
$adminUserService->delete($adminUserIds);
|
||||||
$this->setError($adminUserService->getError());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ return new class extends Migration
|
||||||
$table->comment('员工');
|
$table->comment('员工');
|
||||||
});
|
});
|
||||||
|
|
||||||
Schema::create('emplyee_jobs', function (Blueprint $table) {
|
Schema::create('employee_jobs', function (Blueprint $table) {
|
||||||
$table->foreignId('employee_id');
|
$table->foreignId('employee_id');
|
||||||
$table->string('job')->comment('职位, 字典表: keywords.job');
|
$table->string('job')->comment('职位, 字典表: keywords.job');
|
||||||
});
|
});
|
||||||
|
|
@ -37,6 +37,6 @@ return new class extends Migration
|
||||||
public function down(): void
|
public function down(): void
|
||||||
{
|
{
|
||||||
Schema::dropIfExists('employees');
|
Schema::dropIfExists('employees');
|
||||||
Schema::dropIfExists('emplyee_jobs');
|
Schema::dropIfExists('employee_jobs');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,11 @@ class KeywordSeeder extends Seeder
|
||||||
'name' => '广告位置',
|
'name' => '广告位置',
|
||||||
'children' => [],
|
'children' => [],
|
||||||
],
|
],
|
||||||
|
[
|
||||||
|
'key' => 'job',
|
||||||
|
'name' => '职位',
|
||||||
|
'children' => ['普通员工', '小组长', '主管']
|
||||||
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
$this->insertKeywors($keywords);
|
$this->insertKeywors($keywords);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue