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])], 'pay_password' => ['bail', 'required'], ]); $user = $request->user(); if (! $user->wallet?->verifyPassword($validated['pay_password'])) { throw new PayPasswordIncorrectException(); } 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(); } }