manual_test_unfreeze_events.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <?php
  2. /**
  3. * 手动测试脚本:验证解冻过程中的事件触发
  4. *
  5. * 测试ItemQuantityChanged事件是否正确触发
  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 App\Module\GameItems\Events\ItemQuantityChanged;
  11. use Illuminate\Support\Facades\DB;
  12. use Illuminate\Support\Facades\Event;
  13. // 启动Laravel应用
  14. $app = require_once __DIR__ . '/../bootstrap/app.php';
  15. $app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
  16. echo "=== 物品解冻事件触发测试 ===\n\n";
  17. // 记录触发的事件
  18. $triggeredEvents = [];
  19. // 监听ItemQuantityChanged事件
  20. Event::listen(ItemQuantityChanged::class, function ($event) use (&$triggeredEvents) {
  21. $triggeredEvents[] = [
  22. 'user_id' => $event->userId,
  23. 'item_id' => $event->itemId,
  24. 'instance_id' => $event->instanceId,
  25. 'old_quantity' => $event->oldQuantity,
  26. 'new_quantity' => $event->newQuantity,
  27. 'user_item_id' => $event->userItemId,
  28. 'old_frozen_status' => $event->oldFrozenStatus,
  29. 'new_frozen_status' => $event->newFrozenStatus,
  30. 'options' => $event->options,
  31. ];
  32. });
  33. try {
  34. DB::beginTransaction();
  35. $userId = 1001;
  36. $itemId = 1;
  37. $freezeQuantity = 100;
  38. $consumeQuantity = 60;
  39. echo "1. 准备测试数据\n";
  40. // 添加物品
  41. $addResult = ItemService::addItem($userId, $itemId, 300);
  42. echo " 添加物品事件数量: " . count($triggeredEvents) . "\n";
  43. $triggeredEvents = []; // 清空事件记录
  44. // 冻结物品
  45. echo "\n2. 冻结物品\n";
  46. $freezeResult = ItemService::freezeItem(
  47. $userId,
  48. $itemId,
  49. null,
  50. $freezeQuantity,
  51. FREEZE_REASON_TYPE::TRADE_ORDER->value,
  52. [
  53. 'source_id' => 12345,
  54. 'source_type' => 'test_order',
  55. 'operator_id' => 1
  56. ]
  57. );
  58. $freezeLogId = $freezeResult['frozen_items'][0]['freeze_log_id'];
  59. echo " 冻结操作事件数量: " . count($triggeredEvents) . "\n";
  60. foreach ($triggeredEvents as $i => $event) {
  61. echo " 事件 " . ($i + 1) . ": 用户物品ID={$event['user_item_id']}, 数量变化={$event['old_quantity']}→{$event['new_quantity']}, 冻结状态={$event['old_frozen_status']}→{$event['new_frozen_status']}\n";
  62. if (isset($event['options']['action'])) {
  63. echo " 动作: {$event['options']['action']}\n";
  64. }
  65. }
  66. $triggeredEvents = []; // 清空事件记录
  67. // 消耗部分冻结物品
  68. echo "\n3. 消耗部分冻结物品\n";
  69. $consumeResult = ItemService::consumeItem(
  70. $userId,
  71. $itemId,
  72. null,
  73. $consumeQuantity,
  74. [
  75. 'include_frozen' => true,
  76. 'source_type' => 'test_consume',
  77. 'source_id' => 67890
  78. ]
  79. );
  80. echo " 消耗操作事件数量: " . count($triggeredEvents) . "\n";
  81. foreach ($triggeredEvents as $i => $event) {
  82. echo " 事件 " . ($i + 1) . ": 用户物品ID={$event['user_item_id']}, 数量变化={$event['old_quantity']}→{$event['new_quantity']}, 冻结状态={$event['old_frozen_status']}→{$event['new_frozen_status']}\n";
  83. }
  84. $triggeredEvents = []; // 清空事件记录
  85. // 测试原始解冻方法
  86. echo "\n4. 测试原始解冻方法(应该触发补足事件)\n";
  87. try {
  88. $unfreezeResult = ItemService::unfreezeItem($freezeLogId);
  89. echo " 解冻操作事件数量: " . count($triggeredEvents) . "\n";
  90. foreach ($triggeredEvents as $i => $event) {
  91. echo " 事件 " . ($i + 1) . ": 用户物品ID={$event['user_item_id']}, 数量变化={$event['old_quantity']}→{$event['new_quantity']}, 冻结状态={$event['old_frozen_status']}→{$event['new_frozen_status']}\n";
  92. if (isset($event['options']['action'])) {
  93. echo " 动作: {$event['options']['action']}\n";
  94. }
  95. if (isset($event['options']['transferred_quantity'])) {
  96. echo " 转移数量: {$event['options']['transferred_quantity']}\n";
  97. }
  98. }
  99. echo " 解冻成功,补足差额: " . ($unfreezeResult['shortage_compensated'] ?? 0) . "\n";
  100. } catch (Exception $e) {
  101. echo " 解冻失败: " . $e->getMessage() . "\n";
  102. }
  103. $triggeredEvents = []; // 清空事件记录
  104. // 重新冻结并完全消耗,测试安全解冻
  105. echo "\n5. 重新冻结并完全消耗,测试安全解冻\n";
  106. $freezeResult2 = ItemService::freezeItem(
  107. $userId,
  108. $itemId,
  109. null,
  110. 40,
  111. FREEZE_REASON_TYPE::TRADE_ORDER->value,
  112. [
  113. 'source_id' => 12346,
  114. 'source_type' => 'test_order_2',
  115. 'operator_id' => 1
  116. ]
  117. );
  118. $freezeLogId2 = $freezeResult2['frozen_items'][0]['freeze_log_id'];
  119. $triggeredEvents = []; // 清空冻结事件记录
  120. // 完全消耗
  121. $consumeResult2 = ItemService::consumeItem(
  122. $userId,
  123. $itemId,
  124. null,
  125. 40,
  126. [
  127. 'include_frozen' => true,
  128. 'source_type' => 'test_consume_all',
  129. 'source_id' => 67891
  130. ]
  131. );
  132. $triggeredEvents = []; // 清空消耗事件记录
  133. // 测试安全解冻
  134. echo " 测试安全解冻方法(应该触发补足事件)\n";
  135. try {
  136. $safeUnfreezeResult = ItemService::safeUnfreezeItem($freezeLogId2);
  137. echo " 安全解冻操作事件数量: " . count($triggeredEvents) . "\n";
  138. foreach ($triggeredEvents as $i => $event) {
  139. echo " 事件 " . ($i + 1) . ": 用户物品ID={$event['user_item_id']}, 数量变化={$event['old_quantity']}→{$event['new_quantity']}, 冻结状态={$event['old_frozen_status']}→{$event['new_frozen_status']}\n";
  140. if (isset($event['options']['action'])) {
  141. echo " 动作: {$event['options']['action']}\n";
  142. }
  143. if (isset($event['options']['transferred_quantity'])) {
  144. echo " 转移数量: {$event['options']['transferred_quantity']}\n";
  145. }
  146. if (isset($event['options']['compensated_quantity'])) {
  147. echo " 补足数量: {$event['options']['compensated_quantity']}\n";
  148. }
  149. }
  150. echo " 安全解冻结果: " . json_encode($safeUnfreezeResult, JSON_UNESCAPED_UNICODE) . "\n";
  151. } catch (Exception $e) {
  152. echo " 安全解冻失败: " . $e->getMessage() . "\n";
  153. }
  154. echo "\n=== 测试完成 ===\n";
  155. DB::rollback();
  156. echo "已回滚测试数据\n";
  157. } catch (Exception $e) {
  158. DB::rollback();
  159. echo "测试失败: " . $e->getMessage() . "\n";
  160. echo "堆栈跟踪: " . $e->getTraceAsString() . "\n";
  161. }