优化ai小班长
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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')
|
||||
|
||||
Reference in New Issue
Block a user