|
|
@@ -0,0 +1,181 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+/**
|
|
|
+ * 手动测试脚本:验证解冻过程中的事件触发
|
|
|
+ *
|
|
|
+ * 测试ItemQuantityChanged事件是否正确触发
|
|
|
+ */
|
|
|
+
|
|
|
+require_once __DIR__ . '/../vendor/autoload.php';
|
|
|
+
|
|
|
+use App\Module\GameItems\Services\ItemService;
|
|
|
+use App\Module\GameItems\Enums\FREEZE_REASON_TYPE;
|
|
|
+use App\Module\GameItems\Events\ItemQuantityChanged;
|
|
|
+use Illuminate\Support\Facades\DB;
|
|
|
+use Illuminate\Support\Facades\Event;
|
|
|
+
|
|
|
+// 启动Laravel应用
|
|
|
+$app = require_once __DIR__ . '/../bootstrap/app.php';
|
|
|
+$app->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";
|
|
|
+}
|