|
|
@@ -21,6 +21,7 @@ use Illuminate\Support\Facades\Log;
|
|
|
*/
|
|
|
class HouseLogic
|
|
|
{
|
|
|
+
|
|
|
/**
|
|
|
* 缓存键前缀
|
|
|
*
|
|
|
@@ -45,7 +46,7 @@ class HouseLogic
|
|
|
{
|
|
|
try {
|
|
|
// 尝试从缓存获取
|
|
|
- $cacheKey = $this->cachePrefix . 'config:' . $level;
|
|
|
+ $cacheKey = $this->cachePrefix . 'config:' . $level;
|
|
|
$cachedConfig = Cache::get($cacheKey);
|
|
|
|
|
|
if ($cachedConfig) {
|
|
|
@@ -83,7 +84,7 @@ class HouseLogic
|
|
|
{
|
|
|
try {
|
|
|
// 尝试从缓存获取
|
|
|
- $cacheKey = $this->cachePrefix . 'configs:all';
|
|
|
+ $cacheKey = $this->cachePrefix . 'configs:all';
|
|
|
$cachedConfigs = Cache::get($cacheKey);
|
|
|
|
|
|
if ($cachedConfigs) {
|
|
|
@@ -96,12 +97,12 @@ class HouseLogic
|
|
|
$result = [];
|
|
|
foreach ($configs as $config) {
|
|
|
$result[$config->level] = [
|
|
|
- 'level' => $config->level,
|
|
|
- 'output_bonus' => $config->output_bonus,
|
|
|
+ 'level' => $config->level,
|
|
|
+ 'output_bonus' => $config->output_bonus,
|
|
|
'special_land_limit' => $config->special_land_limit,
|
|
|
- 'upgrade_materials' => $config->upgrade_materials,
|
|
|
- 'downgrade_days' => $config->downgrade_days,
|
|
|
- 'available_lands' => $config->available_lands,
|
|
|
+ 'upgrade_materials' => $config->upgrade_materials,
|
|
|
+ 'downgrade_days' => $config->downgrade_days,
|
|
|
+ 'available_lands' => $config->available_lands,
|
|
|
];
|
|
|
}
|
|
|
|
|
|
@@ -129,7 +130,7 @@ class HouseLogic
|
|
|
{
|
|
|
try {
|
|
|
// 尝试从缓存获取
|
|
|
- $cacheKey = $this->cachePrefix . 'config:' . ($currentLevel + 1);
|
|
|
+ $cacheKey = $this->cachePrefix . 'config:' . ($currentLevel + 1);
|
|
|
$cachedConfig = Cache::get($cacheKey);
|
|
|
|
|
|
if ($cachedConfig) {
|
|
|
@@ -150,8 +151,8 @@ class HouseLogic
|
|
|
} catch (\Exception $e) {
|
|
|
Log::error('获取下一级房屋配置失败', [
|
|
|
'current_level' => $currentLevel,
|
|
|
- 'error' => $e->getMessage(),
|
|
|
- 'trace' => $e->getTraceAsString()
|
|
|
+ 'error' => $e->getMessage(),
|
|
|
+ 'trace' => $e->getTraceAsString()
|
|
|
]);
|
|
|
|
|
|
return null;
|
|
|
@@ -192,29 +193,29 @@ class HouseLogic
|
|
|
$oldLevel = $farmUser->house_level;
|
|
|
$newLevel = $oldLevel + 1;
|
|
|
|
|
|
- $farmUser->house_level = $newLevel;
|
|
|
+ $farmUser->house_level = $newLevel;
|
|
|
$farmUser->last_upgrade_time = now();
|
|
|
$farmUser->save();
|
|
|
|
|
|
// 创建升级记录
|
|
|
- $upgradeLog = new FarmUpgradeLog();
|
|
|
- $upgradeLog->user_id = $userId;
|
|
|
- $upgradeLog->upgrade_type = UPGRADE_TYPE::HOUSE->value;
|
|
|
- $upgradeLog->old_level = $oldLevel;
|
|
|
- $upgradeLog->new_level = $newLevel;
|
|
|
+ $upgradeLog = new FarmUpgradeLog();
|
|
|
+ $upgradeLog->user_id = $userId;
|
|
|
+ $upgradeLog->upgrade_type = UPGRADE_TYPE::HOUSE->value;
|
|
|
+ $upgradeLog->old_level = $oldLevel;
|
|
|
+ $upgradeLog->new_level = $newLevel;
|
|
|
$upgradeLog->materials_consumed = $materials;
|
|
|
- $upgradeLog->upgrade_time = now();
|
|
|
- $upgradeLog->created_at = now();
|
|
|
+ $upgradeLog->upgrade_time = now();
|
|
|
+ $upgradeLog->created_at = now();
|
|
|
$upgradeLog->save();
|
|
|
|
|
|
- Log::debug('HouseUpgradedEvent',[]);
|
|
|
- // 触发房屋升级事件
|
|
|
+ Log::debug('HouseUpgradedEvent', []);
|
|
|
+ // 触发房屋升级事件
|
|
|
event(new HouseUpgradedEvent($userId, $farmUser, $oldLevel, $newLevel, $upgradeLog));
|
|
|
|
|
|
Log::info('房屋升级成功', [
|
|
|
- 'user_id' => $userId,
|
|
|
- 'old_level' => $oldLevel,
|
|
|
- 'new_level' => $newLevel,
|
|
|
+ 'user_id' => $userId,
|
|
|
+ 'old_level' => $oldLevel,
|
|
|
+ 'new_level' => $newLevel,
|
|
|
'upgrade_log_id' => $upgradeLog->id
|
|
|
]);
|
|
|
|
|
|
@@ -222,8 +223,8 @@ class HouseLogic
|
|
|
} catch (\Exception $e) {
|
|
|
Log::error('房屋升级失败', [
|
|
|
'user_id' => $userId,
|
|
|
- 'error' => $e->getMessage(),
|
|
|
- 'trace' => $e->getTraceAsString()
|
|
|
+ 'error' => $e->getMessage(),
|
|
|
+ 'trace' => $e->getTraceAsString()
|
|
|
]);
|
|
|
|
|
|
return false;
|
|
|
@@ -268,80 +269,88 @@ class HouseLogic
|
|
|
*/
|
|
|
public function getHouseRankList(int $userId, int $page = 1, int $pageSize = 20): HouseRankDto
|
|
|
{
|
|
|
- try {
|
|
|
- // 限制只显示前100名
|
|
|
- $maxRankLimit = 100;
|
|
|
- $offset = ($page - 1) * $pageSize;
|
|
|
|
|
|
- // 如果请求的数据超出前100名,返回空结果
|
|
|
- if ($offset >= $maxRankLimit) {
|
|
|
- return new HouseRankDto([], 0, 1, [
|
|
|
- 'page' => $page,
|
|
|
- 'per_page' => $pageSize,
|
|
|
- 'total' => min($maxRankLimit, $this->getTotalHouseRankCount())
|
|
|
- ]);
|
|
|
- }
|
|
|
|
|
|
- // 调整查询限制,确保不超过前100名
|
|
|
- $actualLimit = min($pageSize, $maxRankLimit - $offset);
|
|
|
-
|
|
|
- // 尝试从缓存获取排行榜数据
|
|
|
- $cacheKey = $this->cachePrefix . 'house_rank:top100';
|
|
|
- $cachedRankList = Cache::get($cacheKey);
|
|
|
-
|
|
|
- if (!$cachedRankList) {
|
|
|
- // 查询前100名排行榜数据,按房屋等级降序排列
|
|
|
- $cachedRankList = 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') // 同等级按升级时间排序
|
|
|
- ->limit($maxRankLimit)
|
|
|
- ->get()
|
|
|
- ->toArray();
|
|
|
-
|
|
|
- // 缓存10分钟
|
|
|
- Cache::put($cacheKey, $cachedRankList, 600);
|
|
|
- }
|
|
|
+ // 限制只显示前100名
|
|
|
+ $maxRankLimit = 100;
|
|
|
+ $offset = ($page - 1) * $pageSize;
|
|
|
+ $cachedRankList = $this->getHouseRankListCache($userId, $page, $pageSize);
|
|
|
+ // 调整查询限制,确保不超过前100名
|
|
|
+ $actualLimit = min($pageSize, $maxRankLimit - $offset);
|
|
|
+ // 从缓存数据中获取当前页的数据
|
|
|
+ $rankList = array_slice($cachedRankList, $offset, $actualLimit);
|
|
|
+
|
|
|
+ // 转换为DTO对象
|
|
|
+ $rankItems = [];
|
|
|
+ foreach ($rankList as $index => $item) {
|
|
|
+ $rank = $offset + $index + 1;
|
|
|
+ $rankItems[] = HouseRankItemDto::fromArray((array)$item, $rank);
|
|
|
+ }
|
|
|
|
|
|
- // 从缓存数据中获取当前页的数据
|
|
|
- $rankList = array_slice($cachedRankList, $offset, $actualLimit);
|
|
|
+ // 查询用户自己的排名
|
|
|
+ $userRank = $this->getUserHouseRank($userId);
|
|
|
|
|
|
- // 转换为DTO对象
|
|
|
- $rankItems = [];
|
|
|
- foreach ($rankList as $index => $item) {
|
|
|
- $rank = $offset + $index + 1;
|
|
|
- $rankItems[] = HouseRankItemDto::fromArray((array)$item, $rank);
|
|
|
- }
|
|
|
+ // 构建分页信息
|
|
|
+ $pageInfo = [
|
|
|
+ 'page' => $page,
|
|
|
+ 'per_page' => $pageSize,
|
|
|
+ 'total' => min($maxRankLimit, $this->getTotalHouseRankCount())
|
|
|
+ ];
|
|
|
|
|
|
- // 查询用户自己的排名
|
|
|
- $userRank = $this->getUserHouseRank($userId);
|
|
|
+ return new HouseRankDto($rankItems, $userRank, 1, $pageInfo);
|
|
|
|
|
|
- // 构建分页信息
|
|
|
- $pageInfo = [
|
|
|
- 'page' => $page,
|
|
|
- 'per_page' => $pageSize,
|
|
|
- 'total' => min($maxRankLimit, $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()
|
|
|
+ /**
|
|
|
+ * 排行榜缓存
|
|
|
+ * @param int $userId
|
|
|
+ * @param int $page
|
|
|
+ * @param int $pageSize
|
|
|
+ * @return HouseRankDto
|
|
|
+ */
|
|
|
+ protected function getHouseRankListCache(int $userId, int $page = 1, int $pageSize = 20): HouseRankDto
|
|
|
+ {
|
|
|
+
|
|
|
+ // 限制只显示前100名
|
|
|
+ $maxRankLimit = 100;
|
|
|
+ $offset = ($page - 1) * $pageSize;
|
|
|
+
|
|
|
+ // 如果请求的数据超出前100名,返回空结果
|
|
|
+ if ($offset >= $maxRankLimit) {
|
|
|
+ return new HouseRankDto([], 0, 1, [
|
|
|
+ 'page' => $page,
|
|
|
+ 'per_page' => $pageSize,
|
|
|
+ 'total' => min($maxRankLimit, $this->getTotalHouseRankCount())
|
|
|
]);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 尝试从缓存获取排行榜数据
|
|
|
+ $cacheKey = $this->cachePrefix . 'house_rank:top100';
|
|
|
+ $cachedRankList = Cache::get($cacheKey);
|
|
|
+
|
|
|
+ if (!$cachedRankList) {
|
|
|
+ // 查询前100名排行榜数据,按房屋等级降序排列
|
|
|
+ $cachedRankList = DB::table('farm_users as fu')
|
|
|
+ ->join('user_infos as u', 'fu.user_id', '=', 'u.id')
|
|
|
+ ->select([
|
|
|
+ 'fu.user_id',
|
|
|
+ 'fu.house_level',
|
|
|
+ 'u.nickname as nickname', // 使用username作为昵称
|
|
|
+ 'fu.last_upgrade_time'
|
|
|
+ ])
|
|
|
+ ->orderBy('fu.house_level', 'desc')
|
|
|
+ ->orderBy('fu.last_upgrade_time', 'asc') // 同等级按升级时间排序
|
|
|
+ ->limit($maxRankLimit)
|
|
|
+ ->get()
|
|
|
+ ->toArray();
|
|
|
|
|
|
- return new HouseRankDto();
|
|
|
+ // 缓存10分钟
|
|
|
+ Cache::put($cacheKey, $cachedRankList, 600);
|
|
|
}
|
|
|
+
|
|
|
+ return $cachedRankList;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -354,7 +363,7 @@ class HouseLogic
|
|
|
{
|
|
|
try {
|
|
|
// 尝试从缓存获取用户排名
|
|
|
- $cacheKey = $this->cachePrefix . 'user_house_rank:' . $userId;
|
|
|
+ $cacheKey = $this->cachePrefix . 'user_house_rank:' . $userId;
|
|
|
$cachedRank = Cache::get($cacheKey);
|
|
|
|
|
|
if ($cachedRank !== null) {
|
|
|
@@ -365,10 +374,11 @@ class HouseLogic
|
|
|
$userFarm = FarmUser::where('user_id', $userId)->first();
|
|
|
if (!$userFarm) {
|
|
|
Cache::put($cacheKey, 0, 600); // 缓存10分钟
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- $userLevel = $userFarm->house_level;
|
|
|
+ $userLevel = $userFarm->house_level;
|
|
|
$userUpgradeTime = $userFarm->last_upgrade_time;
|
|
|
|
|
|
// 计算排名:比用户等级高的用户数量 + 同等级但升级时间更早的用户数量 + 1
|
|
|
@@ -397,7 +407,7 @@ class HouseLogic
|
|
|
} catch (\Exception $e) {
|
|
|
Log::error('获取用户房屋排名失败', [
|
|
|
'user_id' => $userId,
|
|
|
- 'error' => $e->getMessage()
|
|
|
+ 'error' => $e->getMessage()
|
|
|
]);
|
|
|
|
|
|
return 0;
|
|
|
@@ -414,6 +424,7 @@ class HouseLogic
|
|
|
try {
|
|
|
// 获取实际用户总数,但最多返回100
|
|
|
$actualCount = FarmUser::count();
|
|
|
+
|
|
|
return min($actualCount, 100);
|
|
|
} catch (\Exception $e) {
|
|
|
Log::error('获取房屋排行榜总数失败', [
|
|
|
@@ -443,11 +454,11 @@ class HouseLogic
|
|
|
->join('users as u', 'f.user_id', '=', 'u.id')
|
|
|
->leftJoin('farm_users as fu', 'f.user_id', '=', 'fu.user_id')
|
|
|
->select([
|
|
|
- 'f.user_id',
|
|
|
- 'f.balance',
|
|
|
- 'u.username',
|
|
|
- 'fu.house_level'
|
|
|
- ])
|
|
|
+ 'f.user_id',
|
|
|
+ 'f.balance',
|
|
|
+ 'u.username',
|
|
|
+ 'fu.house_level'
|
|
|
+ ])
|
|
|
->where('f.fund_id', 2) // 钻石资金类型
|
|
|
->orderBy('f.balance', 'desc')
|
|
|
->orderBy('fu.house_level', 'desc') // 同钻石余额按房屋等级排序
|
|
|
@@ -459,7 +470,7 @@ class HouseLogic
|
|
|
// 转换为DTO对象
|
|
|
$rankItems = [];
|
|
|
foreach ($rankList as $index => $item) {
|
|
|
- $rank = $offset + $index + 1;
|
|
|
+ $rank = $offset + $index + 1;
|
|
|
$rankItems[] = WealthRankItemDto::fromArray((array)$item, $rank);
|
|
|
}
|
|
|
|
|
|
@@ -468,20 +479,20 @@ class HouseLogic
|
|
|
|
|
|
// 构建分页信息
|
|
|
$pageInfo = [
|
|
|
- 'page' => $page,
|
|
|
+ 'page' => $page,
|
|
|
'per_page' => $pageSize,
|
|
|
- 'total' => $this->getTotalWealthRankCount()
|
|
|
+ 'total' => $this->getTotalWealthRankCount()
|
|
|
];
|
|
|
|
|
|
return new WealthRankDto($rankItems, $userRank, 1, $pageInfo);
|
|
|
|
|
|
} catch (\Exception $e) {
|
|
|
Log::error('获取财富排行榜失败', [
|
|
|
- 'user_id' => $userId,
|
|
|
- 'page' => $page,
|
|
|
+ 'user_id' => $userId,
|
|
|
+ 'page' => $page,
|
|
|
'page_size' => $pageSize,
|
|
|
- 'error' => $e->getMessage(),
|
|
|
- 'trace' => $e->getTraceAsString()
|
|
|
+ 'error' => $e->getMessage(),
|
|
|
+ 'trace' => $e->getTraceAsString()
|
|
|
]);
|
|
|
|
|
|
return new WealthRankDto();
|
|
|
@@ -500,7 +511,7 @@ class HouseLogic
|
|
|
// 获取用户的钻石余额和房屋等级
|
|
|
$userFund = DB::table('fund as f')
|
|
|
->leftJoin('farm_users as fu', 'f.user_id', '=', 'fu.user_id')
|
|
|
- ->select(['f.balance', 'fu.house_level'])
|
|
|
+ ->select([ 'f.balance', 'fu.house_level' ])
|
|
|
->where('f.user_id', $userId)
|
|
|
->where('f.fund_id', 2) // 钻石资金类型
|
|
|
->first();
|
|
|
@@ -509,7 +520,7 @@ class HouseLogic
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- $userBalance = $userFund->balance ?? 0;
|
|
|
+ $userBalance = $userFund->balance ?? 0;
|
|
|
$userHouseLevel = $userFund->house_level ?? 0;
|
|
|
|
|
|
// 计算排名:比用户余额高的用户数量 + 同余额但房屋等级更高的用户数量 + 1
|
|
|
@@ -530,7 +541,7 @@ class HouseLogic
|
|
|
} catch (\Exception $e) {
|
|
|
Log::error('获取用户财富排名失败', [
|
|
|
'user_id' => $userId,
|
|
|
- 'error' => $e->getMessage()
|
|
|
+ 'error' => $e->getMessage()
|
|
|
]);
|
|
|
|
|
|
return 0;
|
|
|
@@ -591,4 +602,5 @@ class HouseLogic
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
}
|