all(), rules: [ 'approval_result' => ['bail', 'required', Rule::in([1, 2])], 'failed_reason' => ['bail', 'required_if:approval_result,2'], ], attributes: [ 'approval_result' => __('finance.reimbursement.approval_result'), 'failed_reason' => __('finance.reimbursement.failed_reason'), ], ); if ($validator->fails()) { return $this->response()->fail($validator->errors()->first()); } /** @var \App\Models\Reimbursement */ $reimbursement = Reimbursement::findOrFail($id); if (! $reimbursement->isPending()) { return $this->response()->fail('收支报销不是待审核状态'); } $reimbursement->update([ 'reimbursement_status' => $request->input('approval_result') == 1 ? ReimbursementStatus::Passed : ReimbursementStatus::Rejected, ]); return $this->response()->success(null, '审核成功'); } public function list(): Page { $crud = $this->baseCRUD() ->headerToolbar([ ...$this->baseHeaderToolBar(), ]) ->bulkActions([]) ->filter($this->baseFilter()->body([ amis()->GroupControl()->mode('horizontal')->body([ amis()->TextControl('employee_name', __('finance.reimbursement.employee')) ->placeholder(__('finance.reimbursement.employee')), amis()->SelectControl('reimbursement_type_id', __('finance.reimbursement.type')) ->multiple() ->source(admin_url('api/keywords/tree-list?parent_key=reimbursement_type')) ->labelField('name') ->valueField('key'), amis()->SelectControl('status', __('finance.reimbursement.status')) ->multiple() ->options(ReimbursementStatus::options()), ]), amis()->GroupControl()->mode('horizontal')->body([ amis()->InputDatetimeRange() ->name('datetime_range') ->label(__('finance.reimbursement.created_at')) ->format('YYYY-MM-DD HH:mm:ss') ->columnRatio(4), ]), ])) ->columns([ // amis()->TableColumn()->name('id')->label(__('finance.reimbursement.id')), amis()->TableColumn()->name('employee.name')->label(__('finance.reimbursement.employee')), amis()->TableColumn()->name('expense')->label(__('finance.reimbursement.expense')), amis()->TableColumn()->name('reason')->label(__('finance.reimbursement.reason')), amis()->TableColumn()->name('type.name')->label(__('finance.reimbursement.type')), amis()->TableColumn() ->name('reimbursement_status') ->label(__('finance.reimbursement.status')) ->type('mapping') ->map(ReimbursementStatus::labelMap()), amis()->TableColumn()->name('created_at')->label(__('finance.reimbursement.created_at')), $this->rowActions([ $this->rowApprovalButton() ->visibleOn('${reimbursement_status == '.ReimbursementStatus::Pending->value.'}'), $this->rowShowButton()->visible(Admin::user()->can('admin.finance.reimbursements.view')), ]), ]); return $this->baseList($crud); } public function detail(): Form { return $this->baseDetail()->title()->body([ amis()->Property()->items([ ['label' => __('finance.reimbursement.employee'), 'content' => '${employee.name}'], ['label' => __('finance.reimbursement.expense'), 'content' => '${expense}'], ['label' => __('finance.reimbursement.reason'), 'content' => '${reason}'], ['label' => __('finance.reimbursement.type'), 'content' => '${type.name}'], ['label' => __('finance.reimbursement.status'), 'content' => amis()->Mapping()->map(ReimbursementStatus::labelMap())->value('${reimbursement_status}')], ['label' => __('finance.reimbursement.created_at'), 'content' => '${created_at}'], ['label' => __('finance.reimbursement.photos'), 'content' => amis()->Images()->enlargeAble()->source('${photos}')->enlargeWithGallary(), 'span' => 3], ]), ]); } /** * 审核操作按钮 */ protected function rowApprovalButton(): DialogAction { return amis()->DialogAction()->icon('fa-regular fa-check-circle')->label(__('finance.reimbursement.approval'))->level('link')->dialog( amis()->Dialog()->title(__('finance.reimbursement.approval'))->body([ amis()->Form()->title('') ->api('post:'.admin_url('finance/reimbursements/${id}/approval')) ->body([ amis()->RadiosControl('approval_result', __('finance.reimbursement.approval_result')) ->options([ ['label' => '通过', 'value' => 1], ['label' => '驳回', 'value' => 2], ]) ->selectFirst() ->required(), amis()->TextareaControl('failed_reason', __('finance.reimbursement.failed_reason')) ->visibleOn('${approval_result == 2}') ->required(), ]), ])->size('md') ); } }