'integer', 'source_id' => 'integer', 'source_type' => UserLogSourceTypeCast::class, 'original_time' => 'datetime', 'collected_at' => 'datetime', 'created_at' => 'datetime', ]; /** * 关联用户模型 * * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function user() { return $this->belongsTo(\App\Module\User\Models\User::class, 'user_id', 'id'); } /** * 按用户ID查询日志 * * @param \Illuminate\Database\Eloquent\Builder $query * @param int $userId * @return \Illuminate\Database\Eloquent\Builder */ public function scopeByUser($query, int $userId) { return $query->where('user_id', $userId); } /** * 按来源类型查询日志 * * @param \Illuminate\Database\Eloquent\Builder $query * @param string $sourceType * @return \Illuminate\Database\Eloquent\Builder */ public function scopeBySourceType($query, string $sourceType) { return $query->where('source_type', $sourceType); } /** * 按时间范围查询日志 * * @param \Illuminate\Database\Eloquent\Builder $query * @param string $startTime * @param string $endTime * @return \Illuminate\Database\Eloquent\Builder */ public function scopeByTimeRange($query, string $startTime, string $endTime) { return $query->whereBetween('created_at', [$startTime, $endTime]); } /** * 最新日志优先(按原始时间排序) * * @param \Illuminate\Database\Eloquent\Builder $query * @return \Illuminate\Database\Eloquent\Builder */ public function scopeLatest($query) { return $query->orderBy('original_time', 'desc'); } /** * 按原始时间排序(升序) * * @param \Illuminate\Database\Eloquent\Builder $query * @return \Illuminate\Database\Eloquent\Builder */ public function scopeByOriginalTime($query) { return $query->orderBy('original_time', 'asc'); } /** * 按收集时间排序 * * @param \Illuminate\Database\Eloquent\Builder $query * @return \Illuminate\Database\Eloquent\Builder */ public function scopeByCollectedTime($query) { return $query->orderBy('collected_at', 'desc'); } /** * 按原始时间范围查询 * * @param \Illuminate\Database\Eloquent\Builder $query * @param string $startTime * @param string $endTime * @return \Illuminate\Database\Eloquent\Builder */ public function scopeByOriginalTimeRange($query, string $startTime, string $endTime) { return $query->whereBetween('original_time', [$startTime, $endTime]); } /** * 获取格式化的创建时间 * * @return string */ public function getFormattedCreatedAtAttribute(): string { return $this->created_at ? $this->created_at->format('Y-m-d H:i:s') : ''; } /** * 获取格式化的时间戳(使用原始时间) * * @return string */ public function getTimeAttribute(): string { return $this->original_time ? $this->original_time->format('m-d H:i') : ''; } /** * 获取格式化的原始时间 * * @return string */ public function getFormattedOriginalTimeAttribute(): string { return $this->original_time ? $this->original_time->format('Y-m-d H:i:s') : ''; } /** * 获取格式化的收集时间 * * @return string */ public function getFormattedCollectedAtAttribute(): string { return $this->collected_at ? $this->collected_at->format('Y-m-d H:i:s') : ''; } /** * 获取时间差(收集时间 - 原始时间) * * @return int 秒数 */ public function getCollectionDelayAttribute(): int { if (!$this->original_time || !$this->collected_at) { return 0; } return $this->collected_at->timestamp - $this->original_time->timestamp; } /** * 获取来源类型名称 * * @return string */ public function getSourceTypeNameAttribute(): string { if (!$this->source_type) { return '未知'; } if ($this->source_type instanceof REWARD_SOURCE_TYPE) { $info = REWARD_SOURCE_TYPE::getTypeInfo($this->source_type->value); return $info['name']; } // 兼容旧数据 if (is_string($this->source_type) && REWARD_SOURCE_TYPE::isValid($this->source_type)) { $info = REWARD_SOURCE_TYPE::getTypeInfo($this->source_type); return $info['name']; } return $this->source_type; } /** * 获取来源类型图标 * * @return string */ public function getSourceTypeIconAttribute(): string { if (!$this->source_type) { return '❓'; } if ($this->source_type instanceof REWARD_SOURCE_TYPE) { $info = REWARD_SOURCE_TYPE::getTypeInfo($this->source_type->value); return $info['icon']; } // 兼容旧数据 if (is_string($this->source_type) && REWARD_SOURCE_TYPE::isValid($this->source_type)) { $info = REWARD_SOURCE_TYPE::getTypeInfo($this->source_type); return $info['icon']; } return '❓'; } /** * 获取来源类型分类 * * @return string */ public function getSourceTypeCategoryAttribute(): string { if (!$this->source_type) { return 'unknown'; } if ($this->source_type instanceof REWARD_SOURCE_TYPE) { $info = REWARD_SOURCE_TYPE::getTypeInfo($this->source_type->value); return $info['category']; } // 兼容旧数据 if (is_string($this->source_type) && REWARD_SOURCE_TYPE::isValid($this->source_type)) { $info = REWARD_SOURCE_TYPE::getTypeInfo($this->source_type); return $info['category']; } return 'unknown'; } /** * 获取来源类型完整信息 * * @return array */ public function getSourceTypeInfoAttribute(): array { if (!$this->source_type) { return [ 'name' => '未知', 'description' => '未知来源类型', 'category' => 'unknown', 'icon' => '❓', 'priority' => 999 ]; } if ($this->source_type instanceof REWARD_SOURCE_TYPE) { return REWARD_SOURCE_TYPE::getTypeInfo($this->source_type->value); } // 兼容旧数据 if (is_string($this->source_type) && REWARD_SOURCE_TYPE::isValid($this->source_type)) { return REWARD_SOURCE_TYPE::getTypeInfo($this->source_type); } return [ 'name' => $this->source_type, 'description' => '未知来源类型', 'category' => 'unknown', 'icon' => '❓', 'priority' => 999 ]; } }