diff --git a/.gitignore b/.gitignore index f71d6d7..dfee2d2 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ /.agents /.codex /.hermes +/.reasonix /auth.json /node_modules /public/build diff --git a/app/Enums/CurrencySource.php b/app/Enums/CurrencySource.php index ab03f0d..a9219b2 100644 --- a/app/Enums/CurrencySource.php +++ b/app/Enums/CurrencySource.php @@ -164,6 +164,12 @@ enum CurrencySource: string /** 猜谜活动奖励 */ case GAME_REWARD = 'game_reward'; + /** 存入银行(jjb → bank_jjb) */ + case BANK_DEPOSIT = 'bank_deposit'; + + /** 从银行取款(bank_jjb → jjb) */ + case BANK_WITHDRAW = 'bank_withdraw'; + /** * 返回该来源的中文名称,用于后台统计展示。 */ @@ -218,6 +224,8 @@ enum CurrencySource: string self::MSG_DECORATION_BUY => '消息装扮购买(旧)', self::AVATAR_FRAME_BUY => '头像框购买', self::GAME_REWARD => '猜谜活动奖励', + self::BANK_DEPOSIT => '存入银行', + self::BANK_WITHDRAW => '银行取款', }; } } diff --git a/app/Http/Controllers/BankController.php b/app/Http/Controllers/BankController.php index 7580423..21e497c 100644 --- a/app/Http/Controllers/BankController.php +++ b/app/Http/Controllers/BankController.php @@ -13,9 +13,12 @@ namespace App\Http\Controllers; +use App\Enums\CurrencySource; use App\Models\BankLog; use App\Models\Sysparam; use App\Models\User; +use App\Models\UserCurrencyLog; +use App\Services\UserCurrencyService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; @@ -26,6 +29,9 @@ use Illuminate\Support\Facades\DB; */ class BankController extends Controller { + public function __construct( + private readonly UserCurrencyService $currencyService, + ) {} /** * 查询银行余额及最近20条流水记录 */ @@ -107,7 +113,8 @@ class BankController extends Controller } DB::transaction(function () use ($user, $amount): void { - $user->decrement('jjb', $amount); + $this->currencyService->change($user, 'gold', -$amount, CurrencySource::BANK_DEPOSIT, "存入银行 {$amount} 金币"); + $user->increment('bank_jjb', $amount); BankLog::create([ @@ -151,7 +158,8 @@ class BankController extends Controller DB::transaction(function () use ($user, $amount): void { $user->decrement('bank_jjb', $amount); - $user->increment('jjb', $amount); + + $this->currencyService->change($user, 'gold', $amount, CurrencySource::BANK_WITHDRAW, "取出银行存款 {$amount} 金币"); BankLog::create([ 'user_id' => $user->id, diff --git a/app/Services/AiFinanceService.php b/app/Services/AiFinanceService.php index e05a9c4..b830384 100644 --- a/app/Services/AiFinanceService.php +++ b/app/Services/AiFinanceService.php @@ -10,10 +10,13 @@ namespace App\Services; +use App\Enums\CurrencySource; use App\Events\MessageSent; use App\Jobs\SaveMessageJob; use App\Models\BankLog; use App\Models\User; +use App\Models\UserCurrencyLog; +use App\Services\UserCurrencyService; use Illuminate\Support\Facades\DB; /** @@ -41,6 +44,7 @@ class AiFinanceService */ public function __construct( private readonly ChatStateService $chatState, + private readonly UserCurrencyService $currencyService, ) {} /** @@ -107,15 +111,15 @@ class AiFinanceService $depositAmount = $walletGold - self::AVAILABLE_GOLD_RESERVE; // 只把超过 100 万的部分转入银行,手上保留不高于 100 万的常规活动资金。 - $lockedUser->jjb = self::AVAILABLE_GOLD_RESERVE; - $lockedUser->bank_jjb = $bankBefore + $depositAmount; - $lockedUser->save(); + $this->currencyService->change($lockedUser, 'gold', -$depositAmount, CurrencySource::BANK_DEPOSIT, "自动存入银行 {$depositAmount} 金币"); + + $lockedUser->increment('bank_jjb', $depositAmount); BankLog::create([ 'user_id' => $lockedUser->id, 'type' => 'deposit', 'amount' => $depositAmount, - 'balance_after' => (int) $lockedUser->bank_jjb, + 'balance_after' => (int) $lockedUser->fresh()->bank_jjb, ]); return array_values(array_filter( @@ -162,15 +166,15 @@ class AiFinanceService } // 优先把银行金币提回手上,保证 AI 的即时可用余额尽量回到目标线。 - $lockedUser->jjb = $walletGold + $withdrawAmount; - $lockedUser->bank_jjb = $bankGold - $withdrawAmount; - $lockedUser->save(); + $this->currencyService->change($lockedUser, 'gold', $withdrawAmount, CurrencySource::BANK_WITHDRAW, "从银行自动取款 {$withdrawAmount} 金币"); + + $lockedUser->decrement('bank_jjb', $withdrawAmount); BankLog::create([ 'user_id' => $lockedUser->id, 'type' => 'withdraw', 'amount' => $withdrawAmount, - 'balance_after' => (int) $lockedUser->bank_jjb, + 'balance_after' => (int) $lockedUser->fresh()->bank_jjb, ]); return (int) $lockedUser->jjb >= $targetWalletGold;