From 70d8392a0b3e3c7288e3c741ca376e181bc84dc5 Mon Sep 17 00:00:00 2001 From: Jing Li Date: Wed, 24 Apr 2024 23:03:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=A3=E9=87=91=E6=AF=94=E4=BE=8B=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Store/StoreProfitRatioLogController.php | 46 +++++++++++++ .../Filters/StoreProfitRatioLogFilter.php | 18 ++++++ .../Services/StoreProfitRatioLogService.php | 15 +++++ app/Admin/Services/StoreService.php | 64 ++++++++++++++++++- app/Admin/routes.php | 3 + app/Models/Store.php | 4 ++ app/Models/StoreProfitRatioLog.php | 31 +++++++++ ...7_create_store_profit_ratio_logs_table.php | 31 +++++++++ database/seeders/AdminPermissionSeeder.php | 7 ++ lang/zh_CN/store_profit_ratio_log.php | 11 ++++ 10 files changed, 227 insertions(+), 3 deletions(-) create mode 100644 app/Admin/Controllers/Store/StoreProfitRatioLogController.php create mode 100644 app/Admin/Filters/StoreProfitRatioLogFilter.php create mode 100644 app/Admin/Services/StoreProfitRatioLogService.php create mode 100644 app/Models/StoreProfitRatioLog.php create mode 100644 database/migrations/2024_04_24_201227_create_store_profit_ratio_logs_table.php create mode 100644 lang/zh_CN/store_profit_ratio_log.php diff --git a/app/Admin/Controllers/Store/StoreProfitRatioLogController.php b/app/Admin/Controllers/Store/StoreProfitRatioLogController.php new file mode 100644 index 0000000..962c13a --- /dev/null +++ b/app/Admin/Controllers/Store/StoreProfitRatioLogController.php @@ -0,0 +1,46 @@ +baseCRUD() + ->headerToolbar([ + ...$this->baseHeaderToolBar(), + ]) + ->bulkActions([]) + ->filter($this->baseFilter()->body([ + amis()->GroupControl()->mode('horizontal')->body([ + amis()->SelectControl()->name('store_id')->label(__('store_profit_ratio_log.store')) + ->source(admin_url('api/stores?_all=1')) + ->labelField('title') + ->valueField('id') + ->columnRatio(3) + ->clearable(), + amis()->TextControl()->name('employee_name')->label(__('store_profit_ratio_log.employee'))->columnRatio(3)->clearable(), + ]), + ])) + ->columns([ + amis()->TableColumn()->name('id')->label(__('store_profit_ratio_log.id')), + amis()->TableColumn()->name('store.title')->label(__('store_profit_ratio_log.store')), + amis()->TableColumn()->name('employee.name')->label(__('store_profit_ratio_log.employee')), + amis()->TableColumn()->name('before')->label(__('store_profit_ratio_log.before'))->type('tpl')->set('tpl', '${before}%'), + amis()->TableColumn()->name('after')->label(__('store_profit_ratio_log.after'))->type('tpl')->set('tpl', '${after}%'), + amis()->TableColumn()->name('created_at')->label(__('store_profit_ratio_log.created_at')), + ]); + + return $this->baseList($crud); + } +} diff --git a/app/Admin/Filters/StoreProfitRatioLogFilter.php b/app/Admin/Filters/StoreProfitRatioLogFilter.php new file mode 100644 index 0000000..9b35f00 --- /dev/null +++ b/app/Admin/Filters/StoreProfitRatioLogFilter.php @@ -0,0 +1,18 @@ +where('store_id', $id); + } + + public function employeeName($name) + { + $this->related('employee', fn ($query) => $query->where('name', 'like', "%{$name}%")); + } +} diff --git a/app/Admin/Services/StoreProfitRatioLogService.php b/app/Admin/Services/StoreProfitRatioLogService.php new file mode 100644 index 0000000..21f5a53 --- /dev/null +++ b/app/Admin/Services/StoreProfitRatioLogService.php @@ -0,0 +1,15 @@ +modelName::create($data); + $afterProfitRatio = $model->profit_ratio; + + if (bccomp($beforeProfitRatio, $afterProfitRatio, 2) !== 0) { + $employee = Employee::where('admin_user_id', Admin::user()->id)->first(); + + if (is_null($employee)) { + admin_abort('账号未找到员工信息'); + } + + StoreProfitRatioLog::create([ + 'store_id' => $model->id, + 'employee_id' => $employee->id, + 'before' => $beforeProfitRatio , + 'after' => $afterProfitRatio, + ]); + } + // 绑定店长 Employee::where('id', $data['master_id'])->update(['store_id' => $model->id]); @@ -51,6 +72,27 @@ class StoreService extends BaseService Employee::where('id', $model->master_id)->update(['store_id' => 0]); } + $beforeProfitRatio = $model->profit_ratio; + + $model->update($data); + + $afterProfitRatio = $model->profit_ratio; + + if (bccomp($beforeProfitRatio, $afterProfitRatio, 2) !== 0) { + $employee = Employee::where('admin_user_id', Admin::user()->id)->first(); + + if (is_null($employee)) { + admin_abort('账号未找到员工信息'); + } + + StoreProfitRatioLog::create([ + 'store_id' => $model->id, + 'employee_id' => $employee->id, + 'before' => $beforeProfitRatio , + 'after' => $afterProfitRatio, + ]); + } + return $model->update($data); } @@ -80,10 +122,26 @@ class StoreService extends BaseService ]; $updateRules = [ 'master_id' => [Rule::unique('stores', 'master_id')->ignore($model, 'master_id')], + 'profit_ratio' => ['filled', 'numeric', 'min:0', 'max:100'], ]; - $validator = Validator::make($data, $model ? $updateRules : $createRules, [ - 'master_id.unique' => '已经是店长了', - ]); + $validator = Validator::make( + $data, + $model ? $updateRules : $createRules, + [ + 'master_id.unique' => '已经是店长了', + ], + [ + 'title' => __('store.title'), + 'master_id' => __('store.master_id'), + 'category_id' => __('store.category_id'), + 'business_id' => __('store.business_id'), + 'level_id' => __('store.level_id'), + 'region' => __('store.region'), + 'lon' => __('store.lon'), + 'lat' => __('store.lat'), + 'profit_ratio' => __('store.profit_ratio'), + ] + ); if ($validator->fails()) { return $validator->errors()->first(); } diff --git a/app/Admin/routes.php b/app/Admin/routes.php index 537be09..ae64420 100644 --- a/app/Admin/routes.php +++ b/app/Admin/routes.php @@ -25,6 +25,7 @@ use App\Admin\Controllers\Plan\TaskController; use App\Admin\Controllers\Store\DeviceController; use App\Admin\Controllers\Store\EmployeeController as StoreEmployeeController; use App\Admin\Controllers\Store\StoreController; +use App\Admin\Controllers\Store\StoreProfitRatioLogController; use App\Admin\Controllers\System\AdminMenuController; use App\Admin\Controllers\System\AdminPermissionController; use App\Admin\Controllers\System\AdminRoleController; @@ -69,6 +70,8 @@ Route::group([ $router->resource('business', BaseKeywordController::class); // 彩种类型 $router->resource('lottery-types', BaseKeywordController::class); + // + $router->resource('store-profit-ratio-logs', StoreProfitRatioLogController::class); }); /* diff --git a/app/Models/Store.php b/app/Models/Store.php index 01a0115..4ef9cca 100644 --- a/app/Models/Store.php +++ b/app/Models/Store.php @@ -17,6 +17,10 @@ class Store extends Model { use Filterable, HasDateTimeFormatter, HasFactory; + protected $attributes = [ + 'profit_ratio' => 0, + ]; + protected $fillable = ['title', 'master_id', 'category_id', 'business_id', 'level_id', 'region', 'lon', 'lat', 'address', 'profit_ratio', 'profit_money', 'business_status']; protected $casts = [ diff --git a/app/Models/StoreProfitRatioLog.php b/app/Models/StoreProfitRatioLog.php new file mode 100644 index 0000000..9036be8 --- /dev/null +++ b/app/Models/StoreProfitRatioLog.php @@ -0,0 +1,31 @@ +belongsTo(Store::class); + } + + public function employee(): BelongsTo + { + return $this->belongsTo(Employee::class); + } +} diff --git a/database/migrations/2024_04_24_201227_create_store_profit_ratio_logs_table.php b/database/migrations/2024_04_24_201227_create_store_profit_ratio_logs_table.php new file mode 100644 index 0000000..b60ccf3 --- /dev/null +++ b/database/migrations/2024_04_24_201227_create_store_profit_ratio_logs_table.php @@ -0,0 +1,31 @@ +id(); + $table->foreignId('store_id')->comment('门店ID'); + $table->foreignId('employee_id')->comment('员工ID'); + $table->decimal('before')->default(0)->comment('变更前的佣金比例'); + $table->decimal('after')->default(0)->comment('变更后的佣金比例'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('store_profit_ratio_logs'); + } +}; diff --git a/database/seeders/AdminPermissionSeeder.php b/database/seeders/AdminPermissionSeeder.php index 8a7d1a6..489c406 100644 --- a/database/seeders/AdminPermissionSeeder.php +++ b/database/seeders/AdminPermissionSeeder.php @@ -93,6 +93,13 @@ class AdminPermissionSeeder extends Seeder 'resource' => true, 'order' => 7, ], + 'store-profit-ratio-logs' => [ + 'name' => '佣金比例日志', + 'icon' => 'mingcute:sunflower-line', + 'uri' => '/store/store-profit-ratio-logs', + 'resource' => ['list'], + 'order' => 9, + ], ], ], diff --git a/lang/zh_CN/store_profit_ratio_log.php b/lang/zh_CN/store_profit_ratio_log.php new file mode 100644 index 0000000..6f98c32 --- /dev/null +++ b/lang/zh_CN/store_profit_ratio_log.php @@ -0,0 +1,11 @@ + 'ID', + 'created_at' => '创建时间', + 'updated_at' => '更新时间', + 'store' => '门店', + 'before' => '变更前', + 'after' => '变更后', + 'employee' => '操作人', +];