store-manage/app/Admin/Controllers/Finance/LedgerController.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(),
]),
])
);
}
}