From 48b88953f387b531ff29964b125aba1b537eed55 Mon Sep 17 00:00:00 2001 From: panliang <1163816051@qq.com> Date: Tue, 26 Mar 2024 14:06:05 +0800 Subject: [PATCH] =?UTF-8?q?admin=20=E9=97=A8=E5=BA=97-=E5=BD=A9=E7=A5=A8?= =?UTF-8?q?=E6=9C=BA=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Hr/EmployeeController.php | 39 ++++++++---- .../Controllers/Store/DeviceController.php | 61 +++++++++++++++++++ .../Controllers/Store/StoreController.php | 2 +- app/Admin/Filters/EmployeeFilter.php | 6 +- app/Admin/Filters/StoreDeviceFilter.php | 14 +++++ app/Admin/Services/StoreDeviceService.php | 34 +++++++++++ app/Admin/routes.php | 6 +- app/Models/Employee.php | 2 +- app/Models/StoreDevice.php | 24 ++++++++ ...24_03_22_091409_create_employees_table.php | 1 + ...3_26_131034_create_store_devices_table.php | 32 ++++++++++ database/seeders/AdminPermissionSeeder.php | 6 ++ lang/zh_CN/employee.php | 2 + lang/zh_CN/store_device.php | 11 ++++ 14 files changed, 220 insertions(+), 20 deletions(-) create mode 100644 app/Admin/Controllers/Store/DeviceController.php create mode 100644 app/Admin/Filters/StoreDeviceFilter.php create mode 100644 app/Admin/Services/StoreDeviceService.php create mode 100644 app/Models/StoreDevice.php create mode 100644 database/migrations/2024_03_26_131034_create_store_devices_table.php create mode 100644 lang/zh_CN/store_device.php diff --git a/app/Admin/Controllers/Hr/EmployeeController.php b/app/Admin/Controllers/Hr/EmployeeController.php index 998d170..6674fb4 100644 --- a/app/Admin/Controllers/Hr/EmployeeController.php +++ b/app/Admin/Controllers/Hr/EmployeeController.php @@ -35,22 +35,21 @@ class EmployeeController extends AdminController 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')->label(__('employee.employee_status')) - ->type('switch') - ->trueValue(EmployeeStatus::Online) - ->falseValue(EmployeeStatus::Offline), - amisMake()->TableColumn()->name('created_at')->label(__('employee.created_at')), + amisMake()->TableColumn()->name('employee_status_text')->label(__('employee.employee_status'))->set('type', 'tag')->set('color', '${employee_status_color}'), + amisMake()->TableColumn()->name('join_at')->label(__('employee.join_at')), + amisMake()->TableColumn()->name('remarks')->label(__('employee.remarks')), $this->rowActions([ $this->rowShowButton()->visible(Admin::user()->can('admin.hr.employees.view')), $this->rowEditButton(true)->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')), + 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.'}'), ]), ]); @@ -63,13 +62,14 @@ class EmployeeController extends AdminController amisMake()->TextControl()->name('name')->label(__('employee.name'))->required(), amisMake()->TextControl()->name('phone')->label(__('employee.phone'))->required(), - amisMake()->SelectControl()->name('employee_status')->label(__('employee.employee_status'))->options(EmployeeStatus::options())->required(), + // amisMake()->SelectControl()->name('employee_status')->label(__('employee.employee_status'))->options(EmployeeStatus::options())->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()->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') @@ -96,9 +96,22 @@ class EmployeeController extends AdminController ['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}', 'span' => 3], ['label' => __('admin.username'), 'content' => '${admin_user.username}', 'span' => 3], ['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); + $user->update([ + 'leave_at' => $request->input('leave_at', now()), + 'employee_status' => EmployeeStatus::Offline, + ]); + + return $this->response()->success(null, '操作成功'); + } } diff --git a/app/Admin/Controllers/Store/DeviceController.php b/app/Admin/Controllers/Store/DeviceController.php new file mode 100644 index 0000000..df86abd --- /dev/null +++ b/app/Admin/Controllers/Store/DeviceController.php @@ -0,0 +1,61 @@ +baseCRUD() + ->tableLayout('fixed') + ->headerToolbar([ + $this->createButton(true)->visible(Admin::user()->can('admin.store.devices.create')), + ...$this->baseHeaderToolBar(), + ]) + ->bulkActions([]) + ->filter($this->baseFilter()->body([ + amis()->GroupControl()->mode('horizontal')->body([ + amisMake()->TextControl()->name('name')->label(__('store_device.name'))->columnRatio(3)->clearable(), + ]), + ])) + ->columns([ + amisMake()->TableColumn()->name('id')->label(__('store_device.id')), + amisMake()->TableColumn()->name('store.title')->label(__('store_device.store_id')), + amisMake()->TableColumn()->name('name')->label(__('store_device.name')), + amisMake()->TableColumn()->name('code')->label(__('store_device.code')), + amisMake()->TableColumn()->name('remarks')->label(__('store_device.remarks')), + amisMake()->TableColumn()->name('created_at')->label(__('store_device.created_at')), + $this->rowActions([ + $this->rowEditButton(true)->visible(Admin::user()->can('admin.store.devices.update')), + $this->rowDeleteButton()->visible(Admin::user()->can('admin.store.devices.delete')), + ]), + ]); + + return $this->baseList($crud); + } + + public function form($edit): Form + { + return $this->baseForm()->title('')->body([ + amisMake()->SelectControl()->name('store_id')->label(__('store_device.store_id')) + ->source(admin_url('store/stores?_action=getData')) + ->labelField('title') + ->valueField('id') + ->required(), + amisMake()->TextControl()->name('name')->label(__('store_device.name'))->required(), + amisMake()->TextControl()->name('code')->label(__('store_device.code'))->required(), + amisMake()->TextControl()->name('remarks')->label(__('store_device.remarks')), + ]); + } +} \ No newline at end of file diff --git a/app/Admin/Controllers/Store/StoreController.php b/app/Admin/Controllers/Store/StoreController.php index b1e41d9..d8f492e 100644 --- a/app/Admin/Controllers/Store/StoreController.php +++ b/app/Admin/Controllers/Store/StoreController.php @@ -4,9 +4,9 @@ namespace App\Admin\Controllers\Store; use App\Models\{Store, Employee}; use Illuminate\Http\Request; -use Slowlyo\OwlAdmin\Admin; use App\Enums\{BusinessStatus, StoreRole}; use App\Admin\Services\StoreService; +use Slowlyo\OwlAdmin\Admin; use Slowlyo\OwlAdmin\Renderers\Form; use Slowlyo\OwlAdmin\Renderers\Page; use Illuminate\Support\Facades\DB; diff --git a/app/Admin/Filters/EmployeeFilter.php b/app/Admin/Filters/EmployeeFilter.php index 923bcd8..892e308 100644 --- a/app/Admin/Filters/EmployeeFilter.php +++ b/app/Admin/Filters/EmployeeFilter.php @@ -14,14 +14,12 @@ class EmployeeFilter extends ModelFilter public function name($key) { - $condition = '%'.$key.'%'; - $this->whereLike('name', $condition); + $this->whereLike('name', $key); } public function phone($key) { - $condition = '%'.$key.'%'; - $this->whereLike('phone', $condition); + $this->whereLike('phone', $key); } public function employeeStatus($key) diff --git a/app/Admin/Filters/StoreDeviceFilter.php b/app/Admin/Filters/StoreDeviceFilter.php new file mode 100644 index 0000000..1b0aaa2 --- /dev/null +++ b/app/Admin/Filters/StoreDeviceFilter.php @@ -0,0 +1,14 @@ +where(fn ($q) => $q->where('name', 'like', $condition)->orWhere('code', 'like', $condition)); + } +} diff --git a/app/Admin/Services/StoreDeviceService.php b/app/Admin/Services/StoreDeviceService.php new file mode 100644 index 0000000..e9d3b5c --- /dev/null +++ b/app/Admin/Services/StoreDeviceService.php @@ -0,0 +1,34 @@ + ['required'], + 'code' => ['required'], + ]; + $updateRules = []; + $validator = Validator::make($data, $model ? $updateRules : $createRules, [ + 'name.required' => __('store_device.name').'必填', + 'code.required' => __('store_device.phone').'必填', + ]); + if ($validator->fails()) { + return $validator->errors()->first(); + } + + return true; + } +} diff --git a/app/Admin/routes.php b/app/Admin/routes.php index 877b4a5..ebd9e41 100644 --- a/app/Admin/routes.php +++ b/app/Admin/routes.php @@ -2,6 +2,7 @@ use App\Admin\Controllers\Hr\EmployeeController; use App\Admin\Controllers\Store\StoreController; +use App\Admin\Controllers\Store\DeviceController; use App\Admin\Controllers\System\AdminMenuController; use App\Admin\Controllers\System\AdminPermissionController; use App\Admin\Controllers\System\AdminRoleController; @@ -39,6 +40,8 @@ Route::group([ $router->delete('stores/{id}/employees', [StoreController::class, 'employeeDestroy']); // 门店管理 $router->resource('stores', StoreController::class); + // 彩票机管理 + $router->resource('devices', DeviceController::class); }); @@ -51,8 +54,9 @@ Route::group([ 'prefix' => 'hr', 'as' => 'hr.', ], function (Router $router) { - // 人事管理 + // 员工管理 $router->resource('employees', EmployeeController::class); + // 员工离职 $router->post('employees/{id}/leave', [EmployeeController::class, 'leave'])->name('employees.leave'); }); diff --git a/app/Models/Employee.php b/app/Models/Employee.php index 43027b5..c35cebb 100644 --- a/app/Models/Employee.php +++ b/app/Models/Employee.php @@ -19,7 +19,7 @@ class Employee extends Model const JOB_KEY = 'job'; - protected $fillable = ['name', 'phone', 'prize_images', 'skill_images', 'employee_status', 'admin_user_id', 'leave_at', 'join_at']; + protected $fillable = ['name', 'phone', 'prize_images', 'skill_images', 'employee_status', 'admin_user_id', 'leave_at', 'join_at', 'remarks']; protected $casts = [ 'employee_status' => EmployeeStatus::class, diff --git a/app/Models/StoreDevice.php b/app/Models/StoreDevice.php new file mode 100644 index 0000000..0052b68 --- /dev/null +++ b/app/Models/StoreDevice.php @@ -0,0 +1,24 @@ +belongsTo(Store::class, 'store_id'); + } + +} diff --git a/database/migrations/2024_03_22_091409_create_employees_table.php b/database/migrations/2024_03_22_091409_create_employees_table.php index dc81860..7af8fd1 100644 --- a/database/migrations/2024_03_22_091409_create_employees_table.php +++ b/database/migrations/2024_03_22_091409_create_employees_table.php @@ -21,6 +21,7 @@ return new class extends Migration $table->foreignId('admin_user_id')->comment('登录信息, 关联 admin_users.id'); $table->timestamp('join_at')->nullable()->comment('入职时间'); $table->timestamp('leave_at')->nullable()->comment('离职时间'); + $table->string('remarks')->nullable()->comment('备注'); $table->timestamps(); diff --git a/database/migrations/2024_03_26_131034_create_store_devices_table.php b/database/migrations/2024_03_26_131034_create_store_devices_table.php new file mode 100644 index 0000000..689a540 --- /dev/null +++ b/database/migrations/2024_03_26_131034_create_store_devices_table.php @@ -0,0 +1,32 @@ +id(); + $table->foreignId('store_id')->comment('关联门店, stores.id'); + $table->string('name')->comment('设备名称'); + $table->string('code')->comment('编号'); + $table->string('remarks')->nullable()->comment('备注'); + $table->timestamps(); + $table->comment('设备管理'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('store_devices'); + } +}; diff --git a/database/seeders/AdminPermissionSeeder.php b/database/seeders/AdminPermissionSeeder.php index fff6bc6..d59fcbd 100644 --- a/database/seeders/AdminPermissionSeeder.php +++ b/database/seeders/AdminPermissionSeeder.php @@ -44,6 +44,12 @@ class AdminPermissionSeeder extends Seeder 'uri' => '/store/stores', 'resource' => true, ], + 'devices' => [ + 'name' => '彩票机管理', + 'icon' => 'material-symbols:store-rounded', + 'uri' => '/store/devices', + 'resource' => true, + ] ], ], diff --git a/lang/zh_CN/employee.php b/lang/zh_CN/employee.php index 42afca6..d2179f3 100644 --- a/lang/zh_CN/employee.php +++ b/lang/zh_CN/employee.php @@ -14,6 +14,8 @@ return [ 'jobs' => '职位', 'leave_at' => '离职时间', 'leave' => '离职', + 'reback' => '重新入职', 'join_at' => '入职时间', 'leave_confirm' => '是否确定?', + 'remarks' => '备注', ]; diff --git a/lang/zh_CN/store_device.php b/lang/zh_CN/store_device.php new file mode 100644 index 0000000..88ad863 --- /dev/null +++ b/lang/zh_CN/store_device.php @@ -0,0 +1,11 @@ + 'ID', + 'created_at' => '创建时间', + 'updated_at' => '更新时间', + 'remarks' => '备注', + 'store_id' => '门店', + 'name' => '名称', + 'code' => '编号', +];