129 lines
3.6 KiB
PHP
129 lines
3.6 KiB
PHP
<?php
|
||
|
||
/**
|
||
* 文件功能:银行控制器
|
||
*
|
||
* 提供存款、取款、余额查询三个接口,金币在流通账户(jjb)
|
||
* 与银行账户(bank_jjb)之间互转,所有操作记录到 bank_logs。
|
||
*
|
||
* @author ChatRoom Laravel
|
||
*
|
||
* @version 1.0.0
|
||
*/
|
||
|
||
namespace App\Http\Controllers;
|
||
|
||
use App\Models\BankLog;
|
||
use Illuminate\Http\JsonResponse;
|
||
use Illuminate\Http\Request;
|
||
use Illuminate\Support\Facades\Auth;
|
||
use Illuminate\Support\Facades\DB;
|
||
|
||
class BankController extends Controller
|
||
{
|
||
/**
|
||
* 查询银行余额及最近20条流水记录
|
||
*/
|
||
public function info(): JsonResponse
|
||
{
|
||
$user = Auth::user();
|
||
$logs = BankLog::where('user_id', $user->id)
|
||
->latest()
|
||
->limit(20)
|
||
->get(['type', 'amount', 'balance_after', 'created_at']);
|
||
|
||
return response()->json([
|
||
'status' => 'success',
|
||
'jjb' => $user->jjb ?? 0,
|
||
'bank_jjb' => $user->bank_jjb ?? 0,
|
||
'logs' => $logs,
|
||
]);
|
||
}
|
||
|
||
/**
|
||
* 存款:从流通金币(jjb)转入银行(bank_jjb)
|
||
*
|
||
* 请求参数:amount(正整数)
|
||
*/
|
||
public function deposit(Request $request): JsonResponse
|
||
{
|
||
$request->validate([
|
||
'amount' => 'required|integer|min:1|max:9999999',
|
||
]);
|
||
|
||
$amount = $request->integer('amount');
|
||
$user = Auth::user();
|
||
|
||
if (($user->jjb ?? 0) < $amount) {
|
||
return response()->json([
|
||
'status' => 'error',
|
||
'message' => '流通金币不足!当前余额 '.($user->jjb ?? 0)." 枚,无法存入 {$amount} 枚。",
|
||
]);
|
||
}
|
||
|
||
DB::transaction(function () use ($user, $amount): void {
|
||
$user->decrement('jjb', $amount);
|
||
$user->increment('bank_jjb', $amount);
|
||
|
||
BankLog::create([
|
||
'user_id' => $user->id,
|
||
'type' => 'deposit',
|
||
'amount' => $amount,
|
||
'balance_after' => $user->fresh()->bank_jjb,
|
||
]);
|
||
});
|
||
|
||
$fresh = $user->fresh();
|
||
|
||
return response()->json([
|
||
'status' => 'success',
|
||
'message' => "成功存入 {$amount} 枚金币!",
|
||
'jjb' => $fresh->jjb,
|
||
'bank_jjb' => $fresh->bank_jjb,
|
||
]);
|
||
}
|
||
|
||
/**
|
||
* 取款:从银行(bank_jjb)转回流通金币(jjb)
|
||
*
|
||
* 请求参数:amount(正整数)
|
||
*/
|
||
public function withdraw(Request $request): JsonResponse
|
||
{
|
||
$request->validate([
|
||
'amount' => 'required|integer|min:1|max:9999999',
|
||
]);
|
||
|
||
$amount = $request->integer('amount');
|
||
$user = Auth::user();
|
||
|
||
if (($user->bank_jjb ?? 0) < $amount) {
|
||
return response()->json([
|
||
'status' => 'error',
|
||
'message' => '银行余额不足!当前存款 '.($user->bank_jjb ?? 0)." 枚,无法取出 {$amount} 枚。",
|
||
]);
|
||
}
|
||
|
||
DB::transaction(function () use ($user, $amount): void {
|
||
$user->decrement('bank_jjb', $amount);
|
||
$user->increment('jjb', $amount);
|
||
|
||
BankLog::create([
|
||
'user_id' => $user->id,
|
||
'type' => 'withdraw',
|
||
'amount' => $amount,
|
||
'balance_after' => $user->fresh()->bank_jjb,
|
||
]);
|
||
});
|
||
|
||
$fresh = $user->fresh();
|
||
|
||
return response()->json([
|
||
'status' => 'success',
|
||
'message' => "成功取出 {$amount} 枚金币!",
|
||
'jjb' => $fresh->jjb,
|
||
'bank_jjb' => $fresh->bank_jjb,
|
||
]);
|
||
}
|
||
}
|