222231-修复游戏奖励日志和用户日志管理显示问题.md 4.4 KB

修复游戏奖励日志和用户日志管理显示问题

时间: 2025年06月22日 22:31
任务类型: Bug修复
影响模块: Game模块 - 奖励日志、用户日志管理

问题描述

  1. 游戏奖励日志页面报错: /admin/game-reward-logs 页面显示 "Undefined constant REWARD_SOURCE_TYPE::USER_REGISTER_TEST" 错误
  2. 用户日志管理排序问题: 后台用户日志管理页面没有按照原始日志创建时间排序
  3. LogDataHandler排序确认: 需要确认API接口的日志数据是否按原始时间正确排序

解决方案

1. 修复游戏奖励日志页面错误

文件: app/Module/Game/Services/RewardSourceResolver.php

问题原因:

  • 使用了不存在的枚举常量 USER_REGISTER_TEST
  • 缺少对 CRAFTURSPROMOTION_BACKFILL 来源类型的支持

修复内容:

// 修正枚举常量引用
case REWARD_SOURCE_TYPE::URSPROMOTION_REGISTER->value:
case REWARD_SOURCE_TYPE::URSPROMOTION_REWARD->value:
case REWARD_SOURCE_TYPE::URSPROMOTION_BACKFILL->value:

// 添加合成来源支持
case REWARD_SOURCE_TYPE::CRAFT->value:
    return self::resolveCraftSource($sourceId, $typeInfo);

新增方法:

  • resolveCraftSource(): 处理合成来源的日志解析

2. 优化用户日志管理页面排序

文件: app/Module/Game/AdminControllers/UserLogController.php

修复内容:

// 修改默认排序为按原始时间排序
$grid->model()->orderBy('original_time', 'desc');

// 添加原始时间列
$grid->column('original_time', '原始时间')
    ->display(function ($value) {
        return $value ? $value->format('Y-m-d H:i:s') : '-';
    })
    ->sortable()
    ->help('业务发生的原始时间');

// 修改收集时间列
$grid->column('created_at', '收集时间')
    ->display(function ($value) {
        return $value ? $value->format('Y-m-d H:i:s') : '-';
    })
    ->sortable()
    ->help('日志收集时间');

// 更新筛选器
$filter->between('original_time', '原始时间')->datetime();

详情页面优化:

  • 添加原始时间字段显示
  • 区分原始时间和收集时间

3. 确认LogDataHandler排序正确性

验证结果: LogDataHandler已经正确实现按原始时间排序

调用链路:

  1. LogDataHandlerUserLogService::getUserLogs()
  2. UserLogServiceUserLogLogic::getUserLogs()
  3. UserLogLogicUserLog::byUser($userId)->latest()
  4. UserLog::scopeLatest()orderBy('original_time', 'desc')

时间字段使用:

  • Handler使用 $logItem->time 访问器
  • 访问器返回格式化的 original_time 字段

测试验证

1. 游戏奖励日志页面

  • ✅ 页面正常加载,无错误信息
  • ✅ "合成奖励" 显示为 "合成奖励 (ID: X)"
  • ✅ "URS推广奖励补发" 显示为 "URS推广奖励 (ID: X)"

2. 用户日志管理页面

  • ✅ 默认按原始时间降序排列
  • ✅ 原始时间和收集时间分别显示
  • ✅ 时间格式统一为 "Y-m-d H:i:s"
  • ✅ 筛选器支持按原始时间范围查询

3. API接口

  • ✅ LogDataHandler正确按原始时间排序
  • ✅ 返回数据使用原始业务时间

技术细节

枚举常量映射

// 原有错误的常量
USER_REGISTER_TEST → URSPROMOTION_REGISTER
PROMOTION_REWARD → URSPROMOTION_REWARD

// 新增支持的常量  
URSPROMOTION_BACKFILL → URS推广奖励补发
CRAFT → 合成奖励

时间字段说明

  • original_time: 业务发生的原始时间(用于排序和显示)
  • created_at/collected_at: 日志收集时间(系统记录时间)

排序逻辑

  • 后台管理: 按 original_time 降序排列
  • API接口: 通过 UserLog::latest() scope 按 original_time 降序排列

代码提交

提交哈希: 84b96187
提交信息: 修复游戏奖励日志和用户日志管理的显示问题
文件变更: 3个文件,78行新增,37行删除
已推送到远程仓库: ✅

影响范围

  • ✅ 游戏奖励日志后台管理页面正常显示
  • ✅ 用户日志管理页面按正确时间排序
  • ✅ API接口日志数据排序正确
  • ✅ 无向下兼容性问题
  • ✅ 无数据库结构变更

后续建议

  1. 定期检查枚举常量的使用,避免类似的常量引用错误
  2. 在添加新的日志来源类型时,确保在RewardSourceResolver中添加对应的处理逻辑
  3. 考虑为时间字段添加更多的显示格式选项(如相对时间显示)