10日1757-FarmRankItem增加财富值属性功能.md 4.8 KB

FarmRankItem增加财富值属性功能

任务时间

  • 开始时间:2025年06月10日 17:57:45
  • 完成时间:2025年06月10日 18:15:00

任务描述

为FarmRankItem属性增加财富值(fund - 2),等级排行榜和财富排行榜都有,增加数据的读取。

修改内容

修改文件

  1. app/Module/Farm/Dtos/HouseRankItemDto.php - 房屋排行榜DTO增加财富值属性
  2. app/Module/Farm/Logics/HouseLogic.php - 更新房屋排行榜数据查询逻辑
  3. app/Module/AppGame/Proto/HouseRankDto.php - 更新房屋排行榜Protobuf转换
  4. app/Module/AppGame/Proto/WealthRankDto.php - 更新财富排行榜Protobuf转换

具体修改

1. HouseRankItemDto增加财富值属性

  • 新增属性: public int $wealth = 0 - 财富值(钻石余额)
  • 更新构造函数: 添加wealth参数
  • 更新fromArray方法: 从数据库结果中读取balance字段作为财富值
  • 清理代码: 移除未使用的import语句

2. 房屋排行榜数据查询优化

  • 增加财富值查询: 在房屋排行榜查询中leftJoin fund表
  • 查询条件: f.fund_id = 2 (钻石资金类型)
  • 新增字段: 在select中添加 f.balance 字段
  • 保持排序: 仍按房屋等级降序,同等级按升级时间排序

3. Protobuf转换逻辑更新

房屋排行榜转换 (HouseRankDto)
  • 设置财富值: $rankItem->setFund2($item->wealth)
  • 保持等级: $rankItem->setLevel($item->level) 仍为房屋等级
  • 完整数据: 同时包含房屋等级和财富值
财富排行榜转换 (WealthRankDto)
  • 修正等级字段: $rankItem->setLevel($item->houseLevel) 设置为房屋等级
  • 设置财富值: $rankItem->setFund2($item->wealth) 设置财富值
  • 修正昵称: $rankItem->setNickname($item->nickname) 使用正确的昵称

技术实现

数据库查询优化

-- 房屋排行榜查询(新增财富值)
SELECT 
    fu.user_id,
    fu.house_level,
    u.nickname,
    fu.last_upgrade_time,
    f.balance  -- 新增财富值字段
FROM farm_users fu
JOIN user_infos u ON fu.user_id = u.user_id
LEFT JOIN fund f ON fu.user_id = f.user_id AND f.fund_id = 2
ORDER BY fu.house_level DESC, fu.last_upgrade_time ASC
LIMIT 100

DTO结构统一

  • HouseRankItemDto: 包含rank, level, wealth, userId, nickname, reason
  • WealthRankItemDto: 包含rank, wealth, houseLevel, userId, nickname, reason
  • 数据完整性: 两个排行榜都包含完整的用户信息

Protobuf映射规范

  • rank: 排名
  • level: 房屋等级(两个排行榜都显示房屋等级)
  • fund2: 财富值(两个排行榜都显示财富值)
  • user_id: 用户ID
  • nickname: 用户昵称
  • reason: 赛季信息

功能特点

1. 数据完整性

  • 等级排行榜:显示房屋等级 + 财富值
  • 财富排行榜:显示财富值 + 房屋等级
  • 两个排行榜都包含完整的用户信息

2. 性能优化

  • 使用LEFT JOIN避免没有财富记录的用户被过滤
  • 保持现有的缓存机制
  • 单次查询获取所有需要的数据

3. 向后兼容

  • 保持现有的排序逻辑不变
  • 保持现有的分页逻辑不变
  • 新增字段不影响现有功能

代码示例

DTO构造函数

public function __construct(
    int $rank = 0, 
    int $level = 0, 
    int $wealth = 0,  // 新增财富值参数
    int $userId = 0, 
    string $nickname = '', 
    int $reason = 1
) {
    $this->rank = $rank;
    $this->level = $level;
    $this->wealth = $wealth;  // 设置财富值
    $this->userId = $userId;
    $this->nickname = $nickname;
    $this->reason = $reason;
}

Protobuf转换

private static function convertRankItem(HouseRankItemDto $item): FarmRankItem
{
    $rankItem = new FarmRankItem();
    $rankItem->setRank($item->rank);
    $rankItem->setLevel($item->level);      // 房屋等级
    $rankItem->setUserId($item->userId);
    $rankItem->setNickname($item->nickname);
    $rankItem->setReason($item->reason);
    $rankItem->setFund2($item->wealth);     // 财富值
    
    return $rankItem;
}

测试验证

  • PHP语法检查通过
  • 代码提交成功
  • 推送到远程仓库成功

提交信息

  • 提交哈希:e3acb952
  • 提交信息:为FarmRankItem增加财富值属性:等级排行榜和财富排行榜都包含财富值数据
  • 修改统计:4个文件,25行新增,16行删除

注意事项

  1. 使用LEFT JOIN确保没有财富记录的用户也能显示在排行榜中
  2. 财富值字段使用fund表中fund_id=2的记录(钻石)
  3. 保持现有的缓存和分页逻辑不变
  4. 两个排行榜现在都包含完整的用户信息(等级+财富)

后续建议

  1. 可以考虑在客户端显示时同时展示房屋等级和财富值
  2. 可以根据需要调整排行榜的显示优先级
  3. 监控查询性能,如有需要可以考虑添加数据库索引