*/ use HasFactory; /** * 允许批量赋值的字段。 * * @var list */ protected $fillable = [ 'title', 'description', 'status', 'starts_at', 'ends_at', 'claim_deadline_at', 'created_by_user_id', 'closed_by_user_id', 'started_notice_sent_at', 'ended_notice_sent_at', 'participant_count', 'compensable_user_count', 'total_loss_amount', 'total_claimed_amount', ]; /** * 字段类型转换。 */ protected function casts(): array { return [ 'starts_at' => 'datetime', 'ends_at' => 'datetime', 'claim_deadline_at' => 'datetime', 'started_notice_sent_at' => 'datetime', 'ended_notice_sent_at' => 'datetime', 'participant_count' => 'integer', 'compensable_user_count' => 'integer', 'total_loss_amount' => 'integer', 'total_claimed_amount' => 'integer', ]; } /** * 关联:开启活动的用户。 */ public function creator(): BelongsTo { return $this->belongsTo(User::class, 'created_by_user_id'); } /** * 关联:结束活动的用户。 */ public function closer(): BelongsTo { return $this->belongsTo(User::class, 'closed_by_user_id'); } /** * 关联:活动下的用户聚合记录。 */ public function records(): HasMany { return $this->hasMany(BaccaratLossCoverRecord::class, 'event_id'); } /** * 关联:活动下的百家乐下注记录。 */ public function bets(): HasMany { return $this->hasMany(BaccaratBet::class, 'loss_cover_event_id'); } /** * 判断活动当前是否允许领取补偿。 */ public function isClaimable(): bool { return $this->status === 'claimable' && $this->claim_deadline_at !== null && $this->claim_deadline_at->isFuture(); } /** * 返回活动状态中文标签。 */ public function statusLabel(): string { return match ($this->status) { 'scheduled' => '未开始', 'active' => '进行中', 'settlement_pending' => '等待结算', 'claimable' => '可领取', 'completed' => '已结束', 'cancelled' => '已取消', default => '未知状态', }; } }