make(Illuminate\Contracts\Console\Kernel::class)->bootstrap(); echo "=== 物品解冻事件触发测试 ===\n\n"; // 记录触发的事件 $triggeredEvents = []; // 监听ItemQuantityChanged事件 Event::listen(ItemQuantityChanged::class, function ($event) use (&$triggeredEvents) { $triggeredEvents[] = [ 'user_id' => $event->userId, 'item_id' => $event->itemId, 'instance_id' => $event->instanceId, 'old_quantity' => $event->oldQuantity, 'new_quantity' => $event->newQuantity, 'user_item_id' => $event->userItemId, 'old_frozen_status' => $event->oldFrozenStatus, 'new_frozen_status' => $event->newFrozenStatus, 'options' => $event->options, ]; }); try { DB::beginTransaction(); $userId = 1001; $itemId = 1; $freezeQuantity = 100; $consumeQuantity = 60; echo "1. 准备测试数据\n"; // 添加物品 $addResult = ItemService::addItem($userId, $itemId, 300); echo " 添加物品事件数量: " . count($triggeredEvents) . "\n"; $triggeredEvents = []; // 清空事件记录 // 冻结物品 echo "\n2. 冻结物品\n"; $freezeResult = ItemService::freezeItem( $userId, $itemId, null, $freezeQuantity, FREEZE_REASON_TYPE::TRADE_ORDER->value, [ 'source_id' => 12345, 'source_type' => 'test_order', 'operator_id' => 1 ] ); $freezeLogId = $freezeResult['frozen_items'][0]['freeze_log_id']; echo " 冻结操作事件数量: " . count($triggeredEvents) . "\n"; foreach ($triggeredEvents as $i => $event) { echo " 事件 " . ($i + 1) . ": 用户物品ID={$event['user_item_id']}, 数量变化={$event['old_quantity']}→{$event['new_quantity']}, 冻结状态={$event['old_frozen_status']}→{$event['new_frozen_status']}\n"; if (isset($event['options']['action'])) { echo " 动作: {$event['options']['action']}\n"; } } $triggeredEvents = []; // 清空事件记录 // 消耗部分冻结物品 echo "\n3. 消耗部分冻结物品\n"; $consumeResult = ItemService::consumeItem( $userId, $itemId, null, $consumeQuantity, [ 'include_frozen' => true, 'source_type' => 'test_consume', 'source_id' => 67890 ] ); echo " 消耗操作事件数量: " . count($triggeredEvents) . "\n"; foreach ($triggeredEvents as $i => $event) { echo " 事件 " . ($i + 1) . ": 用户物品ID={$event['user_item_id']}, 数量变化={$event['old_quantity']}→{$event['new_quantity']}, 冻结状态={$event['old_frozen_status']}→{$event['new_frozen_status']}\n"; } $triggeredEvents = []; // 清空事件记录 // 测试原始解冻方法 echo "\n4. 测试原始解冻方法(应该触发补足事件)\n"; try { $unfreezeResult = ItemService::unfreezeItem($freezeLogId); echo " 解冻操作事件数量: " . count($triggeredEvents) . "\n"; foreach ($triggeredEvents as $i => $event) { echo " 事件 " . ($i + 1) . ": 用户物品ID={$event['user_item_id']}, 数量变化={$event['old_quantity']}→{$event['new_quantity']}, 冻结状态={$event['old_frozen_status']}→{$event['new_frozen_status']}\n"; if (isset($event['options']['action'])) { echo " 动作: {$event['options']['action']}\n"; } if (isset($event['options']['transferred_quantity'])) { echo " 转移数量: {$event['options']['transferred_quantity']}\n"; } } echo " 解冻成功,补足差额: " . ($unfreezeResult['shortage_compensated'] ?? 0) . "\n"; } catch (Exception $e) { echo " 解冻失败: " . $e->getMessage() . "\n"; } $triggeredEvents = []; // 清空事件记录 // 重新冻结并完全消耗,测试安全解冻 echo "\n5. 重新冻结并完全消耗,测试安全解冻\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']; $triggeredEvents = []; // 清空冻结事件记录 // 完全消耗 $consumeResult2 = ItemService::consumeItem( $userId, $itemId, null, 40, [ 'include_frozen' => true, 'source_type' => 'test_consume_all', 'source_id' => 67891 ] ); $triggeredEvents = []; // 清空消耗事件记录 // 测试安全解冻 echo " 测试安全解冻方法(应该触发补足事件)\n"; try { $safeUnfreezeResult = ItemService::safeUnfreezeItem($freezeLogId2); echo " 安全解冻操作事件数量: " . count($triggeredEvents) . "\n"; foreach ($triggeredEvents as $i => $event) { echo " 事件 " . ($i + 1) . ": 用户物品ID={$event['user_item_id']}, 数量变化={$event['old_quantity']}→{$event['new_quantity']}, 冻结状态={$event['old_frozen_status']}→{$event['new_frozen_status']}\n"; if (isset($event['options']['action'])) { echo " 动作: {$event['options']['action']}\n"; } if (isset($event['options']['transferred_quantity'])) { echo " 转移数量: {$event['options']['transferred_quantity']}\n"; } if (isset($event['options']['compensated_quantity'])) { echo " 补足数量: {$event['options']['compensated_quantity']}\n"; } } echo " 安全解冻结果: " . json_encode($safeUnfreezeResult, JSON_UNESCAPED_UNICODE) . "\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"; }