优化ai小班长
This commit is contained in:
@@ -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}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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', // 离房时间
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user