orderByDesc('upgrade_time') ->limit($limit) ->get(); } catch (\Exception $e) { Log::error('获取用户升级记录失败', [ 'user_id' => $userId, 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); return collect(); } } /** * 获取用户的房屋升级记录 * * @param int $userId * @param int $limit * @return Collection */ public function findHouseUpgradesByUserId(int $userId, int $limit = 100): Collection { try { return FarmUpgradeLog::where('user_id', $userId) ->where('upgrade_type', UPGRADE_TYPE::HOUSE->value) ->orderByDesc('upgrade_time') ->limit($limit) ->get(); } catch (\Exception $e) { Log::error('获取用户房屋升级记录失败', [ 'user_id' => $userId, 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); return collect(); } } /** * 获取用户的土地升级记录 * * @param int $userId * @param int $limit * @return Collection */ public function findLandUpgradesByUserId(int $userId, int $limit = 100): Collection { try { return FarmUpgradeLog::where('user_id', $userId) ->where('upgrade_type', UPGRADE_TYPE::LAND->value) ->orderByDesc('upgrade_time') ->limit($limit) ->get(); } catch (\Exception $e) { Log::error('获取用户土地升级记录失败', [ 'user_id' => $userId, 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); return collect(); } } /** * 获取指定时间段内的升级记录 * * @param string $startTime * @param string $endTime * @return Collection */ public function findByTimeRange(string $startTime, string $endTime): Collection { try { return FarmUpgradeLog::whereBetween('upgrade_time', [$startTime, $endTime]) ->orderByDesc('upgrade_time') ->get(); } catch (\Exception $e) { Log::error('获取时间段升级记录失败', [ 'start_time' => $startTime, 'end_time' => $endTime, 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); return collect(); } } /** * 清理过期的升级记录 * * @param int $days 保留天数 * @return int */ public function cleanupOldLogs(int $days = 90): int { try { $date = now()->subDays($days); return FarmUpgradeLog::where('upgrade_time', '<', $date)->delete(); } catch (\Exception $e) { Log::error('清理过期升级记录失败', [ 'days' => $days, 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); return 0; } } }