- 新增 BaccaratPoolUpdated 事件,用于通过 WebSocket 广播实时下注数据更新 - 增加数据库迁移以在 baccarat_rounds 表中添加对应的下注人数统计字段 - 更新 BaccaratRound 模型以及 BaccaratController,支持实时下注统计更新与 WebSocket 事件分发 - 更新前端 chat.js 以及 baccarat-panel.blade.php,利用 Alpine.js 和 Echo 接收事件并动态渲染 "大"、"小"、"豹子" 的实时下注计数
116 lines
3.2 KiB
PHP
116 lines
3.2 KiB
PHP
<?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',
|
||
'bet_count_big', 'bet_count_small', 'bet_count_triple',
|
||
];
|
||
|
||
/**
|
||
* 属性类型转换。
|
||
*/
|
||
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',
|
||
'bet_count_big' => 'integer',
|
||
'bet_count_small' => 'integer',
|
||
'bet_count_triple' => '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();
|
||
}
|
||
}
|