From 9aff66fa23ce8235896b273c1fce169662bff531 Mon Sep 17 00:00:00 2001 From: Jing Li Date: Fri, 12 Apr 2024 18:24:00 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E4=B8=8A=E6=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Api/Ledger/LedgerController.php | 197 ++++++++++++++++++ .../Api/Ledger/LotteryTypeController.php | 22 ++ .../Controllers/Api/LotteryTypeController.php | 19 -- app/Models/Ledger.php | 11 + app/Models/Store.php | 13 ++ routes/api.php | 10 +- 6 files changed, 250 insertions(+), 22 deletions(-) create mode 100644 app/Http/Controllers/Api/Ledger/LedgerController.php create mode 100644 app/Http/Controllers/Api/Ledger/LotteryTypeController.php delete mode 100644 app/Http/Controllers/Api/LotteryTypeController.php diff --git a/app/Http/Controllers/Api/Ledger/LedgerController.php b/app/Http/Controllers/Api/Ledger/LedgerController.php new file mode 100644 index 0000000..04c064e --- /dev/null +++ b/app/Http/Controllers/Api/Ledger/LedgerController.php @@ -0,0 +1,197 @@ +user(); + + if (! $user->isStoreMaster()) { + throw new RuntimeException('非店长不可上报数据'); + } + + // 是否是彩票店数据上报 + $isLotteryLedger = $user->store->isLotteryStore(); + + $validated = $request->validate( + rules: [ + 'date' => ['bail', 'required', 'date_format:Y-m-d'], + 'items' => $isLotteryLedger ? ['bail', 'required', 'array'] : ['bail', 'array'], + 'new_customers' => ['bail', 'required', 'int', 'min:0'], + 'sales' => ['bail', 'required', 'numeric', 'min:0'], + 'expenditure' => ['bail', 'required', 'numeric', 'min:0'], + 'handover_amount' => ['bail', 'required', 'numeric', 'min:0'], + 'photos' => ['bail', 'required', 'array'], + ], + attributes: [ + 'date' => '日期', + 'items' => '彩种数据', + 'new_customers' => '新增客户', + 'sales' => '销售合计', + 'expenditure' => $isLotteryLedger ? '兑奖合计' : '支出合计', + 'handover_amount' => '交账金额', + 'photos' => '时段报表照片', + ], + ); + + /** @var \Illuminate\Database\Eloquent\Collection */ + $lotteryTypes = Keyword::filter(['parent_key' => 'lottery_type']) + ->oldest('sort') + ->get() + // 过滤未绑定上报数据类型的彩种 + ->filter(fn (Keyword $type) => (string) $type->value !== ''); + + // 上报数据项的格式: + // [ + // ['id' => '上报数据类型1', 'sales' => '销售金额', 'expenditure' => '兑奖金额'], + // ['id' => '上报数据类型2', 'sales' => '销售金额', 'expenditure' => '兑奖金额'], + // ] + + if ($isLotteryLedger) { + $items = collect($validated['items'])->keyBy('id'); + + /** @var \App\Models\Keyword */ + foreach ($lotteryTypes as $lotteryType) { + $item = $items->get($lotteryType->value); + + if (is_null($item)) { + throw new RuntimeException("{$lotteryType->name}未填写上报数据"); + } + + Validator::validate( + data: $item, + rules: [ + 'sales' => ['bail', 'required', 'numeric', 'min:0'], + 'expenditure' => ['bail', 'required', 'numeric', 'min:0'], + ], + attributes: [ + 'sales' => "[$lotteryType->name]销售金额", + 'expenditure' => "[$lotteryType->name]兑奖金额", + ], + ); + } + } + + /** @var \App\Models\Ledger|null */ + $ledger = Ledger::where('store_id', $user->store_id) + ->where('date', $validated['date']) + ->first(); + + if ($ledger && ! $ledger->allowReReport()) { + throw new RuntimeException('上报数据已更新,不可重新上传'); + } + + $ratio = bcdiv($user->store->profit_ratio, 100, 2); + + // 计算预期佣金 + $validated['expected_commission'] = bcmul($validated['sales'], $ratio, 2); + // 计算预期收益 + $validated['expected_income'] = bcsub($validated['expected_commission'], $validated['expenditure'], 2); + + try { + DB::beginTransaction(); + + if (is_null($ledger)) { + $ledger = Ledger::create( + array_merge($validated, ['store_id' => $user->store_id]) + ); + } else { + $ledger->update($validated); + $ledger->items()->delete(); + } + + LedgerItem::insert( + collect( + $isLotteryLedger ? $validated['items'] : [ + [ + 'id' => 'ledger_item_type_other', + 'sales' => $ledger->sales, + 'expenditure' => $ledger->expenditure, + ], + ] + )->map(fn ($item) => [ + 'date' => $ledger->date, + 'store_id' => $ledger->store_id, + 'ledger_id' => $ledger->id, + 'ledger_item_type_id' => $item['id'], + 'sales' => $item['sales'], + 'expenditure' => $item['expenditure'], + 'created_at' => $ledger->updated_at, + 'updated_at' => $ledger->updated_at, + ])->all() + ); + + DB::commit(); + } catch (Throwable $e) { + DB::rollBack(); + + throw tap($e, fn ($e) => report($e)); + } + + return $this->prepareLedger($ledger); + } + + public function show(string $date, Request $request) + { + /** @var \App\Models\Employee */ + $user = $request->user(); + + /** @var \App\Models\Ledger|null */ + $ledger = Ledger::with(['items']) + ->where('store_id', $user->store_id) + ->where('date', $date) + ->first(); + + $data = null; + + if ($ledger) { + $data = [ + 'date' => $ledger->date, + 'items' => $ledger->items->map(fn ($item) => [ + 'id' => $item->ledger_item_type_id, + 'sales' => $item->sales, + 'expenditure' => $item->expenditure, + ]), + 'new_customers' => $ledger->new_customers, + 'sales' => $ledger->sales, + 'expenditure' => $ledger->expenditure, + 'handover_amount' => $ledger->handover_amount, + 'photos' => $ledger->photos, + ]; + } + + return [ + 'data' => $ledger ? $this->prepareLedger($ledger) : null, + ]; + } + + protected function prepareLedger(Ledger $ledger) + { + return [ + 'date' => $ledger->date, + 'items' => $ledger->items->map(fn ($item) => [ + 'id' => $item->ledger_item_type_id, + 'sales' => $item->sales, + 'expenditure' => $item->expenditure, + ]), + 'new_customers' => $ledger->new_customers, + 'sales' => $ledger->sales, + 'expenditure' => $ledger->expenditure, + 'handover_amount' => $ledger->handover_amount, + 'photos' => $ledger->photos, + ]; + } +} diff --git a/app/Http/Controllers/Api/Ledger/LotteryTypeController.php b/app/Http/Controllers/Api/Ledger/LotteryTypeController.php new file mode 100644 index 0000000..822d1b0 --- /dev/null +++ b/app/Http/Controllers/Api/Ledger/LotteryTypeController.php @@ -0,0 +1,22 @@ + 'lottery_type'])->oldest('sort')->get(); + + return $lotteryTypes + ->filter(fn (Keyword $type) => (string) $type->value !== '') + ->map(fn ($item) => [ + 'id' => $item->value, + 'name' => $item->name, + ]); + } +} diff --git a/app/Http/Controllers/Api/LotteryTypeController.php b/app/Http/Controllers/Api/LotteryTypeController.php deleted file mode 100644 index 6c0ebf7..0000000 --- a/app/Http/Controllers/Api/LotteryTypeController.php +++ /dev/null @@ -1,19 +0,0 @@ - 'lottery_type'])->oldest('sort')->get(); - - return $lotteryTypes->map(fn ($item) => [ - 'id' => $item->value, - 'name' => $item->name, - ]); - } -} diff --git a/app/Models/Ledger.php b/app/Models/Ledger.php index e8afe95..cf538bf 100644 --- a/app/Models/Ledger.php +++ b/app/Models/Ledger.php @@ -19,6 +19,9 @@ class Ledger extends Model protected $attributes = [ 'new_customers' => 0, + 'ledger_amount' => null, + 'actual_commission' => null, + 'actual_income' => null, ]; protected $fillable = [ @@ -46,6 +49,14 @@ class Ledger extends Model return $this->hasMany(LedgerItem::class); } + /** + * 是否允许重新上报 + */ + public function allowReReport(): bool + { + return is_null($this->ledger_amount) && is_null($this->actual_commission) && is_null($this->actual_income); + } + protected function ledgerDifference(): Attribute { return Attribute::make( diff --git a/app/Models/Store.php b/app/Models/Store.php index 26c8e22..c7c2178 100644 --- a/app/Models/Store.php +++ b/app/Models/Store.php @@ -62,6 +62,19 @@ class Store extends Model return $this->hasMany(Employee::class, 'store_id'); } + public function ledgers() + { + return $this->hasMany(Ledger::class); + } + + /** + * 确认此门店是否是彩票店 + */ + public function isLotteryStore(): bool + { + return preg_match('/^store_category_lottery_/', $this->category_id); + } + protected function businessStatusText(): Attribute { return new Attribute( diff --git a/routes/api.php b/routes/api.php index b075b98..af64cab 100644 --- a/routes/api.php +++ b/routes/api.php @@ -3,7 +3,8 @@ use App\Http\Controllers\Api\Auth\AccessTokenController; use App\Http\Controllers\Api\ComplaintController; use App\Http\Controllers\Api\FeedbackController; -use App\Http\Controllers\Api\LotteryTypeController; +use App\Http\Controllers\Api\Ledger\LedgerController; +use App\Http\Controllers\Api\Ledger\LotteryTypeController; use App\Http\Controllers\Api\StatsController; use Illuminate\Support\Facades\Route; @@ -22,8 +23,11 @@ Route::group([ Route::get('/stats/dashboard', [StatsController::class, 'dashboard']); - // 彩种类型 - Route::get('lottery-types', [LotteryTypeController::class, 'index']); + // 数据上报 + Route::post('/ledger/ledgers', [LedgerController::class, 'store']); + Route::get('/ledger/ledgers/{date}', [LedgerController::class, 'show']); + Route::get('/ledger/lottery-types', [LotteryTypeController::class, 'index']); + // 举报投诉 Route::post('complaints', [ComplaintController::class, 'store']); // 意见箱 From 3c6100afb5d625a5ae183e552c98432c3901be52 Mon Sep 17 00:00:00 2001 From: Jing Li Date: Fri, 12 Apr 2024 19:02:57 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E8=B5=84=E6=96=99-?= =?UTF-8?q?=E9=97=A8=E5=BA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Api/Auth/UserController.php | 3 ++- app/Http/Resources/StoreResource.php | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Api/Auth/UserController.php b/app/Http/Controllers/Api/Auth/UserController.php index 3422b50..97eecfd 100644 --- a/app/Http/Controllers/Api/Auth/UserController.php +++ b/app/Http/Controllers/Api/Auth/UserController.php @@ -11,6 +11,7 @@ use Illuminate\Validation\ValidationException; use App\Enums\UserRole; use App\Http\Resources\KeywordResource; use App\Admin\Services\EmployeeService; +use App\Http\Resources\StoreResource; use Illuminate\Support\Facades\DB; /** @@ -29,7 +30,7 @@ class UserController extends Controller 'phone' => $user->phone, 'avatar' => $user->avatar, 'jobs' => KeywordResource::collection($user->jobs), - + 'store' => $user->store ? StoreResource::make($user->store) : null, 'unread_notifications' => 0, // 身份: user-普通员工, store-店长, admin-管理员 'role' => $user->userRole(), diff --git a/app/Http/Resources/StoreResource.php b/app/Http/Resources/StoreResource.php index a7e38aa..73adbdb 100644 --- a/app/Http/Resources/StoreResource.php +++ b/app/Http/Resources/StoreResource.php @@ -21,6 +21,7 @@ class StoreResource extends JsonResource 'lon' => $this->lon, 'lat' => $this->lat, 'address' => $this->address, + 'is_lottery_store' => $this->isLotteryStore(), ]; } } From d91abe02e75bff64153564efc7085e7c277a53fe Mon Sep 17 00:00:00 2001 From: Jing Li Date: Fri, 12 Apr 2024 19:14:13 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Models/Ledger.php | 8 ++++++++ routes/api.php | 12 ++++++++++++ 2 files changed, 20 insertions(+) diff --git a/app/Models/Ledger.php b/app/Models/Ledger.php index cf538bf..8e170c0 100644 --- a/app/Models/Ledger.php +++ b/app/Models/Ledger.php @@ -49,12 +49,20 @@ class Ledger extends Model return $this->hasMany(LedgerItem::class); } +<<<<<<< Updated upstream /** * 是否允许重新上报 */ public function allowReReport(): bool { return is_null($this->ledger_amount) && is_null($this->actual_commission) && is_null($this->actual_income); +======= + public function canReport(): bool + { + return is_null($this->ledger_amount) + && is_null($this->actual_commission) + && is_null($this->actual_income); +>>>>>>> Stashed changes } protected function ledgerDifference(): Attribute diff --git a/routes/api.php b/routes/api.php index af64cab..eb86f6d 100644 --- a/routes/api.php +++ b/routes/api.php @@ -3,8 +3,13 @@ use App\Http\Controllers\Api\Auth\AccessTokenController; use App\Http\Controllers\Api\ComplaintController; use App\Http\Controllers\Api\FeedbackController; +<<<<<<< Updated upstream use App\Http\Controllers\Api\Ledger\LedgerController; use App\Http\Controllers\Api\Ledger\LotteryTypeController; +======= +use App\Http\Controllers\Api\LedgerController; +use App\Http\Controllers\Api\LotteryTypeController; +>>>>>>> Stashed changes use App\Http\Controllers\Api\StatsController; use Illuminate\Support\Facades\Route; @@ -23,11 +28,18 @@ Route::group([ Route::get('/stats/dashboard', [StatsController::class, 'dashboard']); +<<<<<<< Updated upstream // 数据上报 Route::post('/ledger/ledgers', [LedgerController::class, 'store']); Route::get('/ledger/ledgers/{date}', [LedgerController::class, 'show']); Route::get('/ledger/lottery-types', [LotteryTypeController::class, 'index']); +======= + Route::resource('/ledger', LedgerController::class)->only(['store', 'show']); + + // 彩种类型 + Route::get('lottery-types', [LotteryTypeController::class, 'index']); +>>>>>>> Stashed changes // 举报投诉 Route::post('complaints', [ComplaintController::class, 'store']); // 意见箱 From e63c72d96eb8786d444dcf6e9b79f68c43065723 Mon Sep 17 00:00:00 2001 From: Jing Li Date: Fri, 12 Apr 2024 19:15:20 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Models/Ledger.php | 8 -------- routes/api.php | 12 ------------ 2 files changed, 20 deletions(-) diff --git a/app/Models/Ledger.php b/app/Models/Ledger.php index 8e170c0..cf538bf 100644 --- a/app/Models/Ledger.php +++ b/app/Models/Ledger.php @@ -49,20 +49,12 @@ class Ledger extends Model return $this->hasMany(LedgerItem::class); } -<<<<<<< Updated upstream /** * 是否允许重新上报 */ public function allowReReport(): bool { return is_null($this->ledger_amount) && is_null($this->actual_commission) && is_null($this->actual_income); -======= - public function canReport(): bool - { - return is_null($this->ledger_amount) - && is_null($this->actual_commission) - && is_null($this->actual_income); ->>>>>>> Stashed changes } protected function ledgerDifference(): Attribute diff --git a/routes/api.php b/routes/api.php index eb86f6d..af64cab 100644 --- a/routes/api.php +++ b/routes/api.php @@ -3,13 +3,8 @@ use App\Http\Controllers\Api\Auth\AccessTokenController; use App\Http\Controllers\Api\ComplaintController; use App\Http\Controllers\Api\FeedbackController; -<<<<<<< Updated upstream use App\Http\Controllers\Api\Ledger\LedgerController; use App\Http\Controllers\Api\Ledger\LotteryTypeController; -======= -use App\Http\Controllers\Api\LedgerController; -use App\Http\Controllers\Api\LotteryTypeController; ->>>>>>> Stashed changes use App\Http\Controllers\Api\StatsController; use Illuminate\Support\Facades\Route; @@ -28,18 +23,11 @@ Route::group([ Route::get('/stats/dashboard', [StatsController::class, 'dashboard']); -<<<<<<< Updated upstream // 数据上报 Route::post('/ledger/ledgers', [LedgerController::class, 'store']); Route::get('/ledger/ledgers/{date}', [LedgerController::class, 'show']); Route::get('/ledger/lottery-types', [LotteryTypeController::class, 'index']); -======= - Route::resource('/ledger', LedgerController::class)->only(['store', 'show']); - - // 彩种类型 - Route::get('lottery-types', [LotteryTypeController::class, 'index']); ->>>>>>> Stashed changes // 举报投诉 Route::post('complaints', [ComplaintController::class, 'store']); // 意见箱 From b9a4a46c4574a5b9c18fb81629b63e351bb65744 Mon Sep 17 00:00:00 2001 From: Jing Li Date: Fri, 12 Apr 2024 19:30:54 +0800 Subject: [PATCH 5/9] Update --- .../Controllers/Finance/LedgerController.php | 82 ++----------------- app/Admin/routes.php | 2 - 2 files changed, 5 insertions(+), 79 deletions(-) diff --git a/app/Admin/Controllers/Finance/LedgerController.php b/app/Admin/Controllers/Finance/LedgerController.php index 7c250af..dfbd616 100644 --- a/app/Admin/Controllers/Finance/LedgerController.php +++ b/app/Admin/Controllers/Finance/LedgerController.php @@ -98,16 +98,14 @@ class LedgerController extends AdminController ->url(admin_url('api/workflow/apply')) ->method('post') ->data(['id' => '${workflow.id}']) - ), + ) + ->visibleOn('${actual_commission != null && actual_income != null}'), $this->cancelAction(), $this->rowEditLedgerAmountButton() ->visible(Admin::user()->can('admin.finance.ledgers.update_ledger_amount')), - $this->rowEditActualCommissionButton() - ->visible(Admin::user()->can('admin.finance.ledgers.update_actual_commission')) - ->visibleOn('${OR(workflow.check_status == '.CheckStatus::None->value.', workflow.check_status == '.CheckStatus::Cancel->value.', workflow.check_status == '.CheckStatus::Fail->value.')}'), - $this->rowEditActualIncomeButton() - ->visible(Admin::user()->can('admin.finance.ledgers.update_actual_income')) - ->visibleOn('${OR(workflow.check_status == '.CheckStatus::None->value.', workflow.check_status == '.CheckStatus::Cancel->value.', workflow.check_status == '.CheckStatus::Fail->value.')}'), + $this->rowEditTypeButton('drawer', 'lg') + ->visible(Admin::user()->can('admin.finance.ledgers.update')) + ->visibleOn('${ARRAYINCLUDES(['.CheckStatus::None->value.','.CheckStatus::Cancel->value.','.CheckStatus::Fail->value.'], workflow.check_status)}'), $this->rowShowButton() ->visible(Admin::user()->can('admin.finance.ledgers.view')), ]), @@ -197,26 +195,6 @@ class LedgerController extends AdminController return $this->response()->success(null, '保存成功'); } - /** - * 修改实际佣金 - */ - public function updateActualCommission($id, Request $request) - { - $this->service->update($id, $request->only(['actual_commission'])); - - return $this->response()->success(null, '保存成功'); - } - - /** - * 修改实际收益 - */ - public function updateActualIncome($id, Request $request) - { - $this->service->update($id, $request->only(['actual_income'])); - - return $this->response()->success(null, '保存成功'); - } - /** * 编辑总账金额按钮 */ @@ -241,54 +219,4 @@ class LedgerController extends AdminController ])->size('lg') ); } - - /** - * 编辑实际佣金按钮 - */ - protected function rowEditActualCommissionButton(): DrawerAction - { - return amis()->DrawerAction() - ->icon('fa-regular fa-pen-to-square') - ->label(__('finance.ledger.actual_commission')) - ->level('link') - ->drawer( - amis()->Drawer()->title(__('finance.ledger.actual_commission'))->body([ - amis()->Form()->title('') - ->api('post:'.admin_url('finance/ledgers/${id}/actual-commission')) - ->body([ - amis()->NumberControl() - ->name('actual_commission') - ->label(__('finance.ledger.actual_commission')) - ->precision(2) - ->showSteps(false) - ->required(), - ]), - ])->size('lg') - ); - } - - /** - * 编辑实际收益按钮 - */ - protected function rowEditActualIncomeButton(): DrawerAction - { - return amis()->DrawerAction() - ->icon('fa-regular fa-pen-to-square') - ->label(__('finance.ledger.actual_income')) - ->level('link') - ->drawer( - amis()->Drawer()->title(__('finance.ledger.actual_income'))->body([ - amis()->Form()->title('') - ->api('post:'.admin_url('finance/ledgers/${id}/actual-income')) - ->body([ - amis()->NumberControl() - ->name('actual_income') - ->label(__('finance.ledger.actual_income')) - ->precision(2) - ->showSteps(false) - ->required(), - ]), - ])->size('lg') - ); - } } diff --git a/app/Admin/routes.php b/app/Admin/routes.php index 5b7e1bb..7bafef6 100644 --- a/app/Admin/routes.php +++ b/app/Admin/routes.php @@ -128,8 +128,6 @@ Route::group([ // 上报数据 $router->resource('ledgers', LedgerController::class); $router->post('ledgers/{ledger}/ledger-amount', [LedgerController::class, 'updateLedgerAmount'])->name('ledgers.update_ledger_amount'); - $router->post('ledgers/{ledger}/actual-commission', [LedgerController::class, 'updateActualCommission'])->name('ledgers.update_actual_commission'); - $router->post('ledgers/{ledger}/actual-income', [LedgerController::class, 'updateActualIncome'])->name('ledgers.update_actual_income'); // 佣金收入 $router->get('commission-incomes', [CommissionIncomeController::class, 'index'])->name('commission_incomes.index'); // 收支报销 From fb22944d07eaee0669cec914b2792bff48200095 Mon Sep 17 00:00:00 2001 From: Jing Li Date: Fri, 12 Apr 2024 19:48:43 +0800 Subject: [PATCH 6/9] Update --- database/seeders/AdminPermissionSeeder.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/database/seeders/AdminPermissionSeeder.php b/database/seeders/AdminPermissionSeeder.php index 71c5003..72cc60e 100644 --- a/database/seeders/AdminPermissionSeeder.php +++ b/database/seeders/AdminPermissionSeeder.php @@ -201,8 +201,6 @@ class AdminPermissionSeeder extends Seeder 'uri' => '/finance/ledgers', 'resource' => ['list', 'update', 'view'], 'children' => [ - 'update_actual_commission' => '编辑实际佣金', - 'update_actual_income' => '编辑实际收益', 'update_ledger_amount' => '编辑总账金额', ], ], From 52e9800292252e0d9afa705d6a853d9ba0b180a9 Mon Sep 17 00:00:00 2001 From: Jing Li Date: Fri, 12 Apr 2024 20:32:11 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=E4=BD=A3=E9=87=91=E6=8F=90=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StoreMasterCommissionController.php | 24 +++++++++++++++++ .../StoreMasterCommissionResource.php | 26 +++++++++++++++++++ app/Models/Employee.php | 9 ++++++- app/Models/StoreMasterCommission.php | 10 +++++++ routes/api.php | 4 +++ 5 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 app/Http/Controllers/Api/Account/StoreMasterCommissionController.php create mode 100644 app/Http/Resources/StoreMasterCommissionResource.php diff --git a/app/Http/Controllers/Api/Account/StoreMasterCommissionController.php b/app/Http/Controllers/Api/Account/StoreMasterCommissionController.php new file mode 100644 index 0000000..eda3da4 --- /dev/null +++ b/app/Http/Controllers/Api/Account/StoreMasterCommissionController.php @@ -0,0 +1,24 @@ +user(); + + $storeMasterCommissions = $user->storeMasterCommissions() + ->onlyApproved() + ->orderBy(DB::raw("STR_TO_DATE(month, '%Y-%m')"), 'DESC') + ->simplePaginate($request->query('per_page', 20)); + + return StoreMasterCommissionResource::collection($storeMasterCommissions); + } +} diff --git a/app/Http/Resources/StoreMasterCommissionResource.php b/app/Http/Resources/StoreMasterCommissionResource.php new file mode 100644 index 0000000..57321e7 --- /dev/null +++ b/app/Http/Resources/StoreMasterCommissionResource.php @@ -0,0 +1,26 @@ + + */ + public function toArray(Request $request): array + { + return [ + 'id' => $this->id, + 'month' => $this->month, + 'commission' => $this->commission, + 'daily_expenses' => $this->daily_expenses, + 'employee_expenses' => $this->employee_expenses, + 'other_expenses' => $this->other_expenses, + ]; + } +} diff --git a/app/Models/Employee.php b/app/Models/Employee.php index d2f457a..623394d 100644 --- a/app/Models/Employee.php +++ b/app/Models/Employee.php @@ -13,7 +13,6 @@ use Illuminate\Database\Eloquent\Model; use Laravel\Sanctum\HasApiTokens; use Slowlyo\OwlAdmin\Models\AdminUser; use App\Enums\UserRole; -use Illuminate\Support\Str; /** * 员工 @@ -77,6 +76,14 @@ class Employee extends Model implements AuthenticatableContract return $this->hasMany(EmployeeSign::class, 'employee_id'); } + /** + * 店长佣金提成 + */ + public function storeMasterCommissions() + { + return $this->hasMany(StoreMasterCommission::class, 'store_master_id'); + } + // 管理的门店(店长) // public function masterStore() // { diff --git a/app/Models/StoreMasterCommission.php b/app/Models/StoreMasterCommission.php index 7e09580..c549580 100644 --- a/app/Models/StoreMasterCommission.php +++ b/app/Models/StoreMasterCommission.php @@ -2,9 +2,11 @@ namespace App\Models; +use App\Enums\CheckStatus; use App\Traits\HasCheckable; use App\Traits\HasDateTimeFormatter; use EloquentFilter\Filterable; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -23,6 +25,14 @@ class StoreMasterCommission extends Model 'other_expenses', ]; + /** + * 仅查询审核通过的店长佣金提成 + */ + public function scopeOnlyApproved(Builder $query): void + { + $query->whereRelation('workflow', 'check_status', '=', CheckStatus::Success); + } + public function store() { return $this->belongsTo(Store::class, 'store_id'); diff --git a/routes/api.php b/routes/api.php index af64cab..118572f 100644 --- a/routes/api.php +++ b/routes/api.php @@ -1,5 +1,6 @@ Date: Fri, 12 Apr 2024 21:12:47 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=E6=8A=A5=E9=94=80=E5=88=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ReimbursementTypeController.php | 17 +++++++++++++++++ app/Http/Resources/KeywordResource.php | 2 +- routes/api.php | 6 ++++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 app/Http/Controllers/Api/Reimbursement/ReimbursementTypeController.php diff --git a/app/Http/Controllers/Api/Reimbursement/ReimbursementTypeController.php b/app/Http/Controllers/Api/Reimbursement/ReimbursementTypeController.php new file mode 100644 index 0000000..284f9cd --- /dev/null +++ b/app/Http/Controllers/Api/Reimbursement/ReimbursementTypeController.php @@ -0,0 +1,17 @@ + 'reimbursement_type'])->get(); + + return KeywordResource::collection($keywords); + } +} diff --git a/app/Http/Resources/KeywordResource.php b/app/Http/Resources/KeywordResource.php index c0535e0..2ecb230 100644 --- a/app/Http/Resources/KeywordResource.php +++ b/app/Http/Resources/KeywordResource.php @@ -15,7 +15,7 @@ class KeywordResource extends JsonResource public function toArray(Request $request): array { return [ - 'id' => $this->id, + 'id' => $this->key, 'name' => $this->name, ]; } diff --git a/routes/api.php b/routes/api.php index 118572f..02c89b4 100644 --- a/routes/api.php +++ b/routes/api.php @@ -6,6 +6,7 @@ use App\Http\Controllers\Api\ComplaintController; use App\Http\Controllers\Api\FeedbackController; use App\Http\Controllers\Api\Ledger\LedgerController; use App\Http\Controllers\Api\Ledger\LotteryTypeController; +use App\Http\Controllers\Api\Reimbursement\ReimbursementTypeController; use App\Http\Controllers\Api\StatsController; use Illuminate\Support\Facades\Route; @@ -32,6 +33,11 @@ Route::group([ Route::get('/ledger/ledgers/{date}', [LedgerController::class, 'show']); Route::get('/ledger/lottery-types', [LotteryTypeController::class, 'index']); + // 报销管理 + Route::group(['prefix' => 'reimbursement'], function () { + Route::get('reimbursement-types', [ReimbursementTypeController::class, 'index']); + }); + // 举报投诉 Route::post('complaints', [ComplaintController::class, 'store']); // 意见箱 From aea9a2487f0281e48e9bd20b52293834c313736f Mon Sep 17 00:00:00 2001 From: Jing Li Date: Fri, 12 Apr 2024 21:13:09 +0800 Subject: [PATCH 9/9] Update --- app/Providers/AppServiceProvider.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 393b32a..9b5fad0 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -3,6 +3,7 @@ namespace App\Providers; use Illuminate\Database\Eloquent\Relations\Relation; +use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider @@ -20,6 +21,8 @@ class AppServiceProvider extends ServiceProvider */ public function boot() { + JsonResource::withoutWrapping(); + $this->definePolymorphicTypes(); }