test_unfreeze_logic_fix.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. <?php
  2. /**
  3. * 手动测试脚本:验证解冻逻辑修复
  4. *
  5. * 测试解冻时是否从其他冻结堆中解冻,而不是从可用物品中扣除
  6. */
  7. require_once __DIR__ . '/../vendor/autoload.php';
  8. use App\Module\GameItems\Services\ItemService;
  9. use App\Module\GameItems\Enums\FREEZE_REASON_TYPE;
  10. use Illuminate\Support\Facades\DB;
  11. // 启动Laravel应用
  12. $app = require_once __DIR__ . '/../bootstrap/app.php';
  13. $app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
  14. echo "=== 解冻逻辑修复验证测试 ===\n\n";
  15. try {
  16. DB::beginTransaction();
  17. $userId = 1001;
  18. $itemId = 1;
  19. echo "1. 准备测试数据\n";
  20. // 添加物品
  21. $addResult = ItemService::addItem($userId, $itemId, 100);
  22. echo " 添加100个物品成功\n";
  23. // 冻结第一批物品
  24. $freezeResult1 = ItemService::freezeItem(
  25. $userId,
  26. $itemId,
  27. null,
  28. 30,
  29. FREEZE_REASON_TYPE::TRADE_ORDER->value,
  30. [
  31. 'source_id' => 12345,
  32. 'source_type' => 'test_order_1',
  33. 'operator_id' => 1
  34. ]
  35. );
  36. $freezeLogId1 = $freezeResult1['frozen_items'][0]['freeze_log_id'];
  37. echo " 冻结30个物品成功,日志ID: {$freezeLogId1}\n";
  38. // 冻结第二批物品
  39. $freezeResult2 = ItemService::freezeItem(
  40. $userId,
  41. $itemId,
  42. null,
  43. 40,
  44. FREEZE_REASON_TYPE::TRADE_ORDER->value,
  45. [
  46. 'source_id' => 12346,
  47. 'source_type' => 'test_order_2',
  48. 'operator_id' => 1
  49. ]
  50. );
  51. $freezeLogId2 = $freezeResult2['frozen_items'][0]['freeze_log_id'];
  52. echo " 冻结40个物品成功,日志ID: {$freezeLogId2}\n";
  53. // 检查当前状态
  54. echo "\n2. 检查冻结后的物品状态\n";
  55. $userItems = DB::table('item_users')
  56. ->where('user_id', $userId)
  57. ->where('item_id', $itemId)
  58. ->get();
  59. foreach ($userItems as $item) {
  60. $frozenStatus = $item->is_frozen ? '冻结' : '可用';
  61. $freezeLogId = $item->frozen_log_id ?? 'N/A';
  62. echo " 物品堆ID: {$item->id}, 数量: {$item->quantity}, 状态: {$frozenStatus}, 冻结日志: {$freezeLogId}\n";
  63. }
  64. // 部分消耗第一个冻结堆
  65. echo "\n3. 部分消耗第一个冻结堆\n";
  66. $consumeResult = ItemService::consumeItem(
  67. $userId,
  68. $itemId,
  69. null,
  70. 20,
  71. [
  72. 'include_frozen' => true,
  73. 'source_type' => 'test_consume',
  74. 'source_id' => 67890
  75. ]
  76. );
  77. echo " 消耗20个冻结物品成功\n";
  78. // 检查消耗后状态
  79. echo "\n4. 检查消耗后的物品状态\n";
  80. $userItemsAfter = DB::table('item_users')
  81. ->where('user_id', $userId)
  82. ->where('item_id', $itemId)
  83. ->get();
  84. foreach ($userItemsAfter as $item) {
  85. $frozenStatus = $item->is_frozen ? '冻结' : '可用';
  86. $freezeLogId = $item->frozen_log_id ?? 'N/A';
  87. echo " 物品堆ID: {$item->id}, 数量: {$item->quantity}, 状态: {$frozenStatus}, 冻结日志: {$freezeLogId}\n";
  88. }
  89. // 现在状态应该是:
  90. // - 第一个冻结堆:10个(30-20)
  91. // - 第二个冻结堆:40个
  92. // - 可用物品:30个
  93. echo "\n5. 测试解冻第一个冻结堆(需要从第二个冻结堆补足)\n";
  94. try {
  95. $unfreezeResult = ItemService::unfreezeItem($freezeLogId1);
  96. echo " 解冻成功: " . json_encode($unfreezeResult, JSON_UNESCAPED_UNICODE) . "\n";
  97. echo " 补足差额: " . ($unfreezeResult['shortage_compensated'] ?? 0) . "\n";
  98. // 检查解冻后状态
  99. echo "\n6. 检查解冻后的物品状态\n";
  100. $userItemsFinal = DB::table('item_users')
  101. ->where('user_id', $userId)
  102. ->where('item_id', $itemId)
  103. ->get();
  104. $totalAvailable = 0;
  105. $totalFrozen = 0;
  106. foreach ($userItemsFinal as $item) {
  107. $frozenStatus = $item->is_frozen ? '冻结' : '可用';
  108. $freezeLogId = $item->frozen_log_id ?? 'N/A';
  109. echo " 物品堆ID: {$item->id}, 数量: {$item->quantity}, 状态: {$frozenStatus}, 冻结日志: {$freezeLogId}\n";
  110. if ($item->is_frozen) {
  111. $totalFrozen += $item->quantity;
  112. } else {
  113. $totalAvailable += $item->quantity;
  114. }
  115. }
  116. echo " 总计:可用 {$totalAvailable},冻结 {$totalFrozen}\n";
  117. // 验证逻辑是否正确
  118. echo "\n7. 验证解冻逻辑\n";
  119. if ($totalAvailable == 60) { // 30个原始可用 + 30个解冻后的
  120. echo " ✅ 解冻逻辑正确:可用物品数量为60(30原始+30解冻)\n";
  121. } else {
  122. echo " ❌ 解冻逻辑错误:可用物品数量应该为60,实际为 {$totalAvailable}\n";
  123. }
  124. if ($totalFrozen == 20) { // 40个第二个冻结堆 - 20个用于补足
  125. echo " ✅ 补足逻辑正确:剩余冻结物品数量为20(40-20补足)\n";
  126. } else {
  127. echo " ❌ 补足逻辑错误:剩余冻结物品数量应该为20,实际为 {$totalFrozen}\n";
  128. }
  129. } catch (Exception $e) {
  130. echo " 解冻失败: " . $e->getMessage() . "\n";
  131. }
  132. echo "\n=== 测试完成 ===\n";
  133. DB::rollback();
  134. echo "已回滚测试数据\n";
  135. } catch (Exception $e) {
  136. DB::rollback();
  137. echo "测试失败: " . $e->getMessage() . "\n";
  138. echo "堆栈跟踪: " . $e->getTraceAsString() . "\n";
  139. }