ListHandler.php 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. <?php
  2. namespace App\Module\AppGame\Handler\Promotion;
  3. use App\Module\AppGame\Handler\BaseHandler;
  4. use App\Module\Fund\Services\FundService;
  5. use App\Module\UrsPromotion\Services\UrsUserMappingService;
  6. use App\Module\User\Services\UserService;
  7. use App\Module\Fund\Enums\FUND_TYPE;
  8. use App\Module\Farm\Models\FarmUser;
  9. use Google\Protobuf\Internal\Message;
  10. use Illuminate\Support\Facades\Log;
  11. use UCore\Helper\Logger;
  12. use Uraus\Kku\Request\RequestPromotionList;
  13. use Uraus\Kku\Response\ResponsePromotionList;
  14. use Uraus\Kku\Response\PromotionListItem;
  15. use Uraus\Kku\Common\ResponsePage;
  16. /**
  17. * 处理推广团队成员列表请求
  18. *
  19. * 获取用户的推广团队成员列表,支持分页和等级筛选
  20. * 只返回已进入农场的用户数据
  21. */
  22. class ListHandler extends BaseHandler
  23. {
  24. /**
  25. * 是否需要登录
  26. *
  27. * @var bool
  28. */
  29. protected bool $need_login = true;
  30. /**
  31. * 处理推广团队成员列表请求
  32. *
  33. * @param RequestPromotionList $data 推广团队成员列表请求数据
  34. * @return ResponsePromotionList 推广团队成员列表响应
  35. */
  36. public function handle(Message $data): Message
  37. {
  38. // 创建响应对象
  39. $response = new ResponsePromotionList();
  40. try {
  41. // 更新用户活动时间
  42. $this->updateUserActivityTime();
  43. // 获取请求参数
  44. $page = $data->getPage();
  45. $level = $data->getLevel(); // 等级筛选:0=全部,1=直推,2=间推,3=三推
  46. $pageNum = $page ? $page->getPage() : 1;
  47. $pageSize = $page ? $page->getPerPage() : 20;
  48. // 限制分页参数
  49. $pageNum = max(1, $pageNum);
  50. $pageSize = min(100, max(1, $pageSize)); // 最大100条
  51. // 获取当前农场用户对应的URS用户ID
  52. $ursUserId = UrsUserMappingService::getUrsUserId($this->user_id);
  53. if (!$ursUserId) {
  54. // 用户未进入URS推广系统,返回空列表
  55. Log::info('用户未进入URS推广系统', [
  56. 'user_id' => $this->user_id
  57. ]);
  58. return $this->setEmptyResponse($response, $pageNum, $pageSize);
  59. }
  60. // 获取团队成员数据
  61. $teamData = $this->getTeamMemberData($ursUserId, $level, $pageNum, $pageSize);
  62. // 设置分页信息
  63. $responsePage = new ResponsePage();
  64. $responsePage->setCurrentPage($pageNum);
  65. $responsePage->setPerPage($pageSize);
  66. $responsePage->setTotal($teamData['total']);
  67. $responsePage->setLastPage(ceil($teamData['total'] / $pageSize));
  68. $responsePage->setHasMore($pageNum < ceil($teamData['total'] / $pageSize));
  69. $response->setPage($responsePage);
  70. // 设置列表数据
  71. $response->setList($teamData['list']);
  72. Log::info('推广团队成员列表获取成功', [
  73. 'user_id' => $this->user_id,
  74. 'urs_user_id' => $ursUserId,
  75. 'level' => $level,
  76. 'page' => $pageNum,
  77. 'size' => $pageSize,
  78. 'total' => $teamData['total']
  79. ]);
  80. } catch (\Exception $e) {
  81. Logger::error('获取推广团队成员列表失败', [
  82. 'user_id' => $this->user_id,
  83. 'error' => $e->getMessage(),
  84. 'trace' => $e->getTraceAsString()
  85. ]);
  86. // 发生错误时返回空列表
  87. return $this->setEmptyResponse($response, $pageNum ?? 1, $pageSize ?? 20);
  88. }
  89. return $response;
  90. }
  91. /**
  92. * 设置空响应数据
  93. *
  94. * @param ResponsePromotionList $response
  95. * @param int $pageNum
  96. * @param int $pageSize
  97. * @return ResponsePromotionList
  98. */
  99. private function setEmptyResponse(ResponsePromotionList $response, int $pageNum, int $pageSize): ResponsePromotionList
  100. {
  101. $responsePage = new ResponsePage();
  102. $responsePage->setCurrentPage($pageNum);
  103. $responsePage->setPerPage($pageSize);
  104. $responsePage->setTotal(0);
  105. $responsePage->setLastPage(0);
  106. $responsePage->setHasMore(false);
  107. $response->setPage($responsePage);
  108. $response->setList([]);
  109. return $response;
  110. }
  111. /**
  112. * 获取团队成员数据(优化版本,使用缓存表查询)
  113. *
  114. * @param int $ursUserId URS用户ID
  115. * @param int $level 等级筛选:0=全部,1=直推,2=间推,3=三推
  116. * @param int $pageNum 页码
  117. * @param int $pageSize 每页大小
  118. * @return array
  119. */
  120. private function getTeamMemberData(int $ursUserId, int $level, int $pageNum, int $pageSize): array
  121. {
  122. try {
  123. // 获取当前用户对应的农场用户ID
  124. $farmUserId = UrsUserMappingService::getFarmUserId($ursUserId);
  125. if (!$farmUserId) {
  126. Log::warning('URS用户未映射到农场用户', [
  127. 'urs_user_id' => $ursUserId
  128. ]);
  129. return [
  130. 'total' => 0,
  131. 'list' => []
  132. ];
  133. }
  134. // 使用缓存表查询团队成员,避免递归查询性能问题
  135. $query = \App\Module\UrsPromotion\Models\UrsUserRelationCache::where('related_user_id', $farmUserId);
  136. // 根据等级筛选
  137. if ($level == 0) {
  138. // 全部等级:1-3代
  139. $query->whereIn('depth', [1, 2, 3]);
  140. } else {
  141. // 指定等级
  142. $query->where('depth', $level);
  143. }
  144. // 获取总数
  145. $total = $query->count();
  146. // 分页查询
  147. $relations = $query->orderBy('depth')
  148. ->orderBy('user_id')
  149. ->offset(($pageNum - 1) * $pageSize)
  150. ->limit($pageSize)
  151. ->get();
  152. // 构建列表项
  153. $listItems = [];
  154. foreach ($relations as $relation) {
  155. $listItem = $this->buildListItem($relation->user_id);
  156. if ($listItem) {
  157. $listItems[] = $listItem;
  158. }
  159. }
  160. Log::info('团队成员数据查询成功', [
  161. 'user_id' => $this->user_id,
  162. 'urs_user_id' => $ursUserId,
  163. 'farm_user_id' => $farmUserId,
  164. 'level' => $level,
  165. 'total' => $total,
  166. 'page' => $pageNum,
  167. 'size' => $pageSize,
  168. 'returned' => count($listItems)
  169. ]);
  170. return [
  171. 'total' => $total,
  172. 'list' => $listItems
  173. ];
  174. } catch (\Exception $e) {
  175. Logger::error('获取团队成员数据失败', [
  176. 'user_id' => $this->user_id,
  177. 'urs_user_id' => $ursUserId,
  178. 'level' => $level,
  179. 'error' => $e->getMessage(),
  180. 'trace' => $e->getTraceAsString()
  181. ]);
  182. return [
  183. 'total' => 0,
  184. 'list' => []
  185. ];
  186. }
  187. }
  188. /**
  189. * 构建列表项
  190. *
  191. * @param int $farmUserId 农场用户ID
  192. * @return PromotionListItem|null
  193. */
  194. private function buildListItem(int $farmUserId): ?PromotionListItem
  195. {
  196. try {
  197. // 获取用户基本信息
  198. $userInfo = UserService::infoinfo($farmUserId);
  199. if (!$userInfo) {
  200. return null;
  201. }
  202. // 获取用户钻石余额
  203. $accounts = new FundService($farmUserId, FUND_TYPE::FUND2);
  204. $fund2Balance = (int) $accounts->balance();
  205. // 获取用户房屋等级
  206. $houseLevel = 1; // 默认等级
  207. try {
  208. $farmUser = FarmUser::where('user_id', $farmUserId)->first();
  209. if ($farmUser) {
  210. $houseLevel = $farmUser->house_level;
  211. }
  212. } catch (\Exception $e) {
  213. Log::warning('获取用户房屋等级失败', [
  214. 'user_id' => $farmUserId,
  215. 'error' => $e->getMessage()
  216. ]);
  217. }
  218. // 创建列表项
  219. $listItem = new PromotionListItem();
  220. $listItem->setUserId($farmUserId);
  221. $listItem->setNickname($userInfo->nickname ?: '用户' . $farmUserId);
  222. $listItem->setAvatar($userInfo->avatar ?: '');
  223. $listItem->setFund2($fund2Balance);
  224. $listItem->setContribution(0); // 贡献值暂时设为0,后续可扩展
  225. $listItem->setHouseLevel($houseLevel);
  226. return $listItem;
  227. } catch (\Exception $e) {
  228. Logger::error('构建列表项失败', [
  229. 'user_id' => $farmUserId,
  230. 'error' => $e->getMessage()
  231. ]);
  232. return null;
  233. }
  234. }
  235. }