manual_test_unfreeze_bug_fix.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. <?php
  2. /**
  3. * 手动测试脚本:验证物品解冻BUG修复
  4. *
  5. * 测试场景:
  6. * 1. 冻结物品
  7. * 2. 消耗冻结物品
  8. * 3. 尝试解冻(应该正确处理已被消耗的情况)
  9. */
  10. require_once __DIR__ . '/../vendor/autoload.php';
  11. use App\Module\GameItems\Services\ItemService;
  12. use App\Module\GameItems\Enums\FREEZE_REASON_TYPE;
  13. use Illuminate\Support\Facades\DB;
  14. // 启动Laravel应用
  15. $app = require_once __DIR__ . '/../bootstrap/app.php';
  16. $app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
  17. echo "=== 物品解冻BUG修复测试 ===\n\n";
  18. try {
  19. DB::beginTransaction();
  20. $userId = 1001; // 测试用户ID
  21. $itemId = 1; // 测试物品ID
  22. $freezeQuantity = 100; // 冻结数量
  23. $consumeQuantity = 60; // 消耗数量
  24. echo "1. 准备测试数据\n";
  25. echo " 用户ID: {$userId}\n";
  26. echo " 物品ID: {$itemId}\n";
  27. echo " 冻结数量: {$freezeQuantity}\n";
  28. echo " 消耗数量: {$consumeQuantity}\n\n";
  29. // 确保用户有足够的物品
  30. echo "2. 添加测试物品\n";
  31. $addResult = ItemService::addItem($userId, $itemId, 300); // 增加到300,确保有足够的物品用于补足
  32. echo " 添加结果: " . json_encode($addResult, JSON_UNESCAPED_UNICODE) . "\n\n";
  33. // 冻结物品
  34. echo "3. 冻结物品\n";
  35. $freezeResult = ItemService::freezeItem(
  36. $userId,
  37. $itemId,
  38. null, // instanceId
  39. $freezeQuantity,
  40. FREEZE_REASON_TYPE::TRADE_ORDER->value,
  41. [
  42. 'source_id' => 12345,
  43. 'source_type' => 'test_order',
  44. 'operator_id' => 1
  45. ]
  46. );
  47. echo " 冻结结果: " . json_encode($freezeResult, JSON_UNESCAPED_UNICODE) . "\n";
  48. $freezeLogId = $freezeResult['frozen_items'][0]['freeze_log_id'];
  49. echo " 冻结日志ID: {$freezeLogId}\n\n";
  50. // 消耗部分冻结物品
  51. echo "4. 消耗部分冻结物品\n";
  52. $consumeResult = ItemService::consumeItem(
  53. $userId,
  54. $itemId,
  55. null, // instanceId
  56. $consumeQuantity,
  57. [
  58. 'include_frozen' => true, // 允许消耗冻结物品
  59. 'source_type' => 'test_consume',
  60. 'source_id' => 67890
  61. ]
  62. );
  63. echo " 消耗结果: " . json_encode($consumeResult, JSON_UNESCAPED_UNICODE) . "\n\n";
  64. // 检查冻结物品当前状态
  65. echo "5. 检查冻结物品当前状态\n";
  66. $frozenItems = ItemService::getFrozenItems($userId, ['item_id' => $itemId]);
  67. echo " 冻结物品列表: " . json_encode($frozenItems, JSON_UNESCAPED_UNICODE) . "\n\n";
  68. // 测试原始解冻方法(应该成功,因为还有剩余数量)
  69. echo "6. 测试原始解冻方法\n";
  70. try {
  71. $unfreezeResult = ItemService::unfreezeItem($freezeLogId);
  72. echo " 原始解冻成功: " . json_encode($unfreezeResult, JSON_UNESCAPED_UNICODE) . "\n\n";
  73. } catch (Exception $e) {
  74. echo " 原始解冻失败: " . $e->getMessage() . "\n\n";
  75. }
  76. // 重新冻结用于测试完全消耗的情况
  77. echo "7. 重新冻结剩余物品进行完全消耗测试\n";
  78. $remainingQuantity = 40; // 100 - 60 = 40
  79. $freezeResult2 = ItemService::freezeItem(
  80. $userId,
  81. $itemId,
  82. null, // instanceId
  83. $remainingQuantity,
  84. FREEZE_REASON_TYPE::TRADE_ORDER->value,
  85. [
  86. 'source_id' => 12346,
  87. 'source_type' => 'test_order_2',
  88. 'operator_id' => 1
  89. ]
  90. );
  91. echo " 第二次冻结结果: " . json_encode($freezeResult2, JSON_UNESCAPED_UNICODE) . "\n";
  92. $freezeLogId2 = $freezeResult2['frozen_items'][0]['freeze_log_id'];
  93. echo " 第二次冻结日志ID: {$freezeLogId2}\n\n";
  94. // 完全消耗冻结物品
  95. echo "8. 完全消耗冻结物品\n";
  96. $consumeResult2 = ItemService::consumeItem(
  97. $userId,
  98. $itemId,
  99. null, // instanceId
  100. $remainingQuantity,
  101. [
  102. 'include_frozen' => true,
  103. 'source_type' => 'test_consume_all',
  104. 'source_id' => 67891
  105. ]
  106. );
  107. echo " 完全消耗结果: " . json_encode($consumeResult2, JSON_UNESCAPED_UNICODE) . "\n\n";
  108. // 测试原始解冻方法(应该失败)
  109. echo "9. 测试原始解冻方法(完全消耗后)\n";
  110. try {
  111. $unfreezeResult = ItemService::unfreezeItem($freezeLogId2);
  112. echo " 原始解冻成功: " . json_encode($unfreezeResult, JSON_UNESCAPED_UNICODE) . "\n\n";
  113. } catch (Exception $e) {
  114. echo " 原始解冻失败(预期): " . $e->getMessage() . "\n\n";
  115. }
  116. // 测试安全解冻方法(应该成功处理)
  117. echo "10. 测试安全解冻方法(完全消耗后)\n";
  118. try {
  119. $safeUnfreezeResult = ItemService::safeUnfreezeItem($freezeLogId2);
  120. echo " 安全解冻成功: " . json_encode($safeUnfreezeResult, JSON_UNESCAPED_UNICODE) . "\n\n";
  121. } catch (Exception $e) {
  122. echo " 安全解冻失败: " . $e->getMessage() . "\n\n";
  123. }
  124. // 测试统计功能
  125. echo "11. 测试已消耗冻结物品统计\n";
  126. $statistics = ItemService::getConsumedFrozenItemsStatistics($userId);
  127. echo " 统计结果: " . json_encode($statistics, JSON_UNESCAPED_UNICODE) . "\n\n";
  128. echo "=== 测试完成 ===\n";
  129. DB::rollback(); // 回滚测试数据
  130. echo "已回滚测试数据\n";
  131. } catch (Exception $e) {
  132. DB::rollback();
  133. echo "测试失败: " . $e->getMessage() . "\n";
  134. echo "堆栈跟踪: " . $e->getTraceAsString() . "\n";
  135. }