make(Illuminate\Contracts\Console\Kernel::class)->bootstrap(); echo "=== 物品解冻BUG修复测试 ===\n\n"; try { DB::beginTransaction(); $userId = 1001; // 测试用户ID $itemId = 1; // 测试物品ID $freezeQuantity = 100; // 冻结数量 $consumeQuantity = 60; // 消耗数量 echo "1. 准备测试数据\n"; echo " 用户ID: {$userId}\n"; echo " 物品ID: {$itemId}\n"; echo " 冻结数量: {$freezeQuantity}\n"; echo " 消耗数量: {$consumeQuantity}\n\n"; // 确保用户有足够的物品 echo "2. 添加测试物品\n"; $addResult = ItemService::addItem($userId, $itemId, 300); // 增加到300,确保有足够的物品用于补足 echo " 添加结果: " . json_encode($addResult, JSON_UNESCAPED_UNICODE) . "\n\n"; // 冻结物品 echo "3. 冻结物品\n"; $freezeResult = ItemService::freezeItem( $userId, $itemId, null, // instanceId $freezeQuantity, FREEZE_REASON_TYPE::TRADE_ORDER->value, [ 'source_id' => 12345, 'source_type' => 'test_order', 'operator_id' => 1 ] ); echo " 冻结结果: " . json_encode($freezeResult, JSON_UNESCAPED_UNICODE) . "\n"; $freezeLogId = $freezeResult['frozen_items'][0]['freeze_log_id']; echo " 冻结日志ID: {$freezeLogId}\n\n"; // 消耗部分冻结物品 echo "4. 消耗部分冻结物品\n"; $consumeResult = ItemService::consumeItem( $userId, $itemId, null, // instanceId $consumeQuantity, [ 'include_frozen' => true, // 允许消耗冻结物品 'source_type' => 'test_consume', 'source_id' => 67890 ] ); echo " 消耗结果: " . json_encode($consumeResult, JSON_UNESCAPED_UNICODE) . "\n\n"; // 检查冻结物品当前状态 echo "5. 检查冻结物品当前状态\n"; $frozenItems = ItemService::getFrozenItems($userId, ['item_id' => $itemId]); echo " 冻结物品列表: " . json_encode($frozenItems, JSON_UNESCAPED_UNICODE) . "\n\n"; // 测试原始解冻方法(应该成功,因为还有剩余数量) echo "6. 测试原始解冻方法\n"; try { $unfreezeResult = ItemService::unfreezeItem($freezeLogId); echo " 原始解冻成功: " . json_encode($unfreezeResult, JSON_UNESCAPED_UNICODE) . "\n\n"; } catch (Exception $e) { echo " 原始解冻失败: " . $e->getMessage() . "\n\n"; } // 重新冻结用于测试完全消耗的情况 echo "7. 重新冻结剩余物品进行完全消耗测试\n"; $remainingQuantity = 40; // 100 - 60 = 40 $freezeResult2 = ItemService::freezeItem( $userId, $itemId, null, // instanceId $remainingQuantity, FREEZE_REASON_TYPE::TRADE_ORDER->value, [ 'source_id' => 12346, 'source_type' => 'test_order_2', 'operator_id' => 1 ] ); echo " 第二次冻结结果: " . json_encode($freezeResult2, JSON_UNESCAPED_UNICODE) . "\n"; $freezeLogId2 = $freezeResult2['frozen_items'][0]['freeze_log_id']; echo " 第二次冻结日志ID: {$freezeLogId2}\n\n"; // 完全消耗冻结物品 echo "8. 完全消耗冻结物品\n"; $consumeResult2 = ItemService::consumeItem( $userId, $itemId, null, // instanceId $remainingQuantity, [ 'include_frozen' => true, 'source_type' => 'test_consume_all', 'source_id' => 67891 ] ); echo " 完全消耗结果: " . json_encode($consumeResult2, JSON_UNESCAPED_UNICODE) . "\n\n"; // 测试原始解冻方法(应该失败) echo "9. 测试原始解冻方法(完全消耗后)\n"; try { $unfreezeResult = ItemService::unfreezeItem($freezeLogId2); echo " 原始解冻成功: " . json_encode($unfreezeResult, JSON_UNESCAPED_UNICODE) . "\n\n"; } catch (Exception $e) { echo " 原始解冻失败(预期): " . $e->getMessage() . "\n\n"; } // 测试安全解冻方法(应该成功处理) echo "10. 测试安全解冻方法(完全消耗后)\n"; try { $safeUnfreezeResult = ItemService::safeUnfreezeItem($freezeLogId2); echo " 安全解冻成功: " . json_encode($safeUnfreezeResult, JSON_UNESCAPED_UNICODE) . "\n\n"; } catch (Exception $e) { echo " 安全解冻失败: " . $e->getMessage() . "\n\n"; } // 测试统计功能 echo "11. 测试已消耗冻结物品统计\n"; $statistics = ItemService::getConsumedFrozenItemsStatistics($userId); echo " 统计结果: " . json_encode($statistics, JSON_UNESCAPED_UNICODE) . "\n\n"; echo "=== 测试完成 ===\n"; DB::rollback(); // 回滚测试数据 echo "已回滚测试数据\n"; } catch (Exception $e) { DB::rollback(); echo "测试失败: " . $e->getMessage() . "\n"; echo "堆栈跟踪: " . $e->getTraceAsString() . "\n"; }