'integer', 'owner_id' => 'integer', 'land_id' => 'integer', 'crop_id' => 'integer', 'item_id' => 'integer', 'item_amount' => 'integer', 'original_amount' => 'integer', 'steal_ratio' => 'decimal:4', 'steal_time' => 'datetime', 'steal_status' => 'integer', 'created_at' => 'datetime', 'updated_at' => 'datetime', ]; /** * 日期字段 */ protected $dates = [ 'steal_time', 'created_at', 'updated_at', ]; /** * 获取偷菜者用户信息 */ public function stealer(): BelongsTo { return $this->belongsTo(\App\Module\User\Models\User::class, 'stealer_id'); } /** * 获取农场主用户信息 */ public function owner(): BelongsTo { return $this->belongsTo(\App\Module\User\Models\User::class, 'owner_id'); } /** * 获取土地信息 */ public function land(): BelongsTo { return $this->belongsTo(\App\Module\Farm\Models\FarmLandUser::class, 'land_id'); } /** * 获取作物信息 */ public function crop(): BelongsTo { return $this->belongsTo(\App\Module\Farm\Models\FarmCropUser::class, 'crop_id'); } /** * 获取物品信息 */ public function item(): BelongsTo { return $this->belongsTo(\App\Module\GameItems\Models\ItemConfig::class, 'item_id'); } /** * 获取偷菜状态枚举 */ public function getStealStatusEnum(): STEAL_STATUS { return STEAL_STATUS::from($this->steal_status); } /** * 获取偷菜状态描述 */ public function getStealStatusDescAttribute(): string { return $this->getStealStatusEnum()->getDescription(); } /** * 获取偷菜状态颜色 */ public function getStealStatusColorAttribute(): string { return $this->getStealStatusEnum()->getColor(); } /** * 是否偷菜成功 */ public function isSuccess(): bool { return $this->getStealStatusEnum()->isSuccess(); } /** * 是否偷菜失败 */ public function isFailed(): bool { return $this->getStealStatusEnum()->isFailed(); } /** * 获取偷菜收益率 */ public function getYieldRateAttribute(): float { if ($this->original_amount <= 0) { return 0; } return round($this->item_amount / $this->original_amount, 4); } /** * 获取格式化的偷菜时间 */ public function getFormattedStealTimeAttribute(): string { return $this->steal_time->format('Y-m-d H:i:s'); } /** * 获取偷菜时间距离现在的描述 */ public function getStealTimeHumanAttribute(): string { return $this->steal_time->diffForHumans(); } /** * 作用域:按偷菜者查询 */ public function scopeByStealer($query, int $stealerId) { return $query->where('stealer_id', $stealerId); } /** * 作用域:按农场主查询 */ public function scopeByOwner($query, int $ownerId) { return $query->where('owner_id', $ownerId); } /** * 作用域:按偷菜状态查询 */ public function scopeByStatus($query, int $status) { return $query->where('steal_status', $status); } /** * 作用域:成功的偷菜记录 */ public function scopeSuccessful($query) { return $query->where('steal_status', STEAL_STATUS::SUCCESS->value); } /** * 作用域:失败的偷菜记录 */ public function scopeFailed($query) { return $query->where('steal_status', '!=', STEAL_STATUS::SUCCESS->value); } /** * 作用域:按时间范围查询 */ public function scopeByTimeRange($query, string $startTime, string $endTime) { return $query->whereBetween('steal_time', [$startTime, $endTime]); } /** * 作用域:今日记录 */ public function scopeToday($query) { return $query->whereDate('steal_time', today()); } /** * 作用域:本周记录 */ public function scopeThisWeek($query) { return $query->whereBetween('steal_time', [ now()->startOfWeek(), now()->endOfWeek() ]); } /** * 作用域:本月记录 */ public function scopeThisMonth($query) { return $query->whereMonth('steal_time', now()->month) ->whereYear('steal_time', now()->year); } /** * 获取用户今日偷菜次数 */ public static function getTodayStealCount(int $stealerId): int { return static::byStealer($stealerId) ->today() ->count(); } /** * 获取用户今日被偷次数 */ public static function getTodayStolenCount(int $ownerId): int { return static::byOwner($ownerId) ->today() ->successful() ->count(); } /** * 获取用户偷菜统计 */ public static function getStealStats(int $userId, string $date = null): array { $date = $date ?: today()->toDateString(); $stealCount = static::byStealer($userId) ->whereDate('steal_time', $date) ->successful() ->count(); $stolenCount = static::byOwner($userId) ->whereDate('steal_time', $date) ->successful() ->count(); $itemsGained = static::byStealer($userId) ->whereDate('steal_time', $date) ->successful() ->sum('item_amount'); $itemsLost = static::byOwner($userId) ->whereDate('steal_time', $date) ->successful() ->sum('item_amount'); return [ 'steal_count' => $stealCount, 'stolen_count' => $stolenCount, 'items_gained' => $itemsGained, 'items_lost' => $itemsLost, ]; } }