新增百家乐游戏:①数据库表+模型 ②OpenBaccaratRoundJob开局(广播+公屏) ③CloseBaccaratRoundJob结算(摇骰+赔付+CAS防并发) ④BaccaratController下注接口 ⑤前端弹窗(倒计时/骰子动画/历史趋势) ⑥调度器每分钟检查开局 ⑦GameConfig管控开关
This commit is contained in:
@@ -0,0 +1,111 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* 文件功能:百家乐局次模型
|
||||
*
|
||||
* 代表一局百家乐游戏,包含骰子结果、局次状态、下注汇总等信息。
|
||||
* 提供局次判断和赔率计算的辅助方法。
|
||||
*
|
||||
* @author ChatRoom Laravel
|
||||
*
|
||||
* @version 1.0.0
|
||||
*/
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
|
||||
class BaccaratRound extends Model
|
||||
{
|
||||
protected $fillable = [
|
||||
'dice1', 'dice2', 'dice3',
|
||||
'total_points', 'result', 'status',
|
||||
'bet_opens_at', 'bet_closes_at', 'settled_at',
|
||||
'total_bet_big', 'total_bet_small', 'total_bet_triple',
|
||||
'total_payout', 'bet_count',
|
||||
];
|
||||
|
||||
/**
|
||||
* 属性类型转换。
|
||||
*/
|
||||
protected function casts(): array
|
||||
{
|
||||
return [
|
||||
'bet_opens_at' => 'datetime',
|
||||
'bet_closes_at' => 'datetime',
|
||||
'settled_at' => 'datetime',
|
||||
'dice1' => 'integer',
|
||||
'dice2' => 'integer',
|
||||
'dice3' => 'integer',
|
||||
'total_points' => 'integer',
|
||||
'total_bet_big' => 'integer',
|
||||
'total_bet_small' => 'integer',
|
||||
'total_bet_triple' => 'integer',
|
||||
'total_payout' => 'integer',
|
||||
'bet_count' => 'integer',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 该局的所有下注记录。
|
||||
*/
|
||||
public function bets(): HasMany
|
||||
{
|
||||
return $this->hasMany(BaccaratBet::class, 'round_id');
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断当前是否在押注时间窗口内。
|
||||
*/
|
||||
public function isBettingOpen(): bool
|
||||
{
|
||||
return $this->status === 'betting'
|
||||
&& now()->between($this->bet_opens_at, $this->bet_closes_at);
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算指定押注类型和金额的预计回报(含本金)。
|
||||
*
|
||||
* @param string $betType 'big' | 'small' | 'triple'
|
||||
* @param int $amount 押注金额
|
||||
* @param array $config 游戏配置参数
|
||||
*/
|
||||
public static function calcPayout(string $betType, int $amount, array $config): int
|
||||
{
|
||||
$payout = match ($betType) {
|
||||
'triple' => $amount * ($config['payout_triple'] + 1),
|
||||
'big' => $amount * ($config['payout_big'] + 1),
|
||||
'small' => $amount * ($config['payout_small'] + 1),
|
||||
default => 0,
|
||||
};
|
||||
|
||||
return (int) $payout;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取结果中文名称。
|
||||
*/
|
||||
public function resultLabel(): string
|
||||
{
|
||||
return match ($this->result) {
|
||||
'big' => '大',
|
||||
'small' => '小',
|
||||
'triple' => "豹子({$this->dice1}{$this->dice1}{$this->dice1})",
|
||||
'kill' => '庄家收割',
|
||||
default => '未知',
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询当前正在进行的局次(状态为 betting 且未截止)。
|
||||
*/
|
||||
public static function currentRound(): ?static
|
||||
{
|
||||
return static::query()
|
||||
->where('status', 'betting')
|
||||
->where('bet_closes_at', '>', now())
|
||||
->latest()
|
||||
->first();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user