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, 100); echo " 添加100个物品成功\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, 40, 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 " 冻结40个物品成功,日志ID: {$freezeLogId2}\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. 部分消耗第一个冻结堆\n"; $consumeResult = ItemService::consumeItem( $userId, $itemId, null, 20, [ 'include_frozen' => true, 'source_type' => 'test_consume', 'source_id' => 67890 ] ); echo " 消耗20个冻结物品成功\n"; // 检查消耗后状态 echo "\n4. 检查消耗后的物品状态\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"; } // 现在状态应该是: // - 第一个冻结堆:10个(30-20) // - 第二个冻结堆:40个 // - 可用物品:30个 echo "\n5. 测试解冻第一个冻结堆(需要从第二个冻结堆补足)\n"; try { $unfreezeResult = ItemService::unfreezeItem($freezeLogId1); echo " 解冻成功: " . json_encode($unfreezeResult, JSON_UNESCAPED_UNICODE) . "\n"; echo " 补足差额: " . ($unfreezeResult['shortage_compensated'] ?? 0) . "\n"; // 检查解冻后状态 echo "\n6. 检查解冻后的物品状态\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"; // 验证逻辑是否正确 echo "\n7. 验证解冻逻辑\n"; if ($totalAvailable == 60) { // 30个原始可用 + 30个解冻后的 echo " ✅ 解冻逻辑正确:可用物品数量为60(30原始+30解冻)\n"; } else { echo " ❌ 解冻逻辑错误:可用物品数量应该为60,实际为 {$totalAvailable}\n"; } if ($totalFrozen == 20) { // 40个第二个冻结堆 - 20个用于补足 echo " ✅ 补足逻辑正确:剩余冻结物品数量为20(40-20补足)\n"; } else { echo " ❌ 补足逻辑错误:剩余冻结物品数量应该为20,实际为 {$totalFrozen}\n"; } } catch (Exception $e) { echo " 解冻失败: " . $e->getMessage() . "\n"; } echo "\n=== 测试完成 ===\n"; DB::rollback(); echo "已回滚测试数据\n"; } catch (Exception $e) { DB::rollback(); echo "测试失败: " . $e->getMessage() . "\n"; echo "堆栈跟踪: " . $e->getTraceAsString() . "\n"; }