*/ protected $fillable = [ 'user_id', 'position_id', 'appointed_by_user_id', 'appointed_at', 'remark', 'revoked_at', 'revoked_by_user_id', 'is_active', ]; /** * 字段类型转换 */ public function casts(): array { return [ 'appointed_at' => 'datetime', 'revoked_at' => 'datetime', 'is_active' => 'boolean', ]; } /** * 在职用户 */ public function user(): BelongsTo { return $this->belongsTo(User::class); } /** * 所任职务 */ public function position(): BelongsTo { return $this->belongsTo(Position::class); } /** * 任命人 */ public function appointedBy(): BelongsTo { return $this->belongsTo(User::class, 'appointed_by_user_id'); } /** * 撤销人 */ public function revokedBy(): BelongsTo { return $this->belongsTo(User::class, 'revoked_by_user_id'); } /** * 该任职期间的登录记录 */ public function dutyLogs(): HasMany { return $this->hasMany(PositionDutyLog::class); } /** * 该任职期间的权限使用记录 */ public function authorityLogs(): HasMany { return $this->hasMany(PositionAuthorityLog::class); } /** * 查询范围:仅当前在职 */ public function scopeActive(Builder $query): Builder { return $query->where('is_active', true); } /** * 获取任职时长(天数);在职则计算至今 */ public function getDurationDaysAttribute(): int { $end = $this->revoked_at ?? now(); return (int) $this->appointed_at->diffInDays($end); } /** * 任职期间累计在线时长(秒) */ public function getTotalOnlineSecondsAttribute(): int { return (int) $this->dutyLogs()->sum('duration_seconds'); } /** * 任职期间累计发放金币总量 */ public function getTotalRewardedCoinsAttribute(): int { return (int) $this->authorityLogs() ->where('action_type', 'reward') ->sum('amount'); } }