|
|
@@ -2,12 +2,16 @@
|
|
|
|
|
|
namespace App\Module\Farm\Logics;
|
|
|
|
|
|
+use App\Module\Farm\Dtos\HouseRankDto;
|
|
|
+use App\Module\Farm\Dtos\HouseRankItemDto;
|
|
|
use App\Module\Farm\Enums\UPGRADE_TYPE;
|
|
|
use App\Module\Farm\Events\HouseUpgradedEvent;
|
|
|
use App\Module\Farm\Models\FarmHouseConfig;
|
|
|
use App\Module\Farm\Models\FarmUpgradeLog;
|
|
|
use App\Module\Farm\Models\FarmUser;
|
|
|
+use App\Module\User\Models\User;
|
|
|
use Illuminate\Support\Facades\Cache;
|
|
|
+use Illuminate\Support\Facades\DB;
|
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
|
|
/**
|
|
|
@@ -252,6 +256,127 @@ class HouseLogic
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取房屋排行榜数据
|
|
|
+ *
|
|
|
+ * @param int $userId 当前用户ID
|
|
|
+ * @param int $page 页码
|
|
|
+ * @param int $pageSize 每页数量
|
|
|
+ * @return HouseRankDto
|
|
|
+ */
|
|
|
+ public function getHouseRankList(int $userId, int $page = 1, int $pageSize = 20): HouseRankDto
|
|
|
+ {
|
|
|
+ try {
|
|
|
+ // 计算偏移量
|
|
|
+ $offset = ($page - 1) * $pageSize;
|
|
|
+
|
|
|
+ // 查询排行榜数据,按房屋等级降序排列
|
|
|
+ $rankList = DB::table('farm_users as fu')
|
|
|
+ ->join('users as u', 'fu.user_id', '=', 'u.id')
|
|
|
+ ->select([
|
|
|
+ 'fu.user_id',
|
|
|
+ 'fu.house_level',
|
|
|
+ 'u.username as nickname', // 使用username作为昵称
|
|
|
+ 'fu.last_upgrade_time'
|
|
|
+ ])
|
|
|
+ ->orderBy('fu.house_level', 'desc')
|
|
|
+ ->orderBy('fu.last_upgrade_time', 'asc') // 同等级按升级时间排序
|
|
|
+ ->offset($offset)
|
|
|
+ ->limit($pageSize)
|
|
|
+ ->get()
|
|
|
+ ->toArray();
|
|
|
+
|
|
|
+ // 转换为DTO对象
|
|
|
+ $rankItems = [];
|
|
|
+ foreach ($rankList as $index => $item) {
|
|
|
+ $rank = $offset + $index + 1;
|
|
|
+ $rankItems[] = HouseRankItemDto::fromArray((array)$item, $rank);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查询用户自己的排名
|
|
|
+ $userRank = $this->getUserHouseRank($userId);
|
|
|
+
|
|
|
+ // 构建分页信息
|
|
|
+ $pageInfo = [
|
|
|
+ 'page' => $page,
|
|
|
+ 'per_page' => $pageSize,
|
|
|
+ 'total' => $this->getTotalHouseRankCount()
|
|
|
+ ];
|
|
|
+
|
|
|
+ return new HouseRankDto($rankItems, $userRank, 1, $pageInfo);
|
|
|
+
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ Log::error('获取房屋排行榜失败', [
|
|
|
+ 'user_id' => $userId,
|
|
|
+ 'page' => $page,
|
|
|
+ 'page_size' => $pageSize,
|
|
|
+ 'error' => $e->getMessage(),
|
|
|
+ 'trace' => $e->getTraceAsString()
|
|
|
+ ]);
|
|
|
+
|
|
|
+ return new HouseRankDto();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取用户的房屋排名
|
|
|
+ *
|
|
|
+ * @param int $userId 用户ID
|
|
|
+ * @return int 排名,0表示未上榜
|
|
|
+ */
|
|
|
+ private function getUserHouseRank(int $userId): int
|
|
|
+ {
|
|
|
+ try {
|
|
|
+ // 获取用户的房屋等级
|
|
|
+ $userFarm = FarmUser::where('user_id', $userId)->first();
|
|
|
+ if (!$userFarm) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ $userLevel = $userFarm->house_level;
|
|
|
+ $userUpgradeTime = $userFarm->last_upgrade_time;
|
|
|
+
|
|
|
+ // 计算排名:比用户等级高的用户数量 + 同等级但升级时间更早的用户数量 + 1
|
|
|
+ $rank = DB::table('farm_users as fu')
|
|
|
+ ->where(function ($query) use ($userLevel, $userUpgradeTime) {
|
|
|
+ $query->where('fu.house_level', '>', $userLevel)
|
|
|
+ ->orWhere(function ($subQuery) use ($userLevel, $userUpgradeTime) {
|
|
|
+ $subQuery->where('fu.house_level', '=', $userLevel)
|
|
|
+ ->where('fu.last_upgrade_time', '<', $userUpgradeTime);
|
|
|
+ });
|
|
|
+ })
|
|
|
+ ->count();
|
|
|
+
|
|
|
+ return $rank + 1;
|
|
|
+
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ Log::error('获取用户房屋排名失败', [
|
|
|
+ 'user_id' => $userId,
|
|
|
+ 'error' => $e->getMessage()
|
|
|
+ ]);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取房屋排行榜总数
|
|
|
+ *
|
|
|
+ * @return int
|
|
|
+ */
|
|
|
+ private function getTotalHouseRankCount(): int
|
|
|
+ {
|
|
|
+ try {
|
|
|
+ return FarmUser::count();
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ Log::error('获取房屋排行榜总数失败', [
|
|
|
+ 'error' => $e->getMessage()
|
|
|
+ ]);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 清除房屋配置缓存
|
|
|
*
|