generated from liutk/owl-admin-base
266 lines
11 KiB
PHP
266 lines
11 KiB
PHP
<?php
|
|
|
|
namespace App\Admin\Controllers\Finance;
|
|
|
|
use App\Admin\Controllers\AdminController;
|
|
use App\Admin\Services\Finance\LedgerService;
|
|
use App\Enums\LedgerStatus;
|
|
use App\Models\Ledger;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Validator;
|
|
use Illuminate\Validation\Rule;
|
|
use Slowlyo\OwlAdmin\Admin;
|
|
use Slowlyo\OwlAdmin\Renderers\Form;
|
|
use Slowlyo\OwlAdmin\Renderers\Page;
|
|
|
|
/**
|
|
* @property LedgerService $service
|
|
*/
|
|
class LedgerController extends AdminController
|
|
{
|
|
protected string $serviceName = LedgerService::class;
|
|
|
|
public function show($id)
|
|
{
|
|
if ($this->actionOfGetData()) {
|
|
/** @var \App\Models\Ledger */
|
|
$ledger = Ledger::findOrFail($id);
|
|
$ledger->load(['store', 'items.type']);
|
|
|
|
return $this->response()->success(
|
|
array_merge($ledger->toArray(), [
|
|
'items_property' => collect($ledger->items)->map(fn ($item) => [
|
|
['label' => '类型', 'content' => $item->type?->name ?? '-'],
|
|
['label' => '销售', 'content' => $item->sales],
|
|
['label' => $item->ledger_item_type_id === 'ledger_item_type_other' ? '支出' : '兑奖', 'content' => $item->expenditure],
|
|
])->collapse()->all()
|
|
])
|
|
);
|
|
}
|
|
|
|
$detail = amis()
|
|
->Card()
|
|
->className('base-form')
|
|
->header(['title' => __('admin.detail')])
|
|
->body($this->detail())
|
|
->toolbar([$this->backButton()]);
|
|
|
|
$page = $this->basePage()->body($detail);
|
|
|
|
return $this->response()->success($page);
|
|
}
|
|
|
|
/**
|
|
* 审核
|
|
*/
|
|
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.ledger.approval_result'),
|
|
'failed_reason' => __('finance.ledger.failed_reason'),
|
|
],
|
|
);
|
|
|
|
if ($validator->fails()) {
|
|
return $this->response()->fail($validator->errors()->first());
|
|
}
|
|
|
|
$ledger = Ledger::findOrFail($id);
|
|
|
|
if ($ledger->ledger_status !== LedgerStatus::Processing) {
|
|
return $this->response()->fail('上报数据不是待审核状态');
|
|
}
|
|
|
|
if ($request->input('approval_result') == 1) {
|
|
$ledger->ledger_status = LedgerStatus::Passed;
|
|
} else {
|
|
$ledger->ledger_status = LedgerStatus::Rejected;
|
|
}
|
|
|
|
$ledger->save();
|
|
|
|
return $this->response()->success(null, '审核成功');
|
|
}
|
|
|
|
public function updateLedgerAmount($id, Request $request)
|
|
{
|
|
$validator = Validator::make(
|
|
data: $request->all(),
|
|
rules: [
|
|
'ledger_amount' => ['bail', 'required', 'numeric'],
|
|
],
|
|
attributes: [
|
|
'ledger_amount' => __('finance.ledger.ledger_amount'),
|
|
],
|
|
);
|
|
|
|
if ($validator->fails()) {
|
|
return $this->response()->fail($validator->errors()->first());
|
|
}
|
|
|
|
$ledger = Ledger::findOrFail($id);
|
|
|
|
$ledger->update([
|
|
'ledger_amount' => $request->input('ledger_amount'),
|
|
]);
|
|
|
|
return $this->response()->success(null, '修改成功');
|
|
}
|
|
|
|
public function list(): Page
|
|
{
|
|
$crud = $this->baseCRUD()
|
|
->tableLayout('fixed')
|
|
->headerToolbar([
|
|
...$this->baseHeaderToolBar(),
|
|
])
|
|
->bulkActions([])
|
|
->filter($this->baseFilter()->body([
|
|
amis()->GroupControl()->mode('horizontal')->body([
|
|
amis()->SelectControl('store_id', __('finance.ledger.store'))
|
|
->source(admin_url('api/stores'))
|
|
->labelField('title')
|
|
->valueField('id')
|
|
->clearable()
|
|
->columnRatio(3),
|
|
amis()->SelectControl('status', __('finance.ledger.ledger_status'))
|
|
->multiple()
|
|
->options(LedgerStatus::options())
|
|
->columnRatio(3),
|
|
amis()->DateRangeControl('date_range', __('finance.ledger.date'))
|
|
->valueFormat('YYYY-MM-DD'),
|
|
]),
|
|
]))
|
|
->columns([
|
|
// amis()->TableColumn()->name('id')->label(__('finance.ledger.id')),
|
|
amis()->TableColumn()->name('date')->label(__('finance.ledger.date')),
|
|
amis()->TableColumn()->name('store.title')->label(__('finance.ledger.store')),
|
|
amis()->TableColumn()->name('sales')->label(__('finance.ledger.sales')),
|
|
amis()->TableColumn()->name('expenditure')->label(__('finance.ledger.expenditure')),
|
|
amis()->TableColumn()->name('new_customers')->label(__('finance.ledger.new_customers')),
|
|
amis()->TableColumn()->name('handover_amount')->label(__('finance.ledger.handover_amount')),
|
|
amis()->TableColumn()->name('ledger_amount')->label(__('finance.ledger.ledger_amount')),
|
|
amis()->TableColumn()->name('ledger_difference')->label(__('finance.ledger.ledger_difference')),
|
|
amis()->TableColumn()->name('expected_commission')->label(__('finance.ledger.expected_commission')),
|
|
amis()->TableColumn()->name('actual_commission')->label(__('finance.ledger.actual_commission')),
|
|
amis()->TableColumn()->name('expected_income')->label(__('finance.ledger.expected_income')),
|
|
amis()->TableColumn()->name('actual_income')->label(__('finance.ledger.actual_income')),
|
|
amis()->TableColumn()
|
|
->name('ledger_status')
|
|
->label(__('finance.ledger.ledger_status'))
|
|
->type('mapping')
|
|
->map(LedgerStatus::labelMap()),
|
|
amis()->TableColumn()->name('created_at')->label(__('finance.ledger.created_at')),
|
|
$this->rowActions([
|
|
$this->rowApprovalButton()
|
|
->visibleOn('${ledger_status == 2}'),
|
|
$this->rowEditLedgerAmountButton()
|
|
->visible(Admin::user()->can('admin.finance.ledgers.update_ledger_amount')),
|
|
$this->rowEditButton(true)
|
|
->visible(Admin::user()->can('admin.finance.ledgers.update'))
|
|
->visibleOn('${ledger_status == 1 || ledger_status == 4}'),
|
|
$this->rowShowButton()
|
|
->visible(Admin::user()->can('admin.finance.ledgers.view')),
|
|
]),
|
|
]);
|
|
|
|
return $this->baseList($crud);
|
|
}
|
|
|
|
public function form(): Form
|
|
{
|
|
return $this->baseForm()->title('')->body([
|
|
amis()->NumberControl()
|
|
->name('actual_commission')
|
|
->label(__('finance.ledger.actual_commission'))
|
|
->precision(2)
|
|
->showSteps(false)
|
|
->required(),
|
|
|
|
amis()->NumberControl()
|
|
->name('actual_income')
|
|
->label(__('finance.ledger.actual_income'))
|
|
->precision(2)
|
|
->showSteps(false)
|
|
->required(),
|
|
]);
|
|
}
|
|
|
|
public function detail(): Form
|
|
{
|
|
return $this->baseDetail()->title()->body([
|
|
amis()->Property()->items([
|
|
['label' => __('finance.ledger.date'), 'content' => '${date}'],
|
|
['label' => __('finance.ledger.store'), 'content' => '${store.title}'],
|
|
['label' => __('finance.ledger.new_customers'), 'content' => '${new_customers}'],
|
|
['label' => __('finance.ledger.sales'), 'content' => '${sales}'],
|
|
['label' => __('finance.ledger.expenditure'), 'content' => '${expenditure}'],
|
|
['label' => __('finance.ledger.handover_amount'), 'content' => '${handover_amount}'],
|
|
['label' => __('finance.ledger.ledger_amount'), 'content' => '${ledger_amount}'],
|
|
['label' => __('finance.ledger.ledger_difference'), 'content' => '${ledger_difference}'],
|
|
['label' => __('finance.ledger.expected_commission'), 'content' => '${expected_commission}'],
|
|
['label' => __('finance.ledger.actual_commission'), 'content' => '${actual_commission}'],
|
|
['label' => __('finance.ledger.expected_income'), 'content' => '${expected_income}'],
|
|
['label' => __('finance.ledger.actual_income'), 'content' => '${actual_income}'],
|
|
[
|
|
'label' => '上报数据',
|
|
'content' => amis()->Property()->source('${items_property}'),
|
|
'span' => 3
|
|
],
|
|
['label' => __('finance.ledger.photos'), 'content' => amis()->Images()->enlargeAble()->source('${photos}')->enlargeWithGallary(), 'span' => 3],
|
|
['label' => __('finance.ledger.ledger_status'), 'content' => amis()->Mapping()->map(LedgerStatus::labelMap())->value('${ledger_status}'), 'span' => 3],
|
|
]),
|
|
]);
|
|
}
|
|
|
|
protected function rowApprovalButton()
|
|
{
|
|
return amis()->DialogAction()->icon('fa-regular fa-check-circle')->label(__('finance.ledger.approval'))->level('link')->dialog(
|
|
amis()->Dialog()->title(__('finance.ledger.approval'))->body([
|
|
amis()->Form()->title('')
|
|
->api('post:'.admin_url('finance/ledgers/${id}/approval'))
|
|
->body([
|
|
amis()->RadiosControl('approval_result', __('finance.ledger.approval_result'))
|
|
->options([
|
|
['label' => '通过', 'value' => 1],
|
|
['label' => '驳回', 'value' => 2],
|
|
])
|
|
->selectFirst()
|
|
->required(),
|
|
amis()->TextareaControl('failed_reason', __('finance.ledger.failed_reason'))
|
|
->visibleOn('${approval_result == 2}')
|
|
->required(),
|
|
]),
|
|
])->size('md')
|
|
);
|
|
}
|
|
|
|
protected function rowEditLedgerAmountButton()
|
|
{
|
|
return amis()->DialogAction()
|
|
->icon('fa-regular fa-pen-to-square')
|
|
->label(__('finance.ledger.ledger_amount'))
|
|
->level('link')
|
|
->dialog(
|
|
amis()->Dialog()->title(__('finance.ledger.ledger_amount'))->body([
|
|
amis()->Form()->title('')
|
|
->api('post:'.admin_url('finance/ledgers/${id}/ledger-amount'))
|
|
->body([
|
|
amis()->NumberControl()
|
|
->name('ledger_amount')
|
|
->label(__('finance.ledger.ledger_amount'))
|
|
->precision(2)
|
|
->showSteps(false)
|
|
->required(),
|
|
]),
|
|
])
|
|
);
|
|
}
|
|
}
|