manual_cancel_test.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <?php
  2. /**
  3. * 手动测试取消订单的解冻功能
  4. *
  5. * 使用方法:
  6. * php artisan tinker
  7. * include 'app/Module/Mex/Tests/manual_cancel_test.php';
  8. */
  9. use App\Module\Fund\Enums\FUND_CURRENCY_TYPE;
  10. use App\Module\GameItems\Enums\FREEZE_ACTION_TYPE;
  11. use App\Module\GameItems\Models\ItemFreezeLog;
  12. use App\Module\GameItems\Models\ItemUser;
  13. use App\Module\Mex\Enums\OrderStatus;
  14. use App\Module\Mex\Models\MexOrder;
  15. use App\Module\Mex\Services\MexOrderService;
  16. echo "=== 农贸市场订单取消解冻功能测试 ===\n";
  17. // 测试参数
  18. $testUserId = 1001;
  19. $testItemId = 10001;
  20. try {
  21. // 1. 准备测试数据
  22. echo "1. 准备测试数据...\n";
  23. // 清理旧数据
  24. ItemUser::where('user_id', $testUserId)->where('item_id', $testItemId)->delete();
  25. MexOrder::where('user_id', $testUserId)->where('item_id', $testItemId)->delete();
  26. ItemFreezeLog::where('user_id', $testUserId)->where('item_id', $testItemId)->delete();
  27. // 创建测试用户物品
  28. $userItem = ItemUser::create([
  29. 'user_id' => $testUserId,
  30. 'item_id' => $testItemId,
  31. 'instance_id' => null,
  32. 'quantity' => 100,
  33. 'is_frozen' => false,
  34. 'expire_at' => now()->addDays(30),
  35. ]);
  36. echo " 创建用户物品: 用户{$testUserId}, 物品{$testItemId}, 数量100\n";
  37. // 创建价格配置
  38. \App\Module\Mex\Models\MexPriceConfig::updateOrCreate(
  39. ['item_id' => $testItemId],
  40. [
  41. 'min_price' => 1.0,
  42. 'max_price' => 100.0,
  43. 'protection_threshold' => 10,
  44. 'is_enabled' => true,
  45. ]
  46. );
  47. echo " 创建价格配置: 物品{$testItemId}\n";
  48. // 2. 创建卖出订单(会冻结物品)
  49. echo "\n2. 创建卖出订单...\n";
  50. $createResult = \DB::transaction(function () use ($testUserId, $testItemId) {
  51. return \App\Module\Mex\Logic\MexOrderLogic::createSellOrder(
  52. $testUserId,
  53. $testItemId,
  54. 20,
  55. 10.5,
  56. FUND_CURRENCY_TYPE::FUND2
  57. );
  58. });
  59. if (!$createResult['success']) {
  60. throw new Exception('创建卖出订单失败:' . $createResult['message']);
  61. }
  62. $orderId = $createResult['order_id'];
  63. echo " 订单创建成功,订单ID: {$orderId}\n";
  64. // 3. 验证物品已被冻结
  65. echo "\n3. 验证物品冻结状态...\n";
  66. $frozenItems = ItemUser::where('user_id', $testUserId)
  67. ->where('item_id', $testItemId)
  68. ->where('is_frozen', true)
  69. ->get();
  70. echo " 冻结物品数量: " . $frozenItems->count() . "\n";
  71. foreach ($frozenItems as $item) {
  72. echo " - 冻结物品ID: {$item->id}, 数量: {$item->quantity}, 冻结日志ID: {$item->frozen_log_id}\n";
  73. }
  74. // 验证冻结记录
  75. $freezeLog = ItemFreezeLog::where('source_id', $orderId)
  76. ->where('source_type', 'mex_sell_order')
  77. ->where('action_type', FREEZE_ACTION_TYPE::FREEZE)
  78. ->first();
  79. if ($freezeLog) {
  80. echo " 冻结记录存在: ID {$freezeLog->id}, 数量 {$freezeLog->quantity}\n";
  81. } else {
  82. echo " 警告:未找到冻结记录\n";
  83. }
  84. // 4. 取消订单
  85. echo "\n4. 取消订单...\n";
  86. $cancelResult = MexOrderService::cancelOrder($testUserId, $orderId);
  87. if (!$cancelResult['success']) {
  88. throw new Exception('取消订单失败:' . $cancelResult['message']);
  89. }
  90. echo " 订单取消成功: " . $cancelResult['message'] . "\n";
  91. // 5. 验证订单状态
  92. echo "\n5. 验证订单状态...\n";
  93. $order = MexOrder::find($orderId);
  94. echo " 订单状态: " . $order->status->name . "\n";
  95. // 6. 验证物品解冻状态
  96. echo "\n6. 验证物品解冻状态...\n";
  97. $frozenItemsAfter = ItemUser::where('user_id', $testUserId)
  98. ->where('item_id', $testItemId)
  99. ->where('is_frozen', true)
  100. ->get();
  101. echo " 取消后冻结物品数量: " . $frozenItemsAfter->count() . "\n";
  102. $availableItems = ItemUser::where('user_id', $testUserId)
  103. ->where('item_id', $testItemId)
  104. ->where('is_frozen', false)
  105. ->get();
  106. echo " 可用物品数量: " . $availableItems->count() . "\n";
  107. foreach ($availableItems as $item) {
  108. echo " - 可用物品ID: {$item->id}, 数量: {$item->quantity}\n";
  109. }
  110. // 验证解冻记录
  111. $unfreezeLog = ItemFreezeLog::where('source_id', $orderId)
  112. ->where('source_type', 'mex_sell_order')
  113. ->where('action_type', FREEZE_ACTION_TYPE::UNFREEZE)
  114. ->first();
  115. if ($unfreezeLog) {
  116. echo " 解冻记录存在: ID {$unfreezeLog->id}, 数量 {$unfreezeLog->quantity}\n";
  117. } else {
  118. echo " 警告:未找到解冻记录\n";
  119. }
  120. // 7. 总结
  121. echo "\n=== 测试结果总结 ===\n";
  122. $totalAvailable = ItemUser::where('user_id', $testUserId)
  123. ->where('item_id', $testItemId)
  124. ->where('is_frozen', false)
  125. ->sum('quantity');
  126. $totalFrozen = ItemUser::where('user_id', $testUserId)
  127. ->where('item_id', $testItemId)
  128. ->where('is_frozen', true)
  129. ->sum('quantity');
  130. echo "用户 {$testUserId} 物品 {$testItemId} 状态:\n";
  131. echo "- 可用数量: {$totalAvailable}\n";
  132. echo "- 冻结数量: {$totalFrozen}\n";
  133. echo "- 总数量: " . ($totalAvailable + $totalFrozen) . "\n";
  134. if ($totalFrozen == 0 && $totalAvailable >= 80) { // 原来100,冻结20,取消后应该恢复
  135. echo "✅ 测试通过:物品已正确解冻\n";
  136. } else {
  137. echo "❌ 测试失败:物品解冻不正确\n";
  138. }
  139. } catch (Exception $e) {
  140. echo "❌ 测试失败:" . $e->getMessage() . "\n";
  141. echo "错误堆栈:\n" . $e->getTraceAsString() . "\n";
  142. }
  143. echo "\n=== 测试完成 ===\n";