diff --git a/app/Jobs/AiBaccaratBetJob.php b/app/Jobs/AiBaccaratBetJob.php index f874186..8a5a0c6 100644 --- a/app/Jobs/AiBaccaratBetJob.php +++ b/app/Jobs/AiBaccaratBetJob.php @@ -5,7 +5,7 @@ * * 在每局百家乐开启时延迟调度执行: * 1. 检查是否存在连输休息惩罚(1小时) - * 2. 检查可用金币,确保留存底金 + * 2. 检查可用金币与活动时间窗,确定本局下注额度 * 3. 调用 AI 接口预测路单走势决定下注方向(AI 不可用时回退本地决策) * 4. 提交下注 * @@ -87,10 +87,10 @@ class AiBaccaratBetJob implements ShouldQueue // 5. 查询当前是否命中“你玩游戏我买单”活动窗口。 $lossCoverService = app(BaccaratLossCoverService::class); $lossCoverEvent = $lossCoverService->findEventForBetTime(now()); - $hasActiveLossCover = $lossCoverEvent?->status === 'active'; + $isInLossCoverWindow = $lossCoverEvent !== null; - // 买单活动进行中时允许 AI 全仓下注;平时只动用当前手上的 jjb,不再强制保留 100 万。 - $bettableGold = $hasActiveLossCover + // 买单活动进行中时允许 AI 统筹“手上 + 银行”总资产;平时只动用当前手上的 jjb。 + $bettableGold = $isInLossCoverWindow ? $aiFinance->getTotalGoldAssets($user) : $aiFinance->getSpendableGold($user); if ($bettableGold < $minBet) { @@ -129,7 +129,7 @@ class AiBaccaratBetJob implements ShouldQueue 'recent_results' => $recentResults, 'available_gold' => $bettableGold, 'historical_bets' => $historicalBets, - 'loss_cover_active' => $hasActiveLossCover, + 'loss_cover_active' => $isInLossCoverWindow, ]; $aiPrediction = $predictionService->predict($context); @@ -145,10 +145,10 @@ class AiBaccaratBetJob implements ShouldQueue $reason = $aiPrediction['reason']; if ($betType !== 'pass') { - if ($hasActiveLossCover) { - // 买单活动进行中时,AI 可放心动用全部总资产,因为本局若输可返还。 - $amount = $bettableGold; - $reason = trim($reason.' 买单活动进行中,本局采用总资产全额下注策略。'); + if ($isInLossCoverWindow) { + // 买单活动进行中且金币足够时,直接按百家乐单局最高限额下注。 + $amount = min($bettableGold, $maxBet); + $reason = trim($reason.' 买单活动进行中,本局按百家乐最高限额下注。'); } else { // 非买单活动期间,限定单局最高下注不超过手头金币的 5% 以防止 AI 破产。 $percent = min(5, max(0, $percent)); @@ -177,10 +177,10 @@ class AiBaccaratBetJob implements ShouldQueue } if ($betType !== 'pass') { - if ($hasActiveLossCover) { - // 本地兜底策略命中买单活动时,同样执行总资产全额下注。 - $amount = $bettableGold; - $reason = '买单活动进行中,采用本地总资产全额下注兜底策略。'; + if ($isInLossCoverWindow) { + // 本地兜底策略命中买单活动时,同样优先按百家乐最高限额下注。 + $amount = min($bettableGold, $maxBet); + $reason = '买单活动进行中,采用本地最高限额下注兜底策略。'; } else { $percent = rand(2, 5) / 100.0; $amount = (int) round($bettableGold * $percent); @@ -207,8 +207,8 @@ class AiBaccaratBetJob implements ShouldQueue return; } - // 买单活动期间允许全仓下注;非活动期间只检查当前手上金币是否够本次下注。 - $isReadyToSpend = $hasActiveLossCover + // 买单活动期间允许为本次高额下注从银行调拨;非活动期间只检查当前手上金币是否够本次下注。 + $isReadyToSpend = $isInLossCoverWindow ? $aiFinance->prepareAllInSpend($user, $amount) : $aiFinance->prepareSpend($user, $amount); if (! $isReadyToSpend) { diff --git a/app/Services/AiFinanceService.php b/app/Services/AiFinanceService.php index 99f46ba..e05a9c4 100644 --- a/app/Services/AiFinanceService.php +++ b/app/Services/AiFinanceService.php @@ -5,7 +5,7 @@ * * 统一维护 AI小班长的银行存取与阶段性理财里程碑公告, * 常规场景下仅在手上金币超过 100 万时自动存银行, - * 特殊场景(如买单活动全仓下注)才会动用银行资产。 + * 特殊场景(如买单活动的大额下注)才会动用银行资产。 */ namespace App\Services; @@ -17,7 +17,7 @@ use App\Models\User; use Illuminate\Support\Facades\DB; /** - * 负责 AI小班长的常规存款、全仓取款与里程碑播报。 + * 负责 AI小班长的常规存款、大额调款与里程碑播报。 */ class AiFinanceService { @@ -74,9 +74,9 @@ class AiFinanceService } /** - * 为全仓支出准备手头金币。 + * 为大额支出准备手头金币。 * - * 该模式不会保留手上余额阈值,适用于买单活动等可接受全额下注的场景。 + * 该模式不会保留手上余额阈值,适用于买单活动等需要临时调拨银行金币的场景。 */ public function prepareAllInSpend(User $user, int $spendAmount): bool { diff --git a/app/Services/BaccaratLossCoverService.php b/app/Services/BaccaratLossCoverService.php index 93301ed..3c8d5e0 100644 --- a/app/Services/BaccaratLossCoverService.php +++ b/app/Services/BaccaratLossCoverService.php @@ -105,13 +105,17 @@ class BaccaratLossCoverService /** * 获取某个下注时间点命中的活动。 + * + * 这里按管理员设定的开始/结束时间窗口判断, + * 不强依赖后台状态已经及时切到 active, + * 这样刚到开始时间的活动也能立即参与买单判定。 */ public function findEventForBetTime(?Carbon $betTime = null): ?BaccaratLossCoverEvent { $betTime = $betTime ?? now(); return BaccaratLossCoverEvent::query() - ->whereIn('status', ['active', 'settlement_pending', 'claimable']) + ->whereNotIn('status', ['cancelled', 'completed']) ->where('starts_at', '<=', $betTime) ->where('ends_at', '>=', $betTime) ->orderByDesc('id') diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index eafc76f..42faf6d 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -106,10 +106,6 @@ class="text-purple-300 hover:text-purple-100 font-bold flex items-center transition hidden sm:flex {{ request()->routeIs('duty-hall.*') ? 'text-purple-100 underline underline-offset-4' : '' }}"> 勤务台 -