Ver código fonte

优化AppGameProtobufResponseListener土地数据处理

- 在返回时通过土地ID获取最新的完整土地信息
- 使用LandService::getUserLand()获取实时数据
- 使用LandInfoDto::toDataLand()转换为Protobuf格式
- 添加完善的错误处理和日志记录
- 减少事务复杂度,避免在事件中存储完整数据
- 确保返回数据的准确性和完整性
- 保持LandTemp现有逻辑不变,向后兼容
notfff 7 meses atrás
pai
commit
28723f298c

+ 63 - 33
app/Module/AppGame/Listeners/AppGameProtobufResponseListener.php

@@ -115,40 +115,70 @@ class AppGameProtobufResponseListener
         // 宠物详细数据 end
 
         // 土地变更数据 start
-        $landChanges = LandTemp::getUserLandChanges($user_id);
-        $landStatusChanges = LandTemp::getUserLandStatusChanges($user_id);
-
-        // 合并两种土地变更数据
-        $allLandChanges = array_merge($landChanges, $landStatusChanges);
-
-        $landLs = [];
-        foreach ($allLandChanges as $land) {
-            $l = new \Uraus\Kku\Common\DataLand();
-            $l->setId($land->landId);
-            $l->setIndex($land->position);
-
-            // 设置土地类型/等级
-            if (isset($land->newType)) {
-                $l->setLevel($land->newType); // 使用土地类型作为等级
-            } elseif (isset($land->landType)) {
-                $l->setLevel($land->landType);
-            }
-
-            // 设置土地状态
-            if (isset($land->newStatus)) {
-                $l->setStatus($land->newStatus);
-            }
-
-            // 如果有种子ID,设置种子ID
-            if (isset($land->seedId) && $land->seedId) {
-                $l->setSeedId($land->seedId);
+        try {
+            $landChanges = LandTemp::getUserLandChanges($user_id);
+            $landStatusChanges = LandTemp::getUserLandStatusChanges($user_id);
+
+            // 合并两种土地变更数据,获取所有变更的土地ID
+            $allLandChanges = array_merge($landChanges, $landStatusChanges);
+            $changedLandIds = array_keys($allLandChanges);
+
+            if (!empty($changedLandIds)) {
+                Log::info('处理土地变更数据', [
+                    'user_id' => $user_id,
+                    'changed_land_ids' => $changedLandIds,
+                    'land_changes_count' => count($landChanges),
+                    'status_changes_count' => count($landStatusChanges)
+                ]);
+
+                $landLs = [];
+                foreach ($changedLandIds as $landId) {
+                    try {
+                        // 通过土地ID获取最新的土地信息(包含完整的作物信息)
+                        $landInfoDto = \App\Module\Farm\Services\LandService::getUserLand($user_id, $landId);
+
+                        if ($landInfoDto) {
+                            // 使用Farm模块的转换方法将LandInfoDto转换为DataLand
+                            $dataLand = \App\Module\AppGame\Proto\LandInfoDto::toDataLand($landInfoDto);
+                            $landLs[] = $dataLand;
+
+                            Log::debug('土地数据转换成功', [
+                                'user_id' => $user_id,
+                                'land_id' => $landId,
+                                'position' => $landInfoDto->position,
+                                'land_type' => $landInfoDto->landType,
+                                'status' => $landInfoDto->status,
+                                'has_crop' => !is_null($landInfoDto->crop)
+                            ]);
+                        } else {
+                            Log::warning('获取土地信息失败', [
+                                'user_id' => $user_id,
+                                'land_id' => $landId
+                            ]);
+                        }
+                    } catch (\Exception $e) {
+                        Log::error('处理单个土地数据失败', [
+                            'user_id' => $user_id,
+                            'land_id' => $landId,
+                            'error' => $e->getMessage()
+                        ]);
+                    }
+                }
+
+                if ($landLs) {
+                    $lastData->setLands($landLs);
+                    Log::info('土地变更数据设置完成', [
+                        'user_id' => $user_id,
+                        'lands_count' => count($landLs)
+                    ]);
+                }
             }
-
-            $landLs[] = $l;
-        }
-
-        if ($landLs) {
-            $lastData->setLands($landLs);
+        } catch (\Exception $e) {
+            Log::error('处理土地变更数据失败', [
+                'user_id' => $user_id,
+                'error' => $e->getMessage(),
+                'trace' => $e->getTraceAsString()
+            ]);
         }
         // 土地变更数据 end