| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- <?php
- /**
- * 手动测试脚本:验证重写的安全解冻方法
- *
- * 测试安全解冻的两个分支:无需补足和需要补足
- */
- require_once __DIR__ . '/../vendor/autoload.php';
- use App\Module\GameItems\Services\ItemService;
- use App\Module\GameItems\Enums\FREEZE_REASON_TYPE;
- use Illuminate\Support\Facades\DB;
- // 启动Laravel应用
- $app = require_once __DIR__ . '/../bootstrap/app.php';
- $app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
- echo "=== 安全解冻方法重写验证测试 ===\n\n";
- try {
- DB::beginTransaction();
-
- $userId = 1001;
- $itemId = 1;
-
- echo "1. 准备测试数据\n";
-
- // 添加物品
- $addResult = ItemService::addItem($userId, $itemId, 150);
- echo " 添加150个物品成功\n";
-
- // 冻结第一批物品(用于测试无需补足)
- $freezeResult1 = ItemService::freezeItem(
- $userId,
- $itemId,
- null,
- 30,
- FREEZE_REASON_TYPE::TRADE_ORDER->value,
- [
- 'source_id' => 12345,
- 'source_type' => 'test_order_1',
- 'operator_id' => 1
- ]
- );
- $freezeLogId1 = $freezeResult1['frozen_items'][0]['freeze_log_id'];
- echo " 冻结30个物品成功,日志ID: {$freezeLogId1}\n";
-
- // 冻结第二批物品(用于测试需要补足)
- $freezeResult2 = ItemService::freezeItem(
- $userId,
- $itemId,
- null,
- 50,
- FREEZE_REASON_TYPE::TRADE_ORDER->value,
- [
- 'source_id' => 12346,
- 'source_type' => 'test_order_2',
- 'operator_id' => 1
- ]
- );
- $freezeLogId2 = $freezeResult2['frozen_items'][0]['freeze_log_id'];
- echo " 冻结50个物品成功,日志ID: {$freezeLogId2}\n";
-
- // 冻结第三批物品(用于作为补足来源)
- $freezeResult3 = ItemService::freezeItem(
- $userId,
- $itemId,
- null,
- 40,
- FREEZE_REASON_TYPE::TRADE_ORDER->value,
- [
- 'source_id' => 12347,
- 'source_type' => 'test_order_3',
- 'operator_id' => 1
- ]
- );
- $freezeLogId3 = $freezeResult3['frozen_items'][0]['freeze_log_id'];
- echo " 冻结40个物品成功,日志ID: {$freezeLogId3}\n";
-
- // 检查当前状态
- echo "\n2. 检查冻结后的物品状态\n";
- $userItems = DB::table('item_users')
- ->where('user_id', $userId)
- ->where('item_id', $itemId)
- ->get();
-
- foreach ($userItems as $item) {
- $frozenStatus = $item->is_frozen ? '冻结' : '可用';
- $freezeLogId = $item->frozen_log_id ?? 'N/A';
- echo " 物品堆ID: {$item->id}, 数量: {$item->quantity}, 状态: {$frozenStatus}, 冻结日志: {$freezeLogId}\n";
- }
-
- echo "\n3. 测试分支A:无需补足的安全解冻\n";
-
- // 第一个冻结堆没有被消耗,直接解冻
- try {
- $safeUnfreezeResult1 = ItemService::safeUnfreezeItem($freezeLogId1);
- echo " 安全解冻成功: " . json_encode($safeUnfreezeResult1, JSON_UNESCAPED_UNICODE) . "\n";
- echo " 补足差额: " . ($safeUnfreezeResult1['shortage_compensated'] ?? 0) . "\n";
-
- if ($safeUnfreezeResult1['shortage_compensated'] == 0) {
- echo " ✅ 分支A测试通过:无需补足\n";
- } else {
- echo " ❌ 分支A测试失败:不应该有补足\n";
- }
- } catch (Exception $e) {
- echo " ❌ 分支A测试失败: " . $e->getMessage() . "\n";
- }
-
- echo "\n4. 测试分支B:需要补足的安全解冻\n";
-
- // 部分消耗第二个冻结堆
- $consumeResult = ItemService::consumeItem(
- $userId,
- $itemId,
- null,
- 30,
- [
- 'include_frozen' => true,
- 'source_type' => 'test_consume',
- 'source_id' => 67890
- ]
- );
- echo " 消耗30个冻结物品成功\n";
-
- // 检查消耗后状态
- echo " 消耗后物品状态:\n";
- $userItemsAfter = DB::table('item_users')
- ->where('user_id', $userId)
- ->where('item_id', $itemId)
- ->get();
-
- foreach ($userItemsAfter as $item) {
- $frozenStatus = $item->is_frozen ? '冻结' : '可用';
- $freezeLogId = $item->frozen_log_id ?? 'N/A';
- echo " 物品堆ID: {$item->id}, 数量: {$item->quantity}, 状态: {$frozenStatus}, 冻结日志: {$freezeLogId}\n";
- }
-
- // 现在第二个冻结堆应该只有20个(50-30),需要从第三个冻结堆补足30个
- try {
- $safeUnfreezeResult2 = ItemService::safeUnfreezeItem($freezeLogId2);
- echo " 安全解冻成功: " . json_encode($safeUnfreezeResult2, JSON_UNESCAPED_UNICODE) . "\n";
- echo " 补足差额: " . ($safeUnfreezeResult2['shortage_compensated'] ?? 0) . "\n";
-
- if ($safeUnfreezeResult2['shortage_compensated'] == 30) {
- echo " ✅ 分支B测试通过:正确补足30个\n";
- } else {
- echo " ❌ 分支B测试失败:应该补足30个,实际补足 " . ($safeUnfreezeResult2['shortage_compensated'] ?? 0) . "\n";
- }
-
- if ($safeUnfreezeResult2['unfrozen_quantity'] == 50) {
- echo " ✅ 解冻数量正确:50个\n";
- } else {
- echo " ❌ 解冻数量错误:应该50个,实际 " . ($safeUnfreezeResult2['unfrozen_quantity'] ?? 0) . "\n";
- }
- } catch (Exception $e) {
- echo " ❌ 分支B测试失败: " . $e->getMessage() . "\n";
- }
-
- echo "\n5. 检查最终物品状态\n";
- $userItemsFinal = DB::table('item_users')
- ->where('user_id', $userId)
- ->where('item_id', $itemId)
- ->get();
-
- $totalAvailable = 0;
- $totalFrozen = 0;
-
- foreach ($userItemsFinal as $item) {
- $frozenStatus = $item->is_frozen ? '冻结' : '可用';
- $freezeLogId = $item->frozen_log_id ?? 'N/A';
- echo " 物品堆ID: {$item->id}, 数量: {$item->quantity}, 状态: {$frozenStatus}, 冻结日志: {$freezeLogId}\n";
-
- if ($item->is_frozen) {
- $totalFrozen += $item->quantity;
- } else {
- $totalAvailable += $item->quantity;
- }
- }
-
- echo " 总计:可用 {$totalAvailable},冻结 {$totalFrozen}\n";
-
- // 验证数量守恒
- $totalQuantity = $totalAvailable + $totalFrozen;
- if ($totalQuantity == 120) { // 150 - 30(消耗) = 120
- echo " ✅ 数量守恒正确:总数量120(150-30消耗)\n";
- } else {
- echo " ❌ 数量守恒错误:总数量应该120,实际 {$totalQuantity}\n";
- }
-
- echo "\n6. 测试完全消耗的情况\n";
-
- // 完全消耗第三个冻结堆
- $consumeResult2 = ItemService::consumeItem(
- $userId,
- $itemId,
- null,
- 10, // 第三个冻结堆现在应该只有10个(40-30补足)
- [
- 'include_frozen' => true,
- 'source_type' => 'test_consume_all',
- 'source_id' => 67891
- ]
- );
- echo " 完全消耗第三个冻结堆成功\n";
-
- // 尝试解冻第三个冻结堆(应该失败,因为没有其他冻结堆可以补足)
- try {
- $safeUnfreezeResult3 = ItemService::safeUnfreezeItem($freezeLogId3);
- echo " ❌ 意外成功: " . json_encode($safeUnfreezeResult3, JSON_UNESCAPED_UNICODE) . "\n";
- } catch (Exception $e) {
- echo " ✅ 预期失败: " . $e->getMessage() . "\n";
- }
-
- echo "\n=== 测试完成 ===\n";
- echo "安全解冻方法重写验证完成,两个分支逻辑正确\n";
-
- DB::rollback();
- echo "已回滚测试数据\n";
-
- } catch (Exception $e) {
- DB::rollback();
- echo "测试失败: " . $e->getMessage() . "\n";
- echo "堆栈跟踪: " . $e->getTraceAsString() . "\n";
- }
|