*/ protected $fillable = [ 'user_id', 'user_position_id', 'login_at', 'logout_at', 'duration_seconds', 'ip_address', 'room_id', ]; /** * 字段类型转换 */ public function casts(): array { return [ 'login_at' => 'datetime', 'logout_at' => 'datetime', 'duration_seconds' => 'integer', ]; } /** * 对应的用户 */ public function user(): BelongsTo { return $this->belongsTo(User::class); } /** * 对应的在职记录 */ public function userPosition(): BelongsTo { return $this->belongsTo(UserPosition::class); } /** * 格式化在线时长为"Xh Ym"字符串(如 128h 30m) */ public function getFormattedDurationAttribute(): string { $seconds = $this->duration_seconds ?? 0; $hours = intdiv($seconds, 3600); $minutes = intdiv($seconds % 3600, 60); return "{$hours}h {$minutes}m"; } }