feat: 增强奖池与钱包管理功能

更新 AdminJackpotPoolUpdateController 校验规则,禁止传入 current_amount。
优化 AdminRiskPoolManualStatusController:更新奖池状态后同步 Redis 状态。
在 TransferOrderReconcileController 中新增 completeCredit 方法,用于处理卡住的转账订单对账。
调整 TransferOrderListController:优化转账订单处理条件。
在 TicketItemsIndexController 中实现支持时区的日期筛选,提升日期处理准确性。
扩展 JackpotPool 模型,新增 adjustments 关联关系。
改进票据与钱包相关服务中的错误处理和事务管理。
This commit is contained in:
2026-05-26 14:58:41 +08:00
parent 48349e3302
commit c8c90e3e94
45 changed files with 1877 additions and 104 deletions

View File

@@ -39,8 +39,13 @@ final class TicketWalletService
$wallet = PlayerWallet::query()->whereKey($wallet->id)->lockForUpdate()->firstOrFail();
}
if ((int) $wallet->status !== 0) {
throw new TicketOperationException('wallet_frozen', ErrorCode::WalletExternalRejected->value);
}
$before = (int) $wallet->balance;
if ($before < $amountMinor) {
$available = $before - (int) $wallet->frozen_balance;
if ($available < $amountMinor) {
throw new TicketOperationException('bet_insufficient_balance', ErrorCode::BetInsufficientBalance->value);
}
@@ -62,7 +67,7 @@ final class TicketWalletService
'balance_after' => $after,
'status' => self::TXN_POSTED,
'external_ref_no' => null,
'idempotent_key' => $order->client_trace_id,
'idempotent_key' => 'bet_deduct:'.$order->order_no,
'remark' => null,
]);
@@ -191,6 +196,10 @@ final class TicketWalletService
}
$currency = strtoupper($currencyCode);
$idempotentKey = 'settle-payout:'.$settlementBatchId.':'.$player->id;
if (WalletTxn::query()->where('idempotent_key', $idempotentKey)->where('biz_type', 'settle_payout')->exists()) {
return;
}
$wallet = PlayerWallet::query()
->where('player_id', $player->id)
@@ -231,7 +240,7 @@ final class TicketWalletService
'balance_after' => $after,
'status' => self::TXN_POSTED,
'external_ref_no' => null,
'idempotent_key' => 'settle-payout:'.$settlementBatchId.':'.$player->id,
'idempotent_key' => $idempotentKey,
'remark' => null,
]);
}