store-manage/app/Admin/Controllers/Finance/ReimbursementController.php

151 lines
6.5 KiB
PHP

<?php
namespace App\Admin\Controllers\Finance;
use App\Admin\Controllers\AdminController;
use App\Admin\Services\Finance\ReimbursementService;
use App\Enums\ReimbursementStatus;
use App\Models\Reimbursement;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
use Slowlyo\OwlAdmin\Admin;
use Slowlyo\OwlAdmin\Renderers\DialogAction;
use Slowlyo\OwlAdmin\Renderers\Form;
use Slowlyo\OwlAdmin\Renderers\Page;
/**
* @property ReimbursementService $service
*/
class ReimbursementController extends AdminController
{
protected string $serviceName = ReimbursementService::class;
/**
* 审核
*/
public function approval($id, Request $request)
{
$validator = Validator::make(
data: $request->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')
);
}
}