'datetime', ]; } /** * 关联领取记录。 * * @return HasMany */ public function claims(): HasMany { return $this->hasMany(RedPacketClaim::class, 'envelope_id'); } /** * 判断红包当前是否可以被领取。 * * 条件:状态为 active + 未过期 + 未领满。 */ public function isClaimable(): bool { return $this->status === 'active' && $this->expires_at->isFuture() && $this->claimed_count < $this->total_count; } /** * 剩余可领份数。 */ public function remainingCount(): int { return max(0, $this->total_count - $this->claimed_count); } /** * 剩余金额。 */ public function remainingAmount(): int { return max(0, $this->total_amount - $this->claimed_amount); } }