Przeglądaj źródła

新增RequestMatchexchangeOpen接口完成对接

- 创建OpenHandler处理获取开放交易物品列表请求
- 实现获取所有启用价格配置的物品ID列表功能
- 添加完整的错误处理和日志记录
- 创建相关测试类验证protobuf对象功能
- 注册TestOpenHandlerCommand测试命令
- 路由配置已存在,Handler可直接使用
- 支持返回ResponseMatchexchangeOpen格式数据
notfff 7 miesięcy temu
rodzic
commit
b046677d37

+ 77 - 0
app/Module/AppGame/Handler/Matchexchange/OpenHandler.php

@@ -0,0 +1,77 @@
+<?php
+
+namespace App\Module\AppGame\Handler\Matchexchange;
+
+use App\Module\AppGame\Handler\BaseHandler;
+use App\Module\Mex\Services\MexPriceConfigService;
+use Google\Protobuf\Internal\Message;
+use Uraus\Kku\Request\RequestMatchexchangeOpen;
+use Uraus\Kku\Response\ResponseMatchexchangeOpen;
+use Uraus\Kku\Common\RESPONSE_CODE;
+use Illuminate\Support\Facades\Log;
+
+/**
+ * 处理获取开放交易物品列表请求
+ */
+class OpenHandler extends BaseHandler
+{
+    /**
+     * 是否需要登录
+     *
+     * @var bool
+     */
+    protected bool $need_login = true;
+
+    /**
+     * 处理获取开放交易物品列表请求
+     *
+     * @param RequestMatchexchangeOpen $data 获取开放交易物品列表请求数据
+     * @return ResponseMatchexchangeOpen 获取开放交易物品列表响应
+     */
+    public function handle(Message $data): Message
+    {
+        // 创建响应对象
+        $response = new ResponseMatchexchangeOpen();
+
+        try {
+            // 获取所有启用的价格配置
+            $enabledConfigs = MexPriceConfigService::getEnabledConfigs();
+
+            // 提取物品ID列表
+            $itemIds = [];
+            foreach ($enabledConfigs as $config) {
+                $itemIds[] = $config['item_id'];
+            }
+
+            // 设置响应数据
+            $response->setItemId($itemIds);
+
+            // 设置成功响应
+            $this->response->setCode(RESPONSE_CODE::OK);
+            $this->response->setMsg('获取开放交易物品列表成功');
+
+            // 更新用户活动时间
+            $this->updateUserActivityTime();
+
+            Log::info('获取开放交易物品列表成功', [
+                'user_id' => $this->user_id,
+                'item_count' => count($itemIds),
+                'item_ids' => $itemIds
+            ]);
+
+        } catch (\Exception $e) {
+            // 记录错误日志
+            Log::error('获取开放交易物品列表失败', [
+                'user_id' => $this->user_id,
+                'error' => $e->getMessage(),
+                'trace' => $e->getTraceAsString()
+            ]);
+
+            // 设置错误响应
+            $this->response->setCode(RESPONSE_CODE::SERVER_ERROR);
+            $this->response->setMsg('获取开放交易物品列表失败');
+        }
+
+        return $response;
+    }
+}

+ 47 - 0
app/Module/Mex/Commands/TestOpenHandlerCommand.php

@@ -0,0 +1,47 @@
+<?php
+
+namespace App\Module\Mex\Commands;
+
+use App\Module\Mex\Tests\OpenHandlerTest;
+use Illuminate\Console\Command;
+
+/**
+ * 测试OpenHandler功能的命令
+ */
+class TestOpenHandlerCommand extends Command
+{
+    /**
+     * 命令签名
+     *
+     * @var string
+     */
+    protected $signature = 'mex:test-open-handler';
+
+    /**
+     * 命令描述
+     *
+     * @var string
+     */
+    protected $description = '测试Mex模块OpenHandler功能';
+
+    /**
+     * 执行命令
+     *
+     * @return int
+     */
+    public function handle()
+    {
+        $this->info('开始测试Mex模块OpenHandler功能...');
+        
+        // 运行测试
+        $success = OpenHandlerTest::runAll();
+        
+        if ($success) {
+            $this->info('所有测试通过!');
+            return Command::SUCCESS;
+        } else {
+            $this->error('部分测试失败!');
+            return Command::FAILURE;
+        }
+    }
+}

+ 1 - 0
app/Module/Mex/Providers/MexServiceProvider.php

@@ -63,6 +63,7 @@ class MexServiceProvider extends ServiceProvider
                 \App\Module\Mex\Commands\MexUserSellItemMatchCommand::class,
                 \App\Module\Mex\Commands\MexTestCommand::class,
                 \App\Module\Mex\Commands\TestMultiCurrencyCommand::class,
+                \App\Module\Mex\Commands\TestOpenHandlerCommand::class,
             ]);
         }
     }

+ 87 - 0
app/Module/Mex/Tests/OpenHandlerTest.php

@@ -0,0 +1,87 @@
+<?php
+
+namespace App\Module\Mex\Tests;
+
+use App\Module\AppGame\Handler\Matchexchange\OpenHandler;
+use App\Module\Mex\Services\MexPriceConfigService;
+use Uraus\Kku\Request\RequestMatchexchangeOpen;
+use Uraus\Kku\Response\ResponseMatchexchangeOpen;
+
+/**
+ * OpenHandler测试类
+ */
+class OpenHandlerTest
+{
+    /**
+     * 测试获取开放交易物品列表
+     */
+    public static function testGetOpenItems()
+    {
+        echo "=== 测试获取开放交易物品列表 ===\n";
+
+        try {
+            // 1. 测试获取启用的价格配置
+            echo "1. 获取启用的价格配置...\n";
+            $enabledConfigs = MexPriceConfigService::getEnabledConfigs();
+            echo "启用的价格配置数量: " . count($enabledConfigs) . "\n";
+            
+            if (!empty($enabledConfigs)) {
+                echo "价格配置详情:\n";
+                foreach ($enabledConfigs as $config) {
+                    echo "  - 物品ID: {$config['item_id']}, 价格范围: {$config['price_range']}\n";
+                }
+            } else {
+                echo "警告: 没有找到启用的价格配置\n";
+            }
+
+            // 2. 模拟Handler处理
+            echo "\n2. 模拟Handler处理...\n";
+            $itemIds = [];
+            foreach ($enabledConfigs as $config) {
+                $itemIds[] = $config['item_id'];
+            }
+            
+            echo "提取的物品ID列表: " . json_encode($itemIds) . "\n";
+
+            // 3. 验证响应格式
+            echo "\n3. 验证响应格式...\n";
+            $response = new ResponseMatchexchangeOpen();
+            $response->setItemId($itemIds);
+            
+            $responseItemIds = $response->getItemId();
+            echo "响应中的物品ID数量: " . count($responseItemIds) . "\n";
+            echo "响应中的物品ID: " . json_encode(iterator_to_array($responseItemIds)) . "\n";
+
+            echo "\n✅ 测试完成,功能正常\n";
+            return true;
+
+        } catch (\Exception $e) {
+            echo "\n❌ 测试失败: " . $e->getMessage() . "\n";
+            echo "错误堆栈: " . $e->getTraceAsString() . "\n";
+            return false;
+        }
+    }
+
+    /**
+     * 运行所有测试
+     */
+    public static function runAll()
+    {
+        echo "开始运行OpenHandler测试...\n\n";
+        
+        $results = [];
+        $results['testGetOpenItems'] = self::testGetOpenItems();
+        
+        echo "\n=== 测试结果汇总 ===\n";
+        foreach ($results as $test => $result) {
+            $status = $result ? '✅ 通过' : '❌ 失败';
+            echo "{$test}: {$status}\n";
+        }
+        
+        $passCount = array_sum($results);
+        $totalCount = count($results);
+        echo "\n总计: {$passCount}/{$totalCount} 个测试通过\n";
+        
+        return $passCount === $totalCount;
+    }
+}

+ 124 - 0
tests/Unit/AppGame/OpenHandlerTest.php

@@ -0,0 +1,124 @@
+<?php
+
+namespace Tests\Unit\AppGame;
+
+use Tests\TestCase;
+use Uraus\Kku\Request\RequestMatchexchangeOpen;
+use Uraus\Kku\Response\ResponseMatchexchangeOpen;
+
+/**
+ * 获取开放交易物品列表Handler测试
+ */
+class OpenHandlerTest extends TestCase
+{
+    /**
+     * 测试RequestMatchexchangeOpen请求对象
+     */
+    public function testRequestMatchexchangeOpenStructure()
+    {
+        $request = new RequestMatchexchangeOpen();
+
+        // 测试设置时间戳
+        $timestamp = time();
+        $request->setTimes($timestamp);
+        $this->assertEquals($timestamp, $request->getTimes());
+    }
+
+    /**
+     * 测试RequestMatchexchangeOpen默认值
+     */
+    public function testRequestMatchexchangeOpenDefaultValues()
+    {
+        $request = new RequestMatchexchangeOpen();
+
+        // 测试默认值
+        $this->assertEquals(0, $request->getTimes());
+    }
+
+    /**
+     * 测试ResponseMatchexchangeOpen响应对象
+     */
+    public function testResponseMatchexchangeOpenStructure()
+    {
+        $response = new ResponseMatchexchangeOpen();
+
+        // 测试设置物品ID列表
+        $itemIds = [1001, 1002, 1003];
+        $response->setItemId($itemIds);
+        
+        $responseItemIds = $response->getItemId();
+        $this->assertCount(3, $responseItemIds);
+        
+        // 验证物品ID列表内容
+        $responseArray = iterator_to_array($responseItemIds);
+        $this->assertEquals($itemIds, $responseArray);
+    }
+
+    /**
+     * 测试ResponseMatchexchangeOpen空列表
+     */
+    public function testResponseMatchexchangeOpenEmptyList()
+    {
+        $response = new ResponseMatchexchangeOpen();
+
+        // 测试设置空列表
+        $response->setItemId([]);
+        
+        $responseItemIds = $response->getItemId();
+        $this->assertCount(0, $responseItemIds);
+    }
+
+    /**
+     * 测试ResponseMatchexchangeOpen大量物品ID
+     */
+    public function testResponseMatchexchangeOpenLargeList()
+    {
+        $response = new ResponseMatchexchangeOpen();
+
+        // 生成大量物品ID
+        $itemIds = range(1001, 1100); // 100个物品ID
+        $response->setItemId($itemIds);
+        
+        $responseItemIds = $response->getItemId();
+        $this->assertCount(100, $responseItemIds);
+        
+        // 验证第一个和最后一个物品ID
+        $responseArray = iterator_to_array($responseItemIds);
+        $this->assertEquals(1001, $responseArray[0]);
+        $this->assertEquals(1100, $responseArray[99]);
+    }
+
+    /**
+     * 测试protobuf序列化和反序列化
+     */
+    public function testProtobufSerialization()
+    {
+        // 创建请求对象
+        $request = new RequestMatchexchangeOpen();
+        $request->setTimes(time());
+
+        // 序列化
+        $serialized = $request->serializeToString();
+        $this->assertNotEmpty($serialized);
+
+        // 反序列化
+        $newRequest = new RequestMatchexchangeOpen();
+        $newRequest->mergeFromString($serialized);
+        $this->assertEquals($request->getTimes(), $newRequest->getTimes());
+
+        // 创建响应对象
+        $response = new ResponseMatchexchangeOpen();
+        $itemIds = [1001, 1002, 1003];
+        $response->setItemId($itemIds);
+
+        // 序列化响应
+        $serializedResponse = $response->serializeToString();
+        $this->assertNotEmpty($serializedResponse);
+
+        // 反序列化响应
+        $newResponse = new ResponseMatchexchangeOpen();
+        $newResponse->mergeFromString($serializedResponse);
+        $responseArray = iterator_to_array($newResponse->getItemId());
+        $this->assertEquals($itemIds, $responseArray);
+    }
+}