manual_test_consume_frozen_priority.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <?php
  2. /**
  3. * 手动测试脚本:验证物品消耗优先冻结物品的逻辑
  4. *
  5. * 使用方法:
  6. * php tests/manual_test_consume_frozen_priority.php
  7. */
  8. require_once __DIR__ . '/../vendor/autoload.php';
  9. use App\Module\GameItems\Services\ItemService;
  10. use App\Module\GameItems\Models\ItemUser;
  11. use App\Module\GameItems\Enums\FREEZE_REASON_TYPE;
  12. use Illuminate\Support\Facades\DB;
  13. // 启动Laravel应用
  14. $app = require_once __DIR__ . '/../bootstrap/app.php';
  15. $app->make(\Illuminate\Contracts\Console\Kernel::class)->bootstrap();
  16. echo "=== 物品消耗优先冻结物品测试 ===\n\n";
  17. try {
  18. DB::transaction(function () {
  19. $testUserId = 99999; // 测试用户ID
  20. $testItemId = 1; // 测试物品ID
  21. echo "1. 清理测试数据...\n";
  22. // 清理测试数据
  23. ItemUser::where('user_id', $testUserId)->delete();
  24. echo "2. 添加测试物品...\n";
  25. // 添加100个未冻结物品
  26. $result1 = ItemService::addItem($testUserId, $testItemId, 100, [
  27. 'source_type' => 'test',
  28. 'source_id' => 1,
  29. ]);
  30. echo " 添加100个未冻结物品: " . ($result1['success'] ? '成功' : '失败') . "\n";
  31. // 添加50个物品并冻结
  32. $result2 = ItemService::addItem($testUserId, $testItemId, 50, [
  33. 'source_type' => 'test',
  34. 'source_id' => 2,
  35. ]);
  36. echo " 添加50个物品: " . ($result2['success'] ? '成功' : '失败') . "\n";
  37. // 冻结50个物品
  38. $freezeResult = ItemService::freezeItem(
  39. $testUserId,
  40. $testItemId,
  41. null,
  42. 50,
  43. '测试冻结',
  44. [
  45. 'reason_type' => FREEZE_REASON_TYPE::TRADE_ORDER->value,
  46. 'source_id' => 1,
  47. 'source_type' => 'test',
  48. ]
  49. );
  50. echo " 冻结50个物品: " . ($freezeResult['success'] ? '成功' : '失败') . "\n";
  51. echo "\n3. 查看初始状态...\n";
  52. $unfrozenCount = ItemUser::where('user_id', $testUserId)
  53. ->where('item_id', $testItemId)
  54. ->where('is_frozen', false)
  55. ->sum('quantity');
  56. $frozenCount = ItemUser::where('user_id', $testUserId)
  57. ->where('item_id', $testItemId)
  58. ->where('is_frozen', true)
  59. ->sum('quantity');
  60. echo " 未冻结物品数量: {$unfrozenCount}\n";
  61. echo " 冻结物品数量: {$frozenCount}\n";
  62. echo " 总数量: " . ($unfrozenCount + $frozenCount) . "\n";
  63. echo "\n4. 测试优先消耗冻结物品(消耗50个)...\n";
  64. // 消耗50个物品,应该优先消耗冻结的50个物品
  65. $consumeResult = ItemService::consumeItem(
  66. $testUserId,
  67. $testItemId,
  68. null,
  69. 50,
  70. [
  71. 'source_type' => 'test',
  72. 'source_id' => 3,
  73. 'include_frozen' => true
  74. ]
  75. );
  76. echo " 消耗50个物品: " . ($consumeResult['success'] ? '成功' : '失败') . "\n";
  77. if (!$consumeResult['success']) {
  78. echo " 错误信息: " . ($consumeResult['message'] ?? '未知错误') . "\n";
  79. }
  80. echo "\n5. 查看消耗后状态...\n";
  81. $unfrozenCountAfter = ItemUser::where('user_id', $testUserId)
  82. ->where('item_id', $testItemId)
  83. ->where('is_frozen', false)
  84. ->sum('quantity');
  85. $frozenCountAfter = ItemUser::where('user_id', $testUserId)
  86. ->where('item_id', $testItemId)
  87. ->where('is_frozen', true)
  88. ->sum('quantity');
  89. echo " 未冻结物品数量: {$unfrozenCountAfter}\n";
  90. echo " 冻结物品数量: {$frozenCountAfter}\n";
  91. echo " 总数量: " . ($unfrozenCountAfter + $frozenCountAfter) . "\n";
  92. echo "\n6. 验证结果(第一次消耗)...\n";
  93. if ($unfrozenCountAfter == 100 && $frozenCountAfter == 0) {
  94. echo " ✅ 测试通过:优先消耗了冻结物品\n";
  95. } else {
  96. echo " ❌ 测试失败:没有优先消耗冻结物品\n";
  97. echo " 期望:未冻结=100,冻结=0\n";
  98. echo " 实际:未冻结={$unfrozenCountAfter},冻结={$frozenCountAfter}\n";
  99. }
  100. echo "\n7. 测试消耗超过冻结数量(消耗80个)...\n";
  101. // 再次消耗80个物品,应该消耗剩余的100个未冻结物品中的80个
  102. $consumeResult2 = ItemService::consumeItem(
  103. $testUserId,
  104. $testItemId,
  105. null,
  106. 80,
  107. [
  108. 'source_type' => 'test',
  109. 'source_id' => 4,
  110. 'include_frozen' => true
  111. ]
  112. );
  113. echo " 消耗80个物品: " . ($consumeResult2['success'] ? '成功' : '失败') . "\n";
  114. echo "\n8. 查看最终状态...\n";
  115. $unfrozenCountFinal = ItemUser::where('user_id', $testUserId)
  116. ->where('item_id', $testItemId)
  117. ->where('is_frozen', false)
  118. ->sum('quantity');
  119. $frozenCountFinal = ItemUser::where('user_id', $testUserId)
  120. ->where('item_id', $testItemId)
  121. ->where('is_frozen', true)
  122. ->sum('quantity');
  123. echo " 未冻结物品数量: {$unfrozenCountFinal}\n";
  124. echo " 冻结物品数量: {$frozenCountFinal}\n";
  125. echo " 总数量: " . ($unfrozenCountFinal + $frozenCountFinal) . "\n";
  126. echo "\n9. 验证最终结果...\n";
  127. if ($unfrozenCountFinal == 20 && $frozenCountFinal == 0) {
  128. echo " ✅ 测试通过:正确消耗了混合物品\n";
  129. } else {
  130. echo " ❌ 测试失败:混合消耗逻辑有问题\n";
  131. echo " 期望:未冻结=20,冻结=0\n";
  132. echo " 实际:未冻结={$unfrozenCountFinal},冻结={$frozenCountFinal}\n";
  133. }
  134. echo "\n10. 清理测试数据...\n";
  135. ItemUser::where('user_id', $testUserId)->delete();
  136. echo " 测试数据已清理\n";
  137. // 回滚事务,不保存测试数据
  138. throw new \Exception('测试完成,回滚事务');
  139. });
  140. } catch (\Exception $e) {
  141. if ($e->getMessage() === '测试完成,回滚事务') {
  142. echo "\n=== 测试完成 ===\n";
  143. } else {
  144. echo "\n❌ 测试出错: " . $e->getMessage() . "\n";
  145. echo "文件: " . $e->getFile() . "\n";
  146. echo "行号: " . $e->getLine() . "\n";
  147. }
  148. }