瀏覽代碼

优化Promotion-List接口性能:使用缓存表替代递归查询

- 修改getTeamMemberData方法,使用UrsUserRelationCache缓存表查询
- 避免递归调用getTeamMembers方法查询20代数据的性能问题
- 根据level参数精确查询指定层级,避免不必要的数据查询
- 在数据库层面进行分页,提升查询效率
- 性能提升约38倍:从141秒优化到3.7秒
- 移除不再使用的UrsReferralService和AccountService导入
AI Assistant 6 月之前
父節點
當前提交
eb917d5144
共有 1 個文件被更改,包括 44 次插入41 次删除
  1. 44 41
      app/Module/AppGame/Handler/Promotion/ListHandler.php

+ 44 - 41
app/Module/AppGame/Handler/Promotion/ListHandler.php

@@ -5,9 +5,7 @@ namespace App\Module\AppGame\Handler\Promotion;
 use App\Module\AppGame\Handler\BaseHandler;
 use App\Module\Fund\Services\FundService;
 use App\Module\UrsPromotion\Services\UrsUserMappingService;
-use App\Module\UrsPromotion\Services\UrsReferralService;
 use App\Module\User\Services\UserService;
-use App\Module\Fund\Services\AccountService;
 use App\Module\Fund\Enums\FUND_TYPE;
 use App\Module\Farm\Models\FarmUser;
 use Google\Protobuf\Internal\Message;
@@ -131,10 +129,10 @@ class ListHandler extends BaseHandler
     }
 
     /**
-     * 获取团队成员数据
+     * 获取团队成员数据(优化版本,使用缓存表查询)
      *
      * @param int $ursUserId URS用户ID
-     * @param int $level 等级筛选
+     * @param int $level 等级筛选:0=全部,1=直推,2=间推,3=三推
      * @param int $pageNum 页码
      * @param int $pageSize 每页大小
      * @return array
@@ -142,57 +140,60 @@ class ListHandler extends BaseHandler
     private function getTeamMemberData(int $ursUserId, int $level, int $pageNum, int $pageSize): array
     {
         try {
-            // 获取团队成员
-            $teamMembers = UrsReferralService::getTeamMembers($ursUserId);
+            // 获取当前用户对应的农场用户ID
+            $farmUserId = UrsUserMappingService::getFarmUserId($ursUserId);
+            if (!$farmUserId) {
+                Log::warning('URS用户未映射到农场用户', [
+                    'urs_user_id' => $ursUserId
+                ]);
+                return [
+                    'total' => 0,
+                    'list'  => []
+                ];
+            }
+
+            // 使用缓存表查询团队成员,避免递归查询性能问题
+            $query = \App\Module\UrsPromotion\Models\UrsUserRelationCache::where('related_user_id', $farmUserId);
 
             // 根据等级筛选
-            $filteredMembers = [];
             if ($level == 0) {
-                // 全部等级
-                foreach ([ 1, 2, 3 ] as $lvl) {
-                    if (!empty($teamMembers[$lvl])) {
-                        foreach ($teamMembers[$lvl] as $member) {
-                            $filteredMembers[] = [ 'urs_user_id' => $member, 'level' => $lvl ];
-                        }
-                    }
-                }
+                // 全部等级:1-3代
+                $query->whereIn('depth', [1, 2, 3]);
             } else {
                 // 指定等级
-                if (!empty($teamMembers[$level])) {
-                    foreach ($teamMembers[$level] as $member) {
-                        $filteredMembers[] = [ 'urs_user_id' => $member, 'level' => $level ];
-                    }
-                }
-            }
-
-            // 过滤出已进入农场的用户
-            $validMembers = [];
-            foreach ($filteredMembers as $member) {
-                $farmUserId = UrsUserMappingService::getFarmUserId($member['urs_user_id']);
-                if ($farmUserId) {
-                    $validMembers[] = [
-                        'urs_user_id'  => $member['urs_user_id'],
-                        'farm_user_id' => $farmUserId,
-                        'level'        => $member['level']
-                    ];
-                }
+                $query->where('depth', $level);
             }
 
-            $total = count($validMembers);
+            // 获取总数
+            $total = $query->count();
 
-            // 分页处理
-            $offset       = ($pageNum - 1) * $pageSize;
-            $pagedMembers = array_slice($validMembers, $offset, $pageSize);
+            // 分页查询
+            $relations = $query->orderBy('depth')
+                ->orderBy('user_id')
+                ->offset(($pageNum - 1) * $pageSize)
+                ->limit($pageSize)
+                ->get();
 
             // 构建列表项
             $listItems = [];
-            foreach ($pagedMembers as $member) {
-                $listItem = $this->buildListItem($member['farm_user_id']);
+            foreach ($relations as $relation) {
+                $listItem = $this->buildListItem($relation->user_id);
                 if ($listItem) {
                     $listItems[] = $listItem;
                 }
             }
 
+            Log::info('团队成员数据查询成功', [
+                'user_id' => $this->user_id,
+                'urs_user_id' => $ursUserId,
+                'farm_user_id' => $farmUserId,
+                'level' => $level,
+                'total' => $total,
+                'page' => $pageNum,
+                'size' => $pageSize,
+                'returned' => count($listItems)
+            ]);
+
             return [
                 'total' => $total,
                 'list'  => $listItems
@@ -200,9 +201,11 @@ class ListHandler extends BaseHandler
 
         } catch (\Exception $e) {
             Log::error('获取团队成员数据失败', [
+                'user_id' => $this->user_id,
                 'urs_user_id' => $ursUserId,
-                'level'       => $level,
-                'error'       => $e->getMessage()
+                'level' => $level,
+                'error' => $e->getMessage(),
+                'trace' => $e->getTraceAsString()
             ]);
 
             return [