From d63aee36afcedecc9b3b09b75fc0975e8baca3fb Mon Sep 17 00:00:00 2001 From: Jing Li Date: Thu, 28 Mar 2024 16:31:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E6=8A=A5=E6=95=B0=E6=8D=AE=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Finance/LedgerController.php | 113 ++++++++++++------ app/Models/Ledger.php | 6 + app/Models/LedgerItem.php | 39 ++++++ ...03_28_120149_create_ledger_items_table.php | 34 ++++++ database/seeders/KeywordSeeder.php | 14 ++- 5 files changed, 166 insertions(+), 40 deletions(-) create mode 100644 app/Models/LedgerItem.php create mode 100644 database/migrations/2024_03_28_120149_create_ledger_items_table.php diff --git a/app/Admin/Controllers/Finance/LedgerController.php b/app/Admin/Controllers/Finance/LedgerController.php index f9b4a16..6dbb8c5 100644 --- a/app/Admin/Controllers/Finance/LedgerController.php +++ b/app/Admin/Controllers/Finance/LedgerController.php @@ -20,6 +20,74 @@ 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 list(): Page { $crud = $this->baseCRUD() @@ -96,7 +164,7 @@ class LedgerController extends AdminController public function detail(): Form { return $this->baseDetail()->title()->body([ - amis()->Property()->title('上报数据')->column(2)->items([ + amis()->Property()->column(2)->items([ ['label' => __('finance.ledger.date'), 'content' => '${date}'], ['label' => __('finance.ledger.store'), 'content' => '${store.title}'], ['label' => __('finance.ledger.sales'), 'content' => '${sales}'], @@ -105,50 +173,17 @@ class LedgerController extends AdminController ['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' => 2 + ], ['label' => __('finance.ledger.photos'), 'content' => amis()->Images()->enlargeAble()->source('${photos}')->enlargeWithGallary(), 'span' => 2], ['label' => __('finance.ledger.ledger_status'), 'content' => amis()->Mapping()->map(LedgerStatus::labelMap())->value('${ledger_status}'), 'span' => 2], ]), ]); } - /** - * 审核 - */ - 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, '操作成功'); - } - protected function rowApprovalButton() { return amis()->DialogAction()->icon('fa-regular fa-check-circle')->label(__('finance.ledger.approval'))->level('link')->dialog( diff --git a/app/Models/Ledger.php b/app/Models/Ledger.php index 95d11de..f74c7f5 100644 --- a/app/Models/Ledger.php +++ b/app/Models/Ledger.php @@ -9,6 +9,7 @@ use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\HasMany; class Ledger extends Model { @@ -40,6 +41,11 @@ class Ledger extends Model return $this->belongsTo(Store::class); } + public function items(): HasMany + { + return $this->hasMany(LedgerItem::class); + } + protected function photos(): Attribute { return Attribute::make( diff --git a/app/Models/LedgerItem.php b/app/Models/LedgerItem.php new file mode 100644 index 0000000..4e44503 --- /dev/null +++ b/app/Models/LedgerItem.php @@ -0,0 +1,39 @@ + 'date', + 'approved' => 'bool', + ]; + + protected $fillable = [ + 'ledger_id', + 'ledger_item_type_id', + 'store_id', + 'date', + 'sales', + 'expenditure', + 'approved', + ]; + + public function ledger(): BelongsTo + { + return $this->belongsTo(Ledger::class); + } + + public function type(): BelongsTo + { + return $this->belongsTo(Keyword::class, 'ledger_item_type_id', 'key'); + } +} diff --git a/database/migrations/2024_03_28_120149_create_ledger_items_table.php b/database/migrations/2024_03_28_120149_create_ledger_items_table.php new file mode 100644 index 0000000..8cfae0c --- /dev/null +++ b/database/migrations/2024_03_28_120149_create_ledger_items_table.php @@ -0,0 +1,34 @@ +id(); + $table->foreignId('ledger_id')->comment('上报数据ID'); + $table->string('ledger_item_type_id')->comment('上报数据类型, keywords.ledger_item_type'); + $table->foreignId('store_id')->comment('门店ID'); + $table->date('date')->comment('日期'); + $table->decimal('sales', 10, 2)->comment('销量'); + $table->decimal('expenditure', 10, 2)->comment('支出'); + $table->boolean('approved')->default(false)->comment('是否审核通过'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('ledger_items'); + } +}; diff --git a/database/seeders/KeywordSeeder.php b/database/seeders/KeywordSeeder.php index 50bf5f1..a9c0508 100644 --- a/database/seeders/KeywordSeeder.php +++ b/database/seeders/KeywordSeeder.php @@ -70,7 +70,19 @@ class KeywordSeeder extends Seeder [ 'key' => 'lottery_type', 'name' => '彩种类型', - 'children' => ['大乐透', '七星彩', '排列三', '排列五', '合买', '即开'], + 'children' => [ + ['name' => '大乐透', 'value' => 'ledger_item_type_1'], + ['name' => '七星彩', 'value' => 'ledger_item_type_2'], + ['name' => '排列三', 'value' => 'ledger_item_type_3'], + ['name' => '排列五', 'value' => 'ledger_item_type_4'], + ['name' => '合买', 'value' => 'ledger_item_type_5'], + ['name' => '即开', 'value' => 'ledger_item_type_6'], + ], + ], + [ + 'key' => 'ledger_item_type', + 'name' => '上报数据类型', + 'children' => ['大乐透', '七星彩', '排列三', '排列五', '合买', '即开', ['key' => 'ledger_item_type_other', 'name' => '其他']], ], ];