| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- <?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";
- }
- }
|