user()->dealerWalletLogs() ->filter($request->all()) ->latest('id') ->simplePaginate($perPage)); } /** * 提现到银行 * * @return void */ public function walletToBank(Request $request, WalletService $walletService) { $input = $request->validate([ 'amount' => ['bail', 'required', 'int', 'min:1'], 'pay_password' => ['bail', 'required', 'string'], ], [], [ 'amount' => '提现金额', 'pay_password' => '支付密码', ]); $user = $request->user(); $amount = Arr::get($input, 'amount', 0); //验证支付密码 if (! $user->wallet?->verifyPassword($input['pay_password'] ?? '')) { throw new PayPasswordIncorrectException(); } if (empty($user->dealer->pay_info)) { throw new BizException('请先绑定设置收款信息'); } //校验是否关闭提现 if (!$user->dealerWallet?->withdrawable) { throw new BizException('账户已被限制提现'); } //检测是否可以提现 if (!$user->dealer->canWithdraw()) { throw new BizException('每次提现需要间隔'.app_settings('dealer.withdraw_days', 7).'天'); } // 校验提现门槛 if (bcdiv($amount, 100, 2) < app_settings('dealer.withdraw_threshold_amount', 0)) { throw new BizException('提现金额需大于'.app_settings('dealer.withdraw_threshold_amount', 0).'元'); } try { DB::beginTransaction(); $rate = app_settings('dealer.withdraw_fee_rate', '0.00');//手续费率 // $rate = 0; //计算手续费(四舍五入) $serviceAmount = round(bcdiv($rate, 100, 4) * $amount); //生成提现记录 $log = DealerWalletToBankLog::create([ 'user_id' =>$user->id, 'amount'=> bcdiv($amount, 100, 2), 'rate' => $rate, 'service_amount' => bcdiv($serviceAmount, 100, 2), 'account_amount' => bcdiv($amount - $serviceAmount, 100, 2), ]); //减去用户可提金额 $walletService->changeBalance($user, -bcdiv($amount, 100, 2), DealerWalletAction::WithdrawBank, '提现', $log); DB::commit(); } catch (BizException $th) { DB::rollBack(); throw new BizException($th->getMessage()); } catch (Throwable $th) { DB::rollBack(); report($th); throw new BizException('系统繁忙,请稍后再试'); } return response()->noContent(); } /** * 余额转账 * * @return void */ public function walletTransfer(Request $request, WalletService $walletService) { $input = $request->validate([ 'phone' => ['bail', 'required', new PhoneNumber()], 'amount' => ['bail', 'required', 'int', 'min:1'], 'pay_password' => ['bail', 'required', 'filled', 'string', 'size:6'], ]); $user = $request->user(); //校验是否关闭 if (!$user->dealerWallet?->withdrawable) { throw new BizException('账户已被限制转账'); } //判断转账对象是否存在 $toUser = User::where('phone', '=', $input['phone'])->first(); if (is_null($toUser)) { throw new BizException('转账对象不存在'); } //校验安全密码 if (! $user->wallet?->verifyPassword($input['pay_password'])) { throw new PayPasswordIncorrectException(); } try { DB::beginTransaction(); //转出对象 $log = $walletService->changeBalance($user, -Arr::get($input, 'amount', 0), DealerWalletAction::TransferOut, '转出-'.$toUser->phone.($toUser->userInfo?->nickname ? '【'.$toUser->userInfo->nickname.'】' : '')); //转入对象 $walletService->changeBalance($toUser, Arr::get($input, 'amount', 0), DealerWalletAction::TransferIn, $user->phone.($user->userInfo?->nickname ? '【'.$user->userInfo->nickname.'】' : '').'-转入', $log); DB::commit(); } catch (Throwable $th) { DB::rollBack(); report($th); throw new BizException('转账失败,请稍后再试'); } return response()->noContent(); } /** * 提现记录 * * @return void */ public function walletToBankLogs(Request $request) { $perPage = PaginatorHelper::resolvePerPage('per_page', 20, 50); $logs = $request->user()->dealerWalletToBankLogs() ->latest('id') ->simplePaginate($perPage); return WalletToBankLogSimpleResource::collection($logs); } /** * 提现记录详情 * * @param [type] $id * @param Request $request * @return void */ public function walletToBankLogShow($id, Request $request) { $log = $request->user()->dealerWalletToBankLogs()->findOrFail($id); return WalletToBankLogResource::make($log); } }