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

141 lines
4.1 KiB
PHP

<?php
namespace App\Endpoint\Api\Http\Controllers\Account;
use App\Endpoint\Api\Http\Controllers\Controller;
use App\Endpoint\Api\Http\Resources\DistributionPreIncomeResource;
use App\Endpoint\Api\Http\Resources\WalletLogResource;
use App\Exceptions\InvalidPaySerialNumberException;
use App\Helpers\Paginator as PaginatorHelper;
use App\Models\BalanceLog;
use App\Models\Order;
use App\Models\PayLog;
use App\Models\WalletLog;
use App\Services\BalanceService;
use App\Services\PayService;
use App\Services\WalletService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
use Throwable;
class WalletController extends Controller
{
/**
* 账户明细
*
* @param Request $request
* @return void
*/
public function index(Request $request)
{
return response()->json([
'distribution_pre' => $request->user()->distributionPreIncomes()->pending()->sum('total_revenue'),
'wallet_balance'=> $request->user()->wallet?->balance ?? 0,
]);
}
/**
* 预收益明细
*
* @param Request $request
* @return void
*/
public function distributionLogs(Request $request)
{
$perPage = PaginatorHelper::resolvePerPage('per_page', 20, 50);
$distributionLogs = $request->user()->distributionPreIncomes()
->with('logs')
->pending()
->latest('id')
->simplePaginate($perPage);
return DistributionPreIncomeResource::collection($distributionLogs);
}
/**
* 可提明细
*
* @param Request $request
* @return void
*/
public function walletLogs(Request $request)
{
$perPage = PaginatorHelper::resolvePerPage('per_page', 20, 50);
$walletLogs = $request->user()->walletLogs()
->latest('id')
->simplePaginate($perPage);
return WalletLogResource::collection($walletLogs);
}
/**
* 余额明细
*
* @return void
*/
public function balanceLogs(Request $request)
{
}
/**
* 钱包付款
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*
* @throws \App\Exceptions\BizException
*/
public function pay(Request $request)
{
$validated = $request->validate([
'pay_sn' => ['bail', 'required'],
'pay_way' => ['bail', 'required', Rule::in([PayLog::PAY_WAY_WALLET, PayLog::PAY_WAY_BALANCE])],
]);
$user = $request->user();
// todo 校验支付密码
try {
DB::transaction(function () use ($user, $validated) {
$payLog = PayLog::where('pay_sn', $validated['pay_sn'])
->where('pay_way', $validated['pay_way'])
->lockForUpdate()
->first();
if ($payLog === null) {
throw new InvalidPaySerialNumberException();
}
$payable = $payLog->payable;
if ($payable instanceof Order) {
if ($payLog->isWallet()) {
(new WalletService())->changeBalance($user, -$payable->total_amount, WalletLog::ACTION_ORDER_PAY, '订单-支付', $payable);
} else {
(new BalanceService())->changeBalance($user, -$payable->total_amount, BalanceLog::ACTION_ORDER_PAY, '订单-支付', $payable);
}
}
(new PayService())->handleSuccess($payLog);
});
} catch (InvalidPaySerialNumberException $e) {
throw $e;
} catch (Throwable $e) {
try {
(new PayService())->handleFailedByPaySerialNumber($validated['pay_sn'], [
'failed_reason' => $e->getMessage(),
]);
} catch (Throwable $e) {
report($e);
}
throw $e;
}
return response()->noContent();
}
}