6
0
Fork 0
jiqu-library-server/app/Endpoint/Api/Http/Controllers/Dealer/WalletController.php

186 lines
6.3 KiB
PHP

<?php
namespace App\Endpoint\Api\Http\Controllers\Dealer;
use App\Endpoint\Api\Http\Controllers\Controller;
use App\Endpoint\Api\Http\Resources\Dealer\WalletLogResource;
use App\Endpoint\Api\Http\Resources\Dealer\WalletToBankLogResource;
use App\Endpoint\Api\Http\Resources\Dealer\WalletToBankLogSimpleResource;
use App\Enums\DealerWalletAction;
use App\Exceptions\BizException;
use App\Exceptions\PayPasswordIncorrectException;
use App\Helpers\Paginator as PaginatorHelper;
use App\Models\DealerWalletToBankLog;
use App\Models\User;
use App\Rules\PhoneNumber;
use App\Services\Dealer\WalletService;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
use Throwable;
class WalletController extends Controller
{
/**
* 余额明细
*
* @param Request $request
* @return void
*/
public function index(Request $request)
{
$perPage = PaginatorHelper::resolvePerPage('per_page', 20, 50);
return WalletLogResource::collection($request->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),
'manager_id' => $user->dealer->firstManager()?->user_id,
]);
//减去用户可提金额
$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);
}
}