优化ai小班长

This commit is contained in:
2026-04-12 18:50:41 +08:00
parent d6f14868fd
commit 61541bfe4c
2 changed files with 104 additions and 19 deletions

View File

@@ -50,33 +50,39 @@ class AiBaccaratBetJob implements ShouldQueue
return;
}
$round = $this->round->fresh();
if (! $round || ! $round->isBettingOpen()) {
return;
}
$user = User::where('username', 'AI小班长')->first();
if (! $user) {
return;
}
// 2. 检查连输惩罚超时
$chatState = app(ChatStateService::class);
// 2. 资金管理:自动存款与领取补偿
$this->manageFinances($user, $chatState);
$round = $this->round->fresh();
if (! $round || ! $round->isBettingOpen()) {
return;
}
// 3. 检查连输惩罚超时
if (Redis::exists('ai_baccarat_timeout')) {
return; // 还在禁赛期
}
// 3. 检查余额与限额
// 4. 检查余额与限额
$config = GameConfig::forGame('baccarat')?->params ?? [];
$minBet = (int) ($config['min_bet'] ?? 100);
$maxBet = (int) ($config['max_bet'] ?? 50000);
// 至少保留 2000 金币底仓
$availableGold = ($user->jjb ?? 0) - 2000;
// 至少保留 5000 金币底仓(随着目标提升,底仓也适当调高)
$reserve = ($user->bank_jjb >= 10000000) ? 20000 : 5000;
$availableGold = ($user->jjb ?? 0) - $reserve;
if ($availableGold < $minBet) {
return; // 资金不足以支撑最小下注
}
// 4. 获取近期路单和 AI 历史下注
// 5. 获取近期路单和 AI 历史下注
$recentResults = BaccaratRound::query()
->where('status', 'settled')
->orderByDesc('id')
@@ -282,14 +288,11 @@ class AiBaccaratBetJob implements ShouldQueue
string $decisionSource,
): void {
$chatState = app(ChatStateService::class);
$labelMap = ['big' => '大', 'small' => '小', 'triple' => '豹子'];
$betLabel = $labelMap[$betType] ?? $betType;
$sourceTag = $decisionSource === 'ai' ? '🤖 AI分析' : '📊路单统计';
$formattedAmount = number_format($amount);
$label = $labelMap[$betType] ?? $betType;
// 格式:🌟 🎲 【百家乐】 娜姐 押注了 119 金币(大)!✨ [🤖 AI分析]
$content = "🌟 🎲 【百家乐】 <b>{$user->username}</b> 押注了 <b>{$formattedAmount}</b> 金币({$betLabel})!✨ [{$sourceTag}]";
$sourceText = $decisionSource === 'ai' ? '🤖 经过深度算法预测,本局我看好:' : '📊 观察了下最近的路单,这把我觉得是:';
$content = "🌟 🎲 【百家乐】 <b>{$user->username}</b> 已下注:<span style='color:#1d4ed8;font-weight:bold;'>{$label}</span> (".number_format($amount)." 金币)<br/><span style='color:#666;'>{$sourceText} {$label}</span>";
$msg = [
'id' => $chatState->nextMessageId($roomId),
@@ -298,13 +301,91 @@ class AiBaccaratBetJob implements ShouldQueue
'to_user' => '大家',
'content' => $content,
'is_secret' => false,
'font_color' => '#d97706',
'action' => '',
'font_color' => '#8b5cf6',
'action' => '动态播报',
'sent_at' => now()->toDateTimeString(),
];
$chatState->pushMessage($roomId, $msg);
broadcast(new MessageSent($roomId, $msg));
SaveMessageJob::dispatch($msg);
}
/**
* AI 资金管理逻辑:自动存款、领取买单补偿
*/
private function manageFinances(User $user, ChatStateService $chatState): void
{
// 1. 检查是否有“买单”活动补偿可领取 (jjb 较低时优先领取)
if ($user->jjb < 20000) {
$lossCoverService = app(\App\Services\BaccaratLossCoverService::class);
$pendingEvents = \App\Models\BaccaratLossCoverEvent::where('status', 'claimable')->get();
foreach ($pendingEvents as $event) {
$record = \App\Models\BaccaratLossCoverRecord::where('event_id', $event->id)
->where('user_id', $user->id)
->where('claim_status', 'pending')
->first();
if ($record && $record->compensation_amount > 0) {
$lossCoverService->claim($event, $user);
Log::channel('daily')->info("AI小班长自动领取活动补偿: Event #{$event->id}, Amount: {$record->compensation_amount}");
}
}
}
// 2. 自动存款逻辑:长期目标 1000万 / 3000万
$bankTarget1 = 10000000;
$bankTarget2 = 30000000;
$currentBank = (int) $user->bank_jjb;
// 如果手上金币超过 10万且存款未达 3000万则进行存款
if ($user->jjb > 100000 && $currentBank < $bankTarget2) {
$depositAmount = $user->jjb - 50000; // 留 5万在手上作为本金
// 如果存款快到目标了,按需存入
if ($currentBank < $bankTarget1 && ($currentBank + $depositAmount) > $bankTarget1) {
$depositAmount = $bankTarget1 - $currentBank;
}
DB::transaction(function () use ($user, $depositAmount, $currentBank, $bankTarget1, $bankTarget2, $chatState) {
$user->decrement('jjb', $depositAmount);
$user->increment('bank_jjb', $depositAmount);
$newBank = $user->bank_jjb;
\App\Models\BankLog::create([
'user_id' => $user->id,
'type' => 'deposit',
'amount' => $depositAmount,
'balance_after' => $newBank,
]);
// 达成阶段性目标时大声宣布
$milestone = 0;
if ($currentBank < $bankTarget1 && $newBank >= $bankTarget1) {
$milestone = 1000; // 1000万
} elseif ($currentBank < $bankTarget2 && $newBank >= $bankTarget2) {
$milestone = 3000; // 3000万
}
if ($milestone > 0) {
$content = "🏆 🎉 <b>【全站公告】</b> 恭喜 <b>AI小班长</b> 达成理财新高度!<br/>他在银行的存款已成功突破 <span style='color:#e11d48;font-weight:bold;'>{$milestone}万</span> 金币!💰✨";
$msg = [
'id' => $chatState->nextMessageId(1),
'room_id' => 1,
'from_user' => '系统传音',
'to_user' => '大家',
'content' => $content,
'is_secret' => false,
'font_color' => '#f59e0b',
'action' => '大声宣告',
'sent_at' => now()->toDateTimeString(),
];
$chatState->pushMessage(1, $msg);
broadcast(new MessageSent(1, $msg));
SaveMessageJob::dispatch($msg);
}
});
Log::channel('daily')->info("AI小班长自动存款: Amount: {$depositAmount}, New Bank Balance: {$user->bank_jjb}");
}
}
}

View File

@@ -61,6 +61,10 @@ class User extends Authenticatable
'question',
'answer',
'has_received_new_gift',
'jjb',
'bank_jjb',
'meili',
'exp_num',
'in_time', // 进房时间(用于勤务日志 login_at 基准)
'out_time', // 离房时间
];