|
|
@@ -5,9 +5,7 @@ namespace App\Module\UrsPromotion\Logics;
|
|
|
use App\Module\UrsPromotion\Models\UrsUserReferral;
|
|
|
use App\Module\UrsPromotion\Models\UrsUserTalent;
|
|
|
use App\Module\UrsPromotion\Models\UrsTalentConfig;
|
|
|
-use App\Module\UrsPromotion\Enums\UrsTalentLevel;
|
|
|
use App\Module\UrsPromotion\Enums\UrsPromotionRelationLevel;
|
|
|
-use Illuminate\Support\Facades\DB;
|
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
|
|
/**
|
|
|
@@ -82,8 +80,8 @@ class UrsTalentLogic
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 计算用户的团队统计数据
|
|
|
- *
|
|
|
+ * 计算用户的团队统计数据(支持20代统计)
|
|
|
+ *
|
|
|
* @param int $userId 用户ID
|
|
|
* @return array
|
|
|
*/
|
|
|
@@ -95,44 +93,87 @@ class UrsTalentLogic
|
|
|
'third_count' => 0,
|
|
|
'promotion_count' => 0,
|
|
|
];
|
|
|
-
|
|
|
+
|
|
|
// 获取直推用户
|
|
|
$directUsers = UrsUserReferral::where('referrer_id', $userId)
|
|
|
->where('status', UrsUserReferral::STATUS_VALID)
|
|
|
->pluck('user_id')
|
|
|
->toArray();
|
|
|
-
|
|
|
+
|
|
|
$stats['direct_count'] = count($directUsers);
|
|
|
-
|
|
|
+
|
|
|
if (empty($directUsers)) {
|
|
|
return $stats;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// 获取间推用户(直推用户的直推)
|
|
|
$indirectUsers = UrsUserReferral::whereIn('referrer_id', $directUsers)
|
|
|
->where('status', UrsUserReferral::STATUS_VALID)
|
|
|
->pluck('user_id')
|
|
|
->toArray();
|
|
|
-
|
|
|
+
|
|
|
$stats['indirect_count'] = count($indirectUsers);
|
|
|
-
|
|
|
+
|
|
|
if (empty($indirectUsers)) {
|
|
|
$stats['promotion_count'] = $stats['direct_count'];
|
|
|
return $stats;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// 获取三推用户(间推用户的直推)
|
|
|
$thirdUsers = UrsUserReferral::whereIn('referrer_id', $indirectUsers)
|
|
|
->where('status', UrsUserReferral::STATUS_VALID)
|
|
|
->pluck('user_id')
|
|
|
->toArray();
|
|
|
-
|
|
|
+
|
|
|
$stats['third_count'] = count($thirdUsers);
|
|
|
- $stats['promotion_count'] = $stats['direct_count'] + $stats['indirect_count'] + $stats['third_count'];
|
|
|
-
|
|
|
+
|
|
|
+ // 计算20代总人数(使用递归方式统计所有层级)
|
|
|
+ $allTeamUsers = $this->getAllTeamMembers($userId, UrsPromotionRelationLevel::getTeamStatsDepth());
|
|
|
+ $stats['promotion_count'] = count($allTeamUsers);
|
|
|
+
|
|
|
return $stats;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 递归获取所有团队成员(支持多层级)
|
|
|
+ *
|
|
|
+ * @param int $userId 用户ID
|
|
|
+ * @param int $maxLevels 最大层级数
|
|
|
+ * @return array 所有团队成员的用户ID数组
|
|
|
+ */
|
|
|
+ private function getAllTeamMembers(int $userId, ?int $maxLevels = null): array
|
|
|
+ {
|
|
|
+ // 如果没有指定层级数,使用配置的团队统计深度
|
|
|
+ if ($maxLevels === null) {
|
|
|
+ $maxLevels = UrsPromotionRelationLevel::getTeamStatsDepth();
|
|
|
+ }
|
|
|
+
|
|
|
+ $allMembers = [];
|
|
|
+ $currentLevelUsers = [$userId];
|
|
|
+
|
|
|
+ for ($level = 1; $level <= $maxLevels; $level++) {
|
|
|
+ $nextLevelUsers = [];
|
|
|
+
|
|
|
+ foreach ($currentLevelUsers as $currentUserId) {
|
|
|
+ $directReferrals = UrsUserReferral::where('referrer_id', $currentUserId)
|
|
|
+ ->where('status', UrsUserReferral::STATUS_VALID)
|
|
|
+ ->pluck('user_id')
|
|
|
+ ->toArray();
|
|
|
+
|
|
|
+ $nextLevelUsers = array_merge($nextLevelUsers, $directReferrals);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (empty($nextLevelUsers)) {
|
|
|
+ break; // 没有下级了
|
|
|
+ }
|
|
|
+
|
|
|
+ $allMembers = array_merge($allMembers, $nextLevelUsers);
|
|
|
+ $currentLevelUsers = $nextLevelUsers;
|
|
|
+ }
|
|
|
+
|
|
|
+ return array_unique($allMembers);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 根据团队数据计算达人等级
|
|
|
*
|