$codes 邀请码列表 * @property-read \Illuminate\Database\Eloquent\Collection $orders 订单列表 * @property-read \Illuminate\Database\Eloquent\Collection $stat 统计信息 * @property-read \Illuminate\Database\Eloquent\Collection $tickets 工单列表 * @property-read \Illuminate\Database\Eloquent\Collection $trafficResetLogs 流量重置记录 * @property-read User|null $parent 父账户 * @property-read string $subscribe_url 订阅链接(动态生成) */ class User extends Authenticatable { use HasApiTokens; protected $table = 'v2_user'; protected $dateFormat = 'U'; protected $guarded = ['id']; protected $casts = [ 'created_at' => 'timestamp', 'updated_at' => 'timestamp', 'banned' => 'boolean', 'is_admin' => 'boolean', 'is_staff' => 'boolean', 'remind_expire' => 'boolean', 'remind_traffic' => 'boolean', 'commission_auto_check' => 'boolean', 'commission_rate' => 'float', 'next_reset_at' => 'timestamp', 'last_reset_at' => 'timestamp', ]; protected $hidden = ['password']; public const COMMISSION_TYPE_SYSTEM = 0; public const COMMISSION_TYPE_PERIOD = 1; public const COMMISSION_TYPE_ONETIME = 2; // 获取邀请人信息 public function invite_user(): BelongsTo { return $this->belongsTo(self::class, 'invite_user_id', 'id'); } /** * 获取用户订阅计划 * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function plan(): BelongsTo { return $this->belongsTo(Plan::class, 'plan_id', 'id'); } public function group(): BelongsTo { return $this->belongsTo(ServerGroup::class, 'group_id', 'id'); } // 获取用户邀请码列表 public function codes(): HasMany { return $this->hasMany(InviteCode::class, 'user_id', 'id'); } public function orders(): HasMany { return $this->hasMany(Order::class, 'user_id', 'id'); } public function stat(): HasMany { return $this->hasMany(StatUser::class, 'user_id', 'id'); } // 关联工单列表 public function tickets(): HasMany { return $this->hasMany(Ticket::class, 'user_id', 'id'); } public function parent(): BelongsTo { return $this->belongsTo(self::class, 'parent_id', 'id'); } /** * 关联流量重置记录 */ public function trafficResetLogs(): HasMany { return $this->hasMany(TrafficResetLog::class, 'user_id', 'id'); } /** * 检查用户是否处于活跃状态 */ public function isActive(): bool { return !$this->banned && ($this->expired_at === null || $this->expired_at > time()) && $this->plan_id !== null; } /** * 检查用户是否可用节点流量且充足 */ public function isAvailable(): bool { return $this->isActive() && $this->getRemainingTraffic() > 0; } /** * 检查是否需要重置流量 */ public function shouldResetTraffic(): bool { return $this->isActive() && $this->next_reset_at !== null && $this->next_reset_at <= time(); } /** * 获取总使用流量 */ public function getTotalUsedTraffic(): int { return ($this->u ?? 0) + ($this->d ?? 0); } /** * 获取剩余流量 */ public function getRemainingTraffic(): int { $used = $this->getTotalUsedTraffic(); $total = $this->transfer_enable ?? 0; return max(0, $total - $used); } /** * 获取流量使用百分比 */ public function getTrafficUsagePercentage(): float { $total = $this->transfer_enable ?? 0; if ($total <= 0) { return 0; } $used = $this->getTotalUsedTraffic(); return min(100, ($used / $total) * 100); } }