212153-优化物品消耗逻辑优先消耗冻结物品.md 4.1 KB

优化物品消耗逻辑:优先消耗冻结物品

任务时间

  • 开始时间:2025-06-21 21:53:45
  • 完成时间:2025-06-21 22:15:00

问题描述

用户询问:物品消耗,允许冻结,要优先冻结,目前是这么设计的么?

经过代码分析发现,当前物品消耗逻辑没有优先消耗冻结物品

问题分析

1. 当前设计

app/Module/GameItems/Logics/Item.phpconsumeNormalItem 方法中:

// 第345行:只按过期时间排序
$userItems = $query->orderBy('expire_at')->get();

问题

  • include_frozen=true 时,冻结和未冻结物品混合在一起
  • 只按 expire_at 排序,没有优先消耗冻结物品
  • 不符合"优先冻结"的设计原则

2. 业务需求

  • 当允许消耗冻结物品时(include_frozen=true),应该优先消耗冻结物品
  • 冻结物品消耗完后,再消耗未冻结物品
  • 在同一冻结状态内,按过期时间排序

解决方案

1. 修改排序逻辑

修改 app/Module/GameItems/Logics/Item.php 第344-345行:

// 修改前
$userItems = $query->orderBy('expire_at')->get();

// 修改后
if ($includeFrozen) {
    // 当包含冻结物品时,优先消耗冻结物品,再消耗未冻结物品
    $userItems = $query->orderBy('is_frozen', 'desc') // 冻结物品优先(true > false)
                      ->orderBy('expire_at') // 然后按过期时间排序
                      ->get();
} else {
    // 只消耗未冻结物品时,按过期时间排序
    $userItems = $query->orderBy('expire_at')->get();
}

2. 排序逻辑说明

  • orderBy('is_frozen', 'desc'):冻结物品优先(true > false)
  • orderBy('expire_at'):在同一冻结状态内,按过期时间排序
  • 向后兼容:当 include_frozen=false 时,保持原有逻辑不变

测试验证

1. 测试场景

创建了 tests/manual_test_consume_frozen_priority.php 测试脚本:

初始状态

  • 100个未冻结物品
  • 50个冻结物品
  • 总计150个物品

测试1:消耗50个物品

  • 期望:优先消耗50个冻结物品
  • 结果:✅ 剩余100个未冻结,0个冻结

测试2:再消耗80个物品

  • 期望:消耗80个未冻结物品
  • 结果:✅ 剩余20个未冻结,0个冻结

2. 测试结果

=== 物品消耗优先冻结物品测试 ===

4. 测试优先消耗冻结物品(消耗50个)...
   消耗50个物品: 成功
6. 验证结果(第一次消耗)...
   ✅ 测试通过:优先消耗了冻结物品

7. 测试消耗超过冻结数量(消耗80个)...
   消耗80个物品: 成功
9. 验证最终结果...
   ✅ 测试通过:正确消耗了混合物品

影响范围

1. 向后兼容性

  • 默认行为不变include_frozen 默认为 false,只消耗未冻结物品
  • 新增优化:当 include_frozen=true 时,优先消耗冻结物品
  • 不影响现有业务:现有调用方式保持不变

2. 受益模块

  • Mex模块:撮合时优先消耗冻结物品,提高撮合效率
  • 其他业务场景:任何需要消耗冻结物品的场景都会受益

3. 性能影响

  • 查询优化:增加了 is_frozen 字段的排序
  • 逻辑优化:优先消耗冻结物品,减少冻结物品的积压

文件变更

1. 核心修改

  • app/Module/GameItems/Logics/Item.php
    • 修改 consumeNormalItem 方法的排序逻辑
    • 增加冻结物品优先消耗的逻辑

2. 测试文件

  • tests/manual_test_consume_frozen_priority.php:手动测试脚本
  • tests/Unit/GameItems/ItemConsumeFrozenTest.php:增加优先消耗测试方法

总结

通过优化物品消耗逻辑的排序机制,成功实现了优先消耗冻结物品的功能:

  1. 优先级正确:冻结物品优先于未冻结物品被消耗
  2. 逻辑完整:支持跨冻结状态的混合消耗
  3. 向后兼容:不影响现有业务逻辑
  4. 测试验证:通过完整的测试验证
  5. 性能优化:减少冻结物品积压,提高业务效率

这个优化不仅解决了用户提出的问题,还为Mex模块等需要消耗冻结物品的业务场景提供了更好的支持。