From 1b993b3f7669125b3be35eb8e83202fff8819339 Mon Sep 17 00:00:00 2001 From: Jing Li Date: Thu, 4 Apr 2024 13:59:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BA=97=E9=95=BF=E6=8F=90=E6=88=90=E5=AE=A1?= =?UTF-8?q?=E6=A0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Admin/Controllers/AdminController.php | 8 ++ .../StoreMasterCommissionController.php | 83 ++++++++++++++++--- .../Controllers/System/WorkflowController.php | 17 +++- .../Finance/StoreMasterCommissionService.php | 53 ++++++++---- app/Admin/routes.php | 2 - app/Enums/CheckStatus.php | 15 +++- app/Models/StoreMasterCommission.php | 3 +- app/Providers/AppServiceProvider.php | 1 + app/Traits/HasCheckActions.php | 4 +- database/seeders/AdminPermissionSeeder.php | 2 +- database/seeders/WorkflowSeeder.php | 1 + 11 files changed, 150 insertions(+), 39 deletions(-) diff --git a/app/Admin/Controllers/AdminController.php b/app/Admin/Controllers/AdminController.php index 27ebb3c..cc2b2a9 100644 --- a/app/Admin/Controllers/AdminController.php +++ b/app/Admin/Controllers/AdminController.php @@ -108,6 +108,14 @@ abstract class AdminController extends Controller protected function prepareException(Throwable $e) { + if ($e instanceof ValidationException) { + $message = Arr::first($e->errors()); + if (is_array($message)) { + $message = Arr::first($message); + } + $e = new AdminException($message ?: '参数错误'); + } + return $e; } } diff --git a/app/Admin/Controllers/Finance/StoreMasterCommissionController.php b/app/Admin/Controllers/Finance/StoreMasterCommissionController.php index 5aa0531..b71e0e5 100644 --- a/app/Admin/Controllers/Finance/StoreMasterCommissionController.php +++ b/app/Admin/Controllers/Finance/StoreMasterCommissionController.php @@ -4,6 +4,8 @@ namespace App\Admin\Controllers\Finance; use App\Admin\Controllers\AdminController; use App\Admin\Services\Finance\StoreMasterCommissionService; +use App\Enums\CheckStatus; +use App\Traits\HasCheckActions; use Slowlyo\OwlAdmin\Admin; use Slowlyo\OwlAdmin\Renderers\Form; use Slowlyo\OwlAdmin\Renderers\Page; @@ -13,6 +15,8 @@ use Slowlyo\OwlAdmin\Renderers\Page; */ class StoreMasterCommissionController extends AdminController { + use HasCheckActions; + protected string $serviceName = StoreMasterCommissionService::class; public function list(): Page @@ -40,20 +44,36 @@ class StoreMasterCommissionController extends AdminController ]), ])) ->columns([ - amis()->TableColumn()->name('id')->label(__('finance.store_master_commission.id')), - amis()->TableColumn()->name('month')->label(__('finance.store_master_commission.month')), - amis()->TableColumn()->name('store.title')->label(__('finance.store_master_commission.store')), - amis()->TableColumn()->name('master.name')->label(__('finance.store_master_commission.store_master')), - amis()->TableColumn()->name('commission')->label(__('finance.store_master_commission.commission')), - amis()->TableColumn()->name('daily_expenses')->label(__('finance.store_master_commission.daily_expenses')), - amis()->TableColumn()->name('employee_expenses')->label(__('finance.store_master_commission.employee_expenses')), - amis()->TableColumn()->name('other_expenses')->label(__('finance.store_master_commission.other_expenses')), - amis()->TableColumn()->name('created_at')->label(__('finance.store_master_commission.created_at')), + amis()->TableColumn('id', __('finance.store_master_commission.id')), + amis()->TableColumn('month', __('finance.store_master_commission.month')), + amis()->TableColumn('store.title', __('finance.store_master_commission.store')), + amis()->TableColumn('master.name', __('finance.store_master_commission.store_master')), + amis()->TableColumn('commission', __('finance.store_master_commission.commission')), + amis()->TableColumn('daily_expenses', __('finance.store_master_commission.daily_expenses')), + amis()->TableColumn('employee_expenses', __('finance.store_master_commission.employee_expenses')), + amis()->TableColumn('other_expenses', __('finance.store_master_commission.other_expenses')), + amis()->TableColumn('workflow.check_status', __('workflow_log.check_status'))->set('type', 'mapping')->map(CheckStatus::labelMap()), + amis()->TableColumn('created_at', __('finance.store_master_commission.created_at')), $this->rowActions([ + $this->applyAction() + ->api( + amis()->BaseApi() + ->url(admin_url('api/workflow/apply')) + ->method('post') + ->data(['id' => '${workflow.id}']) + ), + $this->succesAction(), + $this->failAction(), + $this->cancelAction(), $this->rowEditTypeButton('drawer', 'lg') - ->visible(Admin::user()->can('admin.finance.store_master_commissions.update')), + ->visible(Admin::user()->can('admin.finance.store_master_commissions.update')) + ->visibleOn('${OR(workflow.check_status == '.CheckStatus::None->value.', workflow.check_status == '.CheckStatus::Cancel->value.', workflow.check_status == '.CheckStatus::Fail->value.')}'), + $this->rowShowButton() + ->visible(Admin::user()->can('admin.finance.store_master_commissions.view')), $this->rowDeleteButton() - ->visible(Admin::user()->can('admin.finance.store_master_commissions.delete')), + ->visible(Admin::user()->can('admin.finance.store_master_commissions.delete')) + ->visibleOn('${OR(workflow.check_status == '.CheckStatus::None->value.', workflow.check_status == '.CheckStatus::Cancel->value.', workflow.check_status == '.CheckStatus::Fail->value.')}'), + ]), ]); @@ -105,4 +125,45 @@ class StoreMasterCommissionController extends AdminController ->required(), ]); } + + public function detail(): Form + { + $detail = amis()->Property()->items([ + ['label' => __('finance.store_master_commission.month'), 'content' => '${month}'], + ['label' => __('finance.store_master_commission.store'), 'content' => '${store.title}'], + ['label' => __('finance.store_master_commission.store_master'), 'content' => '${master.name}'], + ['label' => __('finance.store_master_commission.commission'), 'content' => '${commission}'], + ['label' => __('finance.store_master_commission.daily_expenses'), 'content' => '${daily_expenses}'], + ['label' => __('finance.store_master_commission.employee_expenses'), 'content' => '${employee_expenses}'], + ['label' => __('finance.store_master_commission.other_expenses'), 'content' => '${other_expenses}'], + ['label' => __('finance.store_master_commission.created_at'), 'content' => '${created_at}'], + ['label' => __('workflow_log.check_status'), 'content' => amis()->Mapping()->name('workflow.check_status')->map(CheckStatus::labelMap())], + ['label' => __('workflow_log.checked_at'), 'content' => '${workflow.checked_at}'], + ['label' => __('workflow_log.remarks'), 'content' => '${workflow.check_remarks}', 'span' => 2], + ]); + $table = amis()->Service() + ->id('offical-business-checklog-table') + ->initFetch(false) + ->api(admin_url('api/workflow/logs?id=${workflow.id}')) + ->body( + amis()->Table()->columnsTogglable(false)->itemActions([ + $this->succesAction()->reload('offical-business-detail'), + $this->failAction()->reload('offical-business-detail'), + ])->columns([ + amis()->TableColumn()->name('batch_id')->label(__('workflow_log.batch_id')), + amis()->TableColumn()->name('check_name')->label(__('workflow_log.check_name')), + amis()->TableColumn()->name('check_user.name')->label(__('workflow_log.check_user_id')), + amis()->TableColumn()->name('check_status')->label(__('workflow_log.check_status'))->set('type', 'mapping')->map(CheckStatus::options()), + amis()->TableColumn()->name('checked_at')->label(__('workflow_log.checked_at')), + amis()->TableColumn()->name('remarks')->label(__('workflow_log.remarks')), + ]) + ); + return $this->baseDetail()->id('offical-business-detail')->title('')->onEvent([ + 'inited' => [ + 'actions' => [ + ['actionType' => 'reload', 'componentId' => 'offical-business-checklog-table'], + ] + ] + ])->body([$detail, amis()->Divider(), $table]); + } } diff --git a/app/Admin/Controllers/System/WorkflowController.php b/app/Admin/Controllers/System/WorkflowController.php index 3f9aa29..979c97b 100644 --- a/app/Admin/Controllers/System/WorkflowController.php +++ b/app/Admin/Controllers/System/WorkflowController.php @@ -16,6 +16,8 @@ use Illuminate\Database\Eloquent\Relations\Relation; /** * 审核流程管理 + * + * @property WorkFlowService $service */ class WorkflowController extends AdminController { @@ -93,11 +95,22 @@ class WorkflowController extends AdminController public function apply(Request $request) { $model = WorkflowCheck::findOrFail($request->input('id')); - $user = Employee::findOrFail($request->input('user')); + + $employee = $request->whenFilled('user', function ($id) { + if ($employee = Employee::find($id)) { + return $employee; + } + admin_abort('员工未找到'); + }, function () { + if ($employee = Employee::where('admin_user_id', Admin::user()->id)->first()) { + return $employee; + } + admin_abort('当前登录账户未关联员工'); + }); try { DB::beginTransaction(); - if (!$this->service->apply($model, $user)) { + if (!$this->service->apply($model, $employee)) { return $this->response()->fail($this->service->getError()); } DB::commit(); diff --git a/app/Admin/Services/Finance/StoreMasterCommissionService.php b/app/Admin/Services/Finance/StoreMasterCommissionService.php index 8275e65..7663e79 100644 --- a/app/Admin/Services/Finance/StoreMasterCommissionService.php +++ b/app/Admin/Services/Finance/StoreMasterCommissionService.php @@ -10,7 +10,7 @@ use Illuminate\Support\Facades\Validator; class StoreMasterCommissionService extends BaseService { - protected array $withRelationships = ['store', 'master']; + protected array $withRelationships = ['store', 'master', 'workflow']; protected string $modelName = StoreMasterCommission::class; @@ -18,7 +18,7 @@ class StoreMasterCommissionService extends BaseService public function store($data): bool { - $validator = Validator::make( + Validator::validate( data: $data, rules: [ 'month' => ['bail', 'required', 'date_format:Y-m'], @@ -38,13 +38,11 @@ class StoreMasterCommissionService extends BaseService ], ); - admin_abort_if($validator->fails(), $validator->errors()->first()); + $store = Store::findOrFail($data['store_id']); - $attributes = $validator->validated(); - - $store = Store::findOrFail($attributes['store_id']); - - $attributes['store_master_id'] = $store->master_id; + $attributes = array_merge($data, [ + 'store_master_id' => $store->master_id, + ]); $this->modelName::create($attributes); @@ -53,7 +51,7 @@ class StoreMasterCommissionService extends BaseService public function update($primaryKey, $data): bool { - $validator = Validator::make( + Validator::validate( data: $data, rules: [ 'month' => ['filled', 'required', 'date_format:Y-m'], @@ -73,19 +71,38 @@ class StoreMasterCommissionService extends BaseService ], ); - admin_abort_if($validator->fails(), $validator->errors()->first()); - - $attributes = $validator->validated(); - $model = $this->query()->whereKey($primaryKey)->firstOrFail(); - // 如果门店发生改变,则更新店长 - if ($model->store_id != $attributes['store_id']) { - $store = Store::findOrFail($attributes['store_id']); - $attributes['store_master_id'] = $store->master_id; + foreach ([ + 'month', + 'store_id', + 'commission', + 'daily_expenses', + 'employee_expenses', + 'other_expenses', + ] as $attribute) { + if (! array_key_exists($attribute, $data)) { + continue; + } + + switch ($attribute) { + case 'store_id': + if ($model->store_id != $data['store_id']) { + $store = Store::findOrFail($data['store_id']); + $model->store_id = $store->id; + $model->store_master_id = $store->master_id; + } + break; + + default: + $model->{$attribute} = $data[$attribute]; + break; + } } - return $model->update($attributes); + $model->save(); + + return true; } public function sortColumn() diff --git a/app/Admin/routes.php b/app/Admin/routes.php index 5184cb2..e518e9c 100644 --- a/app/Admin/routes.php +++ b/app/Admin/routes.php @@ -123,7 +123,6 @@ Route::group([ ], function (Router $router) { // 上报数据 $router->resource('ledgers', LedgerController::class); - $router->post('ledgers/{ledger}/approval', [LedgerController::class, 'approval'])->name('ledgers.approval'); $router->post('ledgers/{ledger}/ledger-amount', [LedgerController::class, 'updateLedgerAmount'])->name('ledgers.update_ledger_amount'); // 佣金收入 $router->get('commission-incomes', [CommissionIncomeController::class, 'index'])->name('commission_incomes.index'); @@ -135,7 +134,6 @@ Route::group([ $router->get('store-statistics', [StoreStatisticController::class, 'index'])->name('store_statistics.index'); // 店长提成 $router->resource('store-master-commissions', StoreMasterCommissionController::class); - $router->post('store-master-commissions/{store_master_commission}/approval', [StoreMasterCommissionController::class, 'approval'])->name('store_statistics.approval'); }); /* diff --git a/app/Enums/CheckStatus.php b/app/Enums/CheckStatus.php index 8757882..25d1725 100644 --- a/app/Enums/CheckStatus.php +++ b/app/Enums/CheckStatus.php @@ -33,12 +33,23 @@ enum CheckStatus: int return [ self::None->value => '待提审', self::Processing->value => '审核中', - self::Success->value => '审核通过', - self::Fail->value => '审核不通过', + self::Success->value => '已通过', + self::Fail->value => '已拒绝', self::Cancel->value => '已取消', ]; } + public static function labelMap(): array + { + return [ + self::None->value => ''.self::None->text().'', + self::Processing->value => ''.self::Processing->text().'', + self::Success->value => ''.self::Success->text().'', + self::Fail->value => ''.self::Fail->text().'', + self::Cancel->value => ''.self::Cancel->text().'', + ]; + } + public function text() { return data_get(self::options(), $this->value); diff --git a/app/Models/StoreMasterCommission.php b/app/Models/StoreMasterCommission.php index ab70873..5b28b7a 100644 --- a/app/Models/StoreMasterCommission.php +++ b/app/Models/StoreMasterCommission.php @@ -3,6 +3,7 @@ namespace App\Models; use App\Enums\StoreMasterCommissionApprovalStatus; +use App\Traits\HasCheckable; use App\Traits\HasDateTimeFormatter; use EloquentFilter\Filterable; use Illuminate\Database\Eloquent\Factories\HasFactory; @@ -11,7 +12,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; class StoreMasterCommission extends Model { - use Filterable, HasDateTimeFormatter, HasFactory; + use Filterable, HasDateTimeFormatter, HasFactory, HasCheckable; protected $fillable = [ 'month', diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 7091657..7eef056 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -36,6 +36,7 @@ class AppServiceProvider extends ServiceProvider \App\Models\OvertimeApply::class, \App\Models\OfficalBusiness::class, \App\Models\Reimbursement::class, + \App\Models\StoreMasterCommission::class, ])->mapWithKeys(fn ($model) => [(new $model)->getTable() => $model])->all() ); } diff --git a/app/Traits/HasCheckActions.php b/app/Traits/HasCheckActions.php index b13a412..2ef8a94 100644 --- a/app/Traits/HasCheckActions.php +++ b/app/Traits/HasCheckActions.php @@ -42,7 +42,7 @@ trait HasCheckActions ->level('link') ->api('post:' . admin_url('api/workflow/success?id=${id}')) ->confirmText(__('admin.confirm')) - ->visibleOn('${check_status == '.CheckStatus::Processing->value.'}'); + ->visibleOn('${workflow.check_status == '.CheckStatus::Processing->value.'}'); } public function failAction() @@ -57,6 +57,6 @@ trait HasCheckActions amisMake()->TextControl()->name('remarks')->label(__('workflow_log.remarks'))->required(), ]) )) - ->visibleOn('${check_status == '.CheckStatus::Processing->value.'}'); + ->visibleOn('${workflow.check_status == '.CheckStatus::Processing->value.'}'); } } diff --git a/database/seeders/AdminPermissionSeeder.php b/database/seeders/AdminPermissionSeeder.php index 764c14b..7d895da 100644 --- a/database/seeders/AdminPermissionSeeder.php +++ b/database/seeders/AdminPermissionSeeder.php @@ -236,7 +236,7 @@ class AdminPermissionSeeder extends Seeder 'name' => '店长提成', 'icon' => 'icon-park-outline:paper-money', 'uri' => '/finance/store-master-commissions', - 'resource' => ['list', 'create', 'update', 'delete'], + 'resource' => true, 'children' => [], ], ], diff --git a/database/seeders/WorkflowSeeder.php b/database/seeders/WorkflowSeeder.php index 9ed335c..57ef3a8 100644 --- a/database/seeders/WorkflowSeeder.php +++ b/database/seeders/WorkflowSeeder.php @@ -23,6 +23,7 @@ class WorkflowSeeder extends Seeder ['key' => 'overtime_apply', 'name' => '加班申请', 'config' => $config, 'created_at' => now(), 'updated_at' => now()], ['key' => 'offical_business', 'name' => '出差报备', 'config' => $config, 'created_at' => now(), 'updated_at' => now()], ['key' => 'reimbursement', 'name' => '收支报销', 'config' => $config, 'created_at' => now(), 'updated_at' => now()], + ['key' => 'store_master_commission', 'name' => '店长提成', 'config' => $config, 'created_at' => now(), 'updated_at' => now()], ]); } }