|
|
@@ -0,0 +1,176 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+/**
|
|
|
+ * 手动测试脚本:验证物品消耗优先冻结物品的逻辑
|
|
|
+ *
|
|
|
+ * 使用方法:
|
|
|
+ * php tests/manual_test_consume_frozen_priority.php
|
|
|
+ */
|
|
|
+
|
|
|
+require_once __DIR__ . '/../vendor/autoload.php';
|
|
|
+
|
|
|
+use App\Module\GameItems\Services\ItemService;
|
|
|
+use App\Module\GameItems\Models\ItemUser;
|
|
|
+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::transaction(function () {
|
|
|
+ $testUserId = 99999; // 测试用户ID
|
|
|
+ $testItemId = 1; // 测试物品ID
|
|
|
+
|
|
|
+ echo "1. 清理测试数据...\n";
|
|
|
+ // 清理测试数据
|
|
|
+ ItemUser::where('user_id', $testUserId)->delete();
|
|
|
+
|
|
|
+ echo "2. 添加测试物品...\n";
|
|
|
+ // 添加100个未冻结物品
|
|
|
+ $result1 = ItemService::addItem($testUserId, $testItemId, 100, [
|
|
|
+ 'source_type' => 'test',
|
|
|
+ 'source_id' => 1,
|
|
|
+ ]);
|
|
|
+ echo " 添加100个未冻结物品: " . ($result1['success'] ? '成功' : '失败') . "\n";
|
|
|
+
|
|
|
+ // 添加50个物品并冻结
|
|
|
+ $result2 = ItemService::addItem($testUserId, $testItemId, 50, [
|
|
|
+ 'source_type' => 'test',
|
|
|
+ 'source_id' => 2,
|
|
|
+ ]);
|
|
|
+ echo " 添加50个物品: " . ($result2['success'] ? '成功' : '失败') . "\n";
|
|
|
+
|
|
|
+ // 冻结50个物品
|
|
|
+ $freezeResult = ItemService::freezeItem(
|
|
|
+ $testUserId,
|
|
|
+ $testItemId,
|
|
|
+ null,
|
|
|
+ 50,
|
|
|
+ '测试冻结',
|
|
|
+ [
|
|
|
+ 'reason_type' => FREEZE_REASON_TYPE::TRADE_ORDER->value,
|
|
|
+ 'source_id' => 1,
|
|
|
+ 'source_type' => 'test',
|
|
|
+ ]
|
|
|
+ );
|
|
|
+ echo " 冻结50个物品: " . ($freezeResult['success'] ? '成功' : '失败') . "\n";
|
|
|
+
|
|
|
+ echo "\n3. 查看初始状态...\n";
|
|
|
+ $unfrozenCount = ItemUser::where('user_id', $testUserId)
|
|
|
+ ->where('item_id', $testItemId)
|
|
|
+ ->where('is_frozen', false)
|
|
|
+ ->sum('quantity');
|
|
|
+
|
|
|
+ $frozenCount = ItemUser::where('user_id', $testUserId)
|
|
|
+ ->where('item_id', $testItemId)
|
|
|
+ ->where('is_frozen', true)
|
|
|
+ ->sum('quantity');
|
|
|
+
|
|
|
+ echo " 未冻结物品数量: {$unfrozenCount}\n";
|
|
|
+ echo " 冻结物品数量: {$frozenCount}\n";
|
|
|
+ echo " 总数量: " . ($unfrozenCount + $frozenCount) . "\n";
|
|
|
+
|
|
|
+ echo "\n4. 测试优先消耗冻结物品(消耗50个)...\n";
|
|
|
+ // 消耗50个物品,应该优先消耗冻结的50个物品
|
|
|
+ $consumeResult = ItemService::consumeItem(
|
|
|
+ $testUserId,
|
|
|
+ $testItemId,
|
|
|
+ null,
|
|
|
+ 50,
|
|
|
+ [
|
|
|
+ 'source_type' => 'test',
|
|
|
+ 'source_id' => 3,
|
|
|
+ 'include_frozen' => true
|
|
|
+ ]
|
|
|
+ );
|
|
|
+
|
|
|
+ echo " 消耗50个物品: " . ($consumeResult['success'] ? '成功' : '失败') . "\n";
|
|
|
+ if (!$consumeResult['success']) {
|
|
|
+ echo " 错误信息: " . ($consumeResult['message'] ?? '未知错误') . "\n";
|
|
|
+ }
|
|
|
+
|
|
|
+ echo "\n5. 查看消耗后状态...\n";
|
|
|
+ $unfrozenCountAfter = ItemUser::where('user_id', $testUserId)
|
|
|
+ ->where('item_id', $testItemId)
|
|
|
+ ->where('is_frozen', false)
|
|
|
+ ->sum('quantity');
|
|
|
+
|
|
|
+ $frozenCountAfter = ItemUser::where('user_id', $testUserId)
|
|
|
+ ->where('item_id', $testItemId)
|
|
|
+ ->where('is_frozen', true)
|
|
|
+ ->sum('quantity');
|
|
|
+
|
|
|
+ echo " 未冻结物品数量: {$unfrozenCountAfter}\n";
|
|
|
+ echo " 冻结物品数量: {$frozenCountAfter}\n";
|
|
|
+ echo " 总数量: " . ($unfrozenCountAfter + $frozenCountAfter) . "\n";
|
|
|
+
|
|
|
+ echo "\n6. 验证结果(第一次消耗)...\n";
|
|
|
+ if ($unfrozenCountAfter == 100 && $frozenCountAfter == 0) {
|
|
|
+ echo " ✅ 测试通过:优先消耗了冻结物品\n";
|
|
|
+ } else {
|
|
|
+ echo " ❌ 测试失败:没有优先消耗冻结物品\n";
|
|
|
+ echo " 期望:未冻结=100,冻结=0\n";
|
|
|
+ echo " 实际:未冻结={$unfrozenCountAfter},冻结={$frozenCountAfter}\n";
|
|
|
+ }
|
|
|
+
|
|
|
+ echo "\n7. 测试消耗超过冻结数量(消耗80个)...\n";
|
|
|
+ // 再次消耗80个物品,应该消耗剩余的100个未冻结物品中的80个
|
|
|
+ $consumeResult2 = ItemService::consumeItem(
|
|
|
+ $testUserId,
|
|
|
+ $testItemId,
|
|
|
+ null,
|
|
|
+ 80,
|
|
|
+ [
|
|
|
+ 'source_type' => 'test',
|
|
|
+ 'source_id' => 4,
|
|
|
+ 'include_frozen' => true
|
|
|
+ ]
|
|
|
+ );
|
|
|
+
|
|
|
+ echo " 消耗80个物品: " . ($consumeResult2['success'] ? '成功' : '失败') . "\n";
|
|
|
+
|
|
|
+ echo "\n8. 查看最终状态...\n";
|
|
|
+ $unfrozenCountFinal = ItemUser::where('user_id', $testUserId)
|
|
|
+ ->where('item_id', $testItemId)
|
|
|
+ ->where('is_frozen', false)
|
|
|
+ ->sum('quantity');
|
|
|
+
|
|
|
+ $frozenCountFinal = ItemUser::where('user_id', $testUserId)
|
|
|
+ ->where('item_id', $testItemId)
|
|
|
+ ->where('is_frozen', true)
|
|
|
+ ->sum('quantity');
|
|
|
+
|
|
|
+ echo " 未冻结物品数量: {$unfrozenCountFinal}\n";
|
|
|
+ echo " 冻结物品数量: {$frozenCountFinal}\n";
|
|
|
+ echo " 总数量: " . ($unfrozenCountFinal + $frozenCountFinal) . "\n";
|
|
|
+
|
|
|
+ echo "\n9. 验证最终结果...\n";
|
|
|
+ if ($unfrozenCountFinal == 20 && $frozenCountFinal == 0) {
|
|
|
+ echo " ✅ 测试通过:正确消耗了混合物品\n";
|
|
|
+ } else {
|
|
|
+ echo " ❌ 测试失败:混合消耗逻辑有问题\n";
|
|
|
+ echo " 期望:未冻结=20,冻结=0\n";
|
|
|
+ echo " 实际:未冻结={$unfrozenCountFinal},冻结={$frozenCountFinal}\n";
|
|
|
+ }
|
|
|
+
|
|
|
+ echo "\n10. 清理测试数据...\n";
|
|
|
+ ItemUser::where('user_id', $testUserId)->delete();
|
|
|
+ echo " 测试数据已清理\n";
|
|
|
+
|
|
|
+ // 回滚事务,不保存测试数据
|
|
|
+ throw new \Exception('测试完成,回滚事务');
|
|
|
+ });
|
|
|
+
|
|
|
+} catch (\Exception $e) {
|
|
|
+ if ($e->getMessage() === '测试完成,回滚事务') {
|
|
|
+ echo "\n=== 测试完成 ===\n";
|
|
|
+ } else {
|
|
|
+ echo "\n❌ 测试出错: " . $e->getMessage() . "\n";
|
|
|
+ echo "文件: " . $e->getFile() . "\n";
|
|
|
+ echo "行号: " . $e->getLine() . "\n";
|
|
|
+ }
|
|
|
+}
|