Files
chatroom/app/Models/BaccaratRound.php
lkddi 8fcccf72a5 feat(baccarat): 实现百家乐实时下注人数统计功能
- 新增 BaccaratPoolUpdated 事件,用于通过 WebSocket 广播实时下注数据更新
- 增加数据库迁移以在 baccarat_rounds 表中添加对应的下注人数统计字段
- 更新 BaccaratRound 模型以及 BaccaratController,支持实时下注统计更新与 WebSocket 事件分发
- 更新前端 chat.js 以及 baccarat-panel.blade.php,利用 Alpine.js 和 Echo 接收事件并动态渲染 "大"、"小"、"豹子" 的实时下注计数
2026-03-28 17:02:10 +08:00

116 lines
3.2 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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();
}
}