|
|
@@ -24,14 +24,14 @@ URS推广模块的达人等级系统是整个推广体系的核心组件,通
|
|
|
|
|
|
### 2.1 等级结构
|
|
|
|
|
|
-| 等级 | 名称 | 直推要求 | 团队要求 | 描述 |
|
|
|
-|------|------|----------|----------|------|
|
|
|
-| 0 | 非达人 | 0人 | 0人 | 普通用户,无达人等级 |
|
|
|
-| 1 | URS初级达人 | 3人 | 5人 | 初级达人,享有基础推广收益 |
|
|
|
-| 2 | URS中级达人 | 5人 | 15人 | 中级达人,享有更高推广收益 |
|
|
|
-| 3 | URS高级达人 | 10人 | 50人 | 高级达人,享有优质推广收益 |
|
|
|
-| 4 | URS资深达人 | 20人 | 100人 | 资深达人,享有专业推广收益 |
|
|
|
-| 5 | URS顶级达人 | 50人 | 300人 | 顶级达人,享有最高推广收益 |
|
|
|
+| 等级 | 名称 | 直推要求 | 团队要求 | 活跃直推要求 | 活跃团队要求 | 描述 |
|
|
|
+|------|------|----------|----------|--------------|--------------|------|
|
|
|
+| 0 | 非达人 | 0人 | 0人 | 0人 | 0人 | 普通用户,无达人等级 |
|
|
|
+| 1 | URS初级达人 | 3人 | 10人 | 2人 | 3人 | 初级达人,享有基础推广收益 |
|
|
|
+| 2 | URS中级达人 | 8人 | 30人 | 5人 | 8人 | 中级达人,享有更高推广收益 |
|
|
|
+| 3 | URS高级达人 | 15人 | 80人 | 8人 | 15人 | 高级达人,享有优质推广收益 |
|
|
|
+| 4 | URS资深达人 | 30人 | 200人 | 15人 | 30人 | 资深达人,享有专业推广收益 |
|
|
|
+| 5 | URS顶级达人 | 50人 | 500人 | 25人 | 50人 | 顶级达人,享有最高推广收益 |
|
|
|
|
|
|
### 2.2 等级枚举定义
|
|
|
|
|
|
@@ -51,23 +51,54 @@ enum UrsTalentLevel: int
|
|
|
|
|
|
### 3.1 升级条件
|
|
|
|
|
|
-达人等级的升级需要同时满足两个条件:
|
|
|
+达人等级的升级需要同时满足四个条件:
|
|
|
1. **直推人数**:用户直接推荐的下级用户数量
|
|
|
2. **团队总人数**:包括直推、间推、三推的所有下级用户总数
|
|
|
+3. **活跃直推人数**:直推用户中活跃用户的数量
|
|
|
+4. **活跃团队总人数**:团队中所有活跃用户的数量
|
|
|
+
|
|
|
+#### 3.1.1 有效人数(活跃人数)定义
|
|
|
+
|
|
|
+**活跃用户判定标准**:
|
|
|
+- **时间范围**:最近15天内有活动记录
|
|
|
+- **判定依据**:基于用户的 `last_activity_time` 字段
|
|
|
+- **更新机制**:每日定时任务自动更新活跃状态
|
|
|
+- **存储位置**:用户映射表(`urs_promotion_user_mappings`)的 `is_active` 字段
|
|
|
+
|
|
|
+**活跃状态字段**:
|
|
|
+- `is_active`:是否活跃(1=活跃,0=不活跃)
|
|
|
+- `last_activity_check`:最后活跃检查时间
|
|
|
+- `active_days_count`:活跃天数统计
|
|
|
+
|
|
|
+**活跃用户的业务价值**:
|
|
|
+- 提升推广体系的质量和真实性
|
|
|
+- 避免僵尸用户影响达人等级评估
|
|
|
+- 激励推广者关注用户活跃度而非单纯数量
|
|
|
|
|
|
### 3.2 升级算法
|
|
|
|
|
|
```php
|
|
|
-private static function calculateTalentLevel(int $directCount, int $totalCount): int
|
|
|
-{
|
|
|
+private static function calculateTalentLevel(
|
|
|
+ int $directCount,
|
|
|
+ int $totalCount,
|
|
|
+ int $activeDirectCount = 0,
|
|
|
+ int $activeTotalCount = 0
|
|
|
+): int {
|
|
|
// 获取等级配置(按等级倒序排列)
|
|
|
$configs = UrsTalentConfig::where('status', 1)
|
|
|
->orderBy('level', 'desc')
|
|
|
->get();
|
|
|
|
|
|
foreach ($configs as $config) {
|
|
|
- if ($directCount >= $config->direct_count_required &&
|
|
|
- $totalCount >= $config->promotion_count_required) {
|
|
|
+ // 检查基础条件
|
|
|
+ $directCountMet = $directCount >= $config->direct_count_required;
|
|
|
+ $totalCountMet = $totalCount >= $config->promotion_count_required;
|
|
|
+
|
|
|
+ // 检查活跃用户条件
|
|
|
+ $activeDirectMet = $activeDirectCount >= $config->active_direct_required;
|
|
|
+ $activeTotalMet = $activeTotalCount >= $config->active_count_required;
|
|
|
+
|
|
|
+ if ($directCountMet && $totalCountMet && $activeDirectMet && $activeTotalMet) {
|
|
|
return $config->level;
|
|
|
}
|
|
|
}
|
|
|
@@ -79,9 +110,43 @@ private static function calculateTalentLevel(int $directCount, int $totalCount):
|
|
|
### 3.3 升级触发机制
|
|
|
|
|
|
- **团队成员变化时**:新增推荐关系时自动检查升级
|
|
|
+- **活跃状态变化时**:用户活跃状态更新时重新计算等级
|
|
|
- **定期批量更新**:系统定期批量重新计算所有用户等级
|
|
|
- **手动触发更新**:管理员可手动触发特定用户的等级更新
|
|
|
|
|
|
+### 3.4 活跃用户管理
|
|
|
+
|
|
|
+#### 3.4.1 活跃状态更新机制
|
|
|
+
|
|
|
+**定时任务**:`UrsUpdateActiveStatusCommand`
|
|
|
+- **执行频率**:每日凌晨2点自动执行
|
|
|
+- **处理方式**:批量更新用户活跃状态
|
|
|
+- **性能优化**:支持分批处理,避免内存溢出
|
|
|
+
|
|
|
+**手动命令**:
|
|
|
+```bash
|
|
|
+# 正常更新所有用户活跃状态
|
|
|
+php artisan urs:update-active-status
|
|
|
+
|
|
|
+# 限制处理500个用户
|
|
|
+php artisan urs:update-active-status --limit=500
|
|
|
+
|
|
|
+# 试运行模式(不实际更新)
|
|
|
+php artisan urs:update-active-status --dry-run
|
|
|
+
|
|
|
+# 重置所有用户活跃状态
|
|
|
+php artisan urs:update-active-status --reset
|
|
|
+```
|
|
|
+
|
|
|
+#### 3.4.2 活跃用户统计服务
|
|
|
+
|
|
|
+**UrsActiveUserService** 提供以下功能:
|
|
|
+- `updateUserActiveStatus()`:更新单个用户活跃状态
|
|
|
+- `batchUpdateActiveStatus()`:批量更新活跃状态
|
|
|
+- `checkUserActivity()`:检查用户活跃状态
|
|
|
+- `getActiveTeamMembers()`:获取活跃团队成员
|
|
|
+- `getActiveUserStats()`:获取活跃用户统计
|
|
|
+
|
|
|
## 4. 收益分成机制
|
|
|
|
|
|
### 4.1 收益类型
|
|
|
@@ -118,9 +183,198 @@ private static function calculateTalentLevel(int $directCount, int $totalCount):
|
|
|
| 4级 | 10% | 5% | 2% |
|
|
|
| 5级 | 15% | 8% | 3% |
|
|
|
|
|
|
-## 5. 核心服务和逻辑
|
|
|
+## 5. 有效人数(活跃人数)系统
|
|
|
+
|
|
|
+### 5.1 活跃用户概念
|
|
|
+
|
|
|
+#### 5.1.1 定义和标准
|
|
|
+
|
|
|
+**活跃用户定义**:在最近15天内有活动记录的用户
|
|
|
+
|
|
|
+**判定标准**:
|
|
|
+- **数据源**:基于农场用户表的 `last_activity_time` 字段
|
|
|
+- **时间阈值**:15天(可配置)
|
|
|
+- **更新频率**:每日自动更新
|
|
|
+- **存储位置**:用户映射表的 `is_active` 字段
|
|
|
+
|
|
|
+#### 5.1.2 活跃状态字段说明
|
|
|
+
|
|
|
+| 字段名 | 类型 | 说明 |
|
|
|
+|--------|------|------|
|
|
|
+| `is_active` | TINYINT(1) | 是否活跃:1=活跃,0=不活跃 |
|
|
|
+| `last_activity_check` | TIMESTAMP | 最后活跃检查时间 |
|
|
|
+| `active_days_count` | INT | 活跃天数统计 |
|
|
|
+
|
|
|
+#### 5.1.3 业务价值
|
|
|
+
|
|
|
+1. **质量保证**:确保达人等级基于真实活跃用户
|
|
|
+2. **防刷机制**:避免僵尸用户影响等级评估
|
|
|
+3. **激励导向**:引导推广者关注用户质量而非数量
|
|
|
+4. **数据真实性**:提升推广体系的可信度
|
|
|
+
|
|
|
+### 5.2 活跃用户服务
|
|
|
+
|
|
|
+#### 5.2.1 UrsActiveUserService
|
|
|
+
|
|
|
+**核心常量**:
|
|
|
+```php
|
|
|
+const ACTIVE_DAYS_THRESHOLD = 15; // 活跃天数阈值
|
|
|
+```
|
|
|
+
|
|
|
+**主要方法**:
|
|
|
+```php
|
|
|
+// 更新单个用户活跃状态
|
|
|
+public static function updateUserActiveStatus(int $ursUserId): bool
|
|
|
+
|
|
|
+// 批量更新活跃状态
|
|
|
+public static function batchUpdateActiveStatus(array $ursUserIds): array
|
|
|
+
|
|
|
+// 检查用户活跃状态
|
|
|
+public static function checkUserActivity(User $user): bool
|
|
|
+
|
|
|
+// 获取活跃团队成员
|
|
|
+public static function getActiveTeamMembers(int $ursUserId): array
|
|
|
+
|
|
|
+// 获取活跃用户统计
|
|
|
+public static function getActiveUserStats(): array
|
|
|
+```
|
|
|
+
|
|
|
+#### 5.2.2 活跃状态判定逻辑
|
|
|
+
|
|
|
+```php
|
|
|
+public static function checkUserActivity(User $user): bool
|
|
|
+{
|
|
|
+ if (!$user->last_activity_time) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ $threshold = Carbon::now()->subDays(self::ACTIVE_DAYS_THRESHOLD);
|
|
|
+ return $user->last_activity_time >= $threshold;
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+#### 5.2.3 活跃团队统计
|
|
|
+
|
|
|
+```php
|
|
|
+public static function getActiveTeamMembers(int $ursUserId): array
|
|
|
+{
|
|
|
+ // 获取团队成员
|
|
|
+ $teamMembers = UrsReferralService::getTeamMembers($ursUserId);
|
|
|
+
|
|
|
+ // 统计活跃成员
|
|
|
+ $activeDirectCount = 0;
|
|
|
+ $activeTotalCount = 0;
|
|
|
+
|
|
|
+ // 返回活跃统计
|
|
|
+ return [
|
|
|
+ 'active_direct_count' => $activeDirectCount,
|
|
|
+ 'active_total_count' => $activeTotalCount,
|
|
|
+ 'active_members' => $activeMembers
|
|
|
+ ];
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 5.3 定时任务管理
|
|
|
|
|
|
-### 5.1 UrsTalentService(服务层)
|
|
|
+#### 5.3.1 UrsUpdateActiveStatusCommand
|
|
|
+
|
|
|
+**命令签名**:`urs:update-active-status`
|
|
|
+
|
|
|
+**支持参数**:
|
|
|
+- `--limit=N`:限制处理用户数量
|
|
|
+- `--dry-run`:试运行模式,不实际更新
|
|
|
+- `--reset`:重置所有用户活跃状态
|
|
|
+
|
|
|
+**执行示例**:
|
|
|
+```bash
|
|
|
+# 正常更新所有用户
|
|
|
+php artisan urs:update-active-status
|
|
|
+
|
|
|
+# 限制处理500个用户
|
|
|
+php artisan urs:update-active-status --limit=500
|
|
|
+
|
|
|
+# 试运行模式
|
|
|
+php artisan urs:update-active-status --dry-run
|
|
|
+
|
|
|
+# 重置所有状态
|
|
|
+php artisan urs:update-active-status --reset
|
|
|
+```
|
|
|
+
|
|
|
+#### 5.3.2 定时任务配置
|
|
|
+
|
|
|
+**Crontab配置**:
|
|
|
+```bash
|
|
|
+# 每日凌晨2点执行
|
|
|
+0 2 * * * cd /path/to/project && php artisan urs:update-active-status
|
|
|
+```
|
|
|
+
|
|
|
+**Laravel调度配置**:
|
|
|
+```php
|
|
|
+// 在 UCore/Providers/CommandServiceProvider.php 中注册
|
|
|
+$schedule->command('urs:update-active-status')->dailyAt('02:00');
|
|
|
+```
|
|
|
+
|
|
|
+### 5.4 活跃用户在达人等级中的应用
|
|
|
+
|
|
|
+#### 5.4.1 等级计算集成
|
|
|
+
|
|
|
+在达人等级计算中,活跃用户条件与基础条件并列:
|
|
|
+
|
|
|
+```php
|
|
|
+private static function calculateTalentLevel(
|
|
|
+ int $directCount,
|
|
|
+ int $totalCount,
|
|
|
+ int $activeDirectCount,
|
|
|
+ int $activeTotalCount
|
|
|
+): int {
|
|
|
+ foreach ($configs as $config) {
|
|
|
+ $basicConditionsMet = $directCount >= $config->direct_count_required
|
|
|
+ && $totalCount >= $config->promotion_count_required;
|
|
|
+
|
|
|
+ $activeConditionsMet = $activeDirectCount >= $config->active_direct_required
|
|
|
+ && $activeTotalCount >= $config->active_count_required;
|
|
|
+
|
|
|
+ if ($basicConditionsMet && $activeConditionsMet) {
|
|
|
+ return $config->level;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+#### 5.4.2 升级条件检查
|
|
|
+
|
|
|
+```php
|
|
|
+public static function checkUpgradeEligibility(int $userId): array
|
|
|
+{
|
|
|
+ // 获取活跃团队统计
|
|
|
+ $activeStats = UrsActiveUserService::getActiveTeamMembers($ursUserId);
|
|
|
+
|
|
|
+ // 检查各项条件
|
|
|
+ $activeDirectMet = $activeStats['active_direct_count'] >= $nextConfig->active_direct_required;
|
|
|
+ $activeTotalMet = $activeStats['active_total_count'] >= $nextConfig->active_count_required;
|
|
|
+
|
|
|
+ return [
|
|
|
+ 'eligible' => $basicConditionsMet && $activeConditionsMet,
|
|
|
+ 'requirements' => [
|
|
|
+ 'active_direct_count' => [
|
|
|
+ 'required' => $nextConfig->active_direct_required,
|
|
|
+ 'current' => $activeStats['active_direct_count'],
|
|
|
+ 'met' => $activeDirectMet,
|
|
|
+ ],
|
|
|
+ 'active_total_count' => [
|
|
|
+ 'required' => $nextConfig->active_count_required,
|
|
|
+ 'current' => $activeStats['active_total_count'],
|
|
|
+ 'met' => $activeTotalMet,
|
|
|
+ ],
|
|
|
+ ]
|
|
|
+ ];
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+## 6. 核心服务和逻辑
|
|
|
+
|
|
|
+### 6.1 UrsTalentService(服务层)
|
|
|
|
|
|
主要提供对外的静态服务方法:
|
|
|
|
|
|
@@ -141,7 +395,7 @@ class UrsTalentService
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-### 5.2 UrsTalentLogic(逻辑层)
|
|
|
+### 6.2 UrsTalentLogic(逻辑层)
|
|
|
|
|
|
处理具体的业务逻辑:
|
|
|
|
|
|
@@ -159,9 +413,9 @@ class UrsTalentLogic
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-## 6. 数据模型设计
|
|
|
+## 7. 数据模型设计
|
|
|
|
|
|
-### 6.1 UrsUserTalent(用户达人等级模型)
|
|
|
+### 7.1 UrsUserTalent(用户达人等级模型)
|
|
|
|
|
|
```php
|
|
|
class UrsUserTalent extends ModelCore
|
|
|
@@ -179,18 +433,20 @@ class UrsUserTalent extends ModelCore
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-### 6.2 UrsTalentConfig(达人等级配置模型)
|
|
|
+### 7.2 UrsTalentConfig(达人等级配置模型)
|
|
|
|
|
|
```php
|
|
|
class UrsTalentConfig extends ModelCore
|
|
|
{
|
|
|
protected $table = 'urs_promotion_talent_configs';
|
|
|
-
|
|
|
+
|
|
|
// 主要字段
|
|
|
// level: 等级
|
|
|
// name: 等级名称
|
|
|
// direct_count_required: 所需直推人数
|
|
|
// promotion_count_required: 所需团队总人数
|
|
|
+ // active_direct_required: 所需活跃直推人数
|
|
|
+ // active_count_required: 所需活跃团队总人数
|
|
|
// promotion_direct_group: 直推奖励组ID
|
|
|
// promotion_indirect_group: 间推奖励组ID
|
|
|
// promotion_third_group: 三推奖励组ID
|
|
|
@@ -200,9 +456,33 @@ class UrsTalentConfig extends ModelCore
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-## 7. 业务流程图
|
|
|
+### 7.3 UrsUserMapping(用户映射关系模型)
|
|
|
|
|
|
-### 7.1 达人等级升级流程
|
|
|
+```php
|
|
|
+class UrsUserMapping extends ModelCore
|
|
|
+{
|
|
|
+ protected $table = 'urs_promotion_user_mappings';
|
|
|
+
|
|
|
+ // 活跃状态相关字段
|
|
|
+ // is_active: 是否活跃(1=活跃,0=不活跃)
|
|
|
+ // last_activity_check: 最后活跃检查时间
|
|
|
+ // active_days_count: 活跃天数统计
|
|
|
+
|
|
|
+ // 活跃状态常量
|
|
|
+ const ACTIVE_NO = 0; // 不活跃
|
|
|
+ const ACTIVE_YES = 1; // 活跃
|
|
|
+
|
|
|
+ // 活跃用户相关方法
|
|
|
+ public function isActive(): bool;
|
|
|
+ public static function getActiveUrsUserIds(array $ursUserIds): array;
|
|
|
+ public static function getActiveUserStats(): array;
|
|
|
+ public static function batchUpdateActiveStatus(array $activeData): int;
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+## 8. 业务流程图
|
|
|
+
|
|
|
+### 8.1 达人等级升级流程
|
|
|
|
|
|
```mermaid
|
|
|
graph TD
|
|
|
@@ -224,7 +504,7 @@ graph TD
|
|
|
M --> N[返回达人信息]
|
|
|
```
|
|
|
|
|
|
-### 7.2 收益分成流程
|
|
|
+### 8.2 收益分成流程
|
|
|
|
|
|
```mermaid
|
|
|
graph TD
|
|
|
@@ -245,9 +525,9 @@ graph TD
|
|
|
M -->|否| N[分成完成]
|
|
|
```
|
|
|
|
|
|
-## 8. 配置管理
|
|
|
+## 9. 配置管理
|
|
|
|
|
|
-### 8.1 等级配置表结构
|
|
|
+### 9.1 等级配置表结构
|
|
|
|
|
|
```sql
|
|
|
CREATE TABLE `kku_urs_promotion_talent_configs` (
|
|
|
@@ -256,6 +536,8 @@ CREATE TABLE `kku_urs_promotion_talent_configs` (
|
|
|
`name` varchar(50) NOT NULL COMMENT '等级名称',
|
|
|
`direct_count_required` int NOT NULL DEFAULT '0' COMMENT '所需直推人数',
|
|
|
`promotion_count_required` int NOT NULL DEFAULT '0' COMMENT '所需团队总人数',
|
|
|
+ `active_direct_required` int NOT NULL DEFAULT '0' COMMENT '所需活跃直推人数',
|
|
|
+ `active_count_required` int NOT NULL DEFAULT '0' COMMENT '所需活跃团队总人数',
|
|
|
`icon` varchar(255) DEFAULT NULL COMMENT '等级图标',
|
|
|
`description` text COMMENT '等级描述',
|
|
|
`sort_order` int NOT NULL DEFAULT '0' COMMENT '排序权重',
|
|
|
@@ -275,7 +557,19 @@ CREATE TABLE `kku_urs_promotion_talent_configs` (
|
|
|
);
|
|
|
```
|
|
|
|
|
|
-### 8.2 配置管理方法
|
|
|
+### 9.2 用户映射表活跃字段结构
|
|
|
+
|
|
|
+```sql
|
|
|
+-- 为用户映射表添加活跃状态字段
|
|
|
+ALTER TABLE `kku_urs_promotion_user_mappings`
|
|
|
+ADD COLUMN `is_active` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '是否活跃:1活跃,0不活跃' AFTER `status`,
|
|
|
+ADD COLUMN `last_activity_check` TIMESTAMP NULL COMMENT '最后活跃检查时间' AFTER `is_active`,
|
|
|
+ADD COLUMN `active_days_count` INT NOT NULL DEFAULT '0' COMMENT '活跃天数统计' AFTER `last_activity_check`,
|
|
|
+ADD INDEX `idx_is_active` (`is_active`),
|
|
|
+ADD INDEX `idx_last_activity_check` (`last_activity_check`);
|
|
|
+```
|
|
|
+
|
|
|
+### 9.3 配置管理方法
|
|
|
|
|
|
```php
|
|
|
// 获取推广收益奖励组ID
|
|
|
@@ -308,9 +602,9 @@ public function meetsRequirements(int $directCount, int $promotionCount): bool
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-## 9. 使用示例
|
|
|
+## 10. 使用示例
|
|
|
|
|
|
-### 9.1 更新用户达人等级
|
|
|
+### 10.1 更新用户达人等级
|
|
|
|
|
|
```php
|
|
|
use App\Module\UrsPromotion\Services\UrsTalentService;
|
|
|
@@ -324,7 +618,7 @@ echo "直推人数:{$talentDto->directCount}";
|
|
|
echo "团队总人数:{$talentDto->promotionCount}";
|
|
|
```
|
|
|
|
|
|
-### 9.2 批量更新达人等级
|
|
|
+### 10.2 批量更新达人等级
|
|
|
|
|
|
```php
|
|
|
// 批量更新多个用户的达人等级
|
|
|
@@ -340,7 +634,7 @@ foreach ($results as $ursUserId => $result) {
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-### 9.3 获取用户达人信息
|
|
|
+### 10.3 获取用户达人信息
|
|
|
|
|
|
```php
|
|
|
// 获取用户的达人信息
|
|
|
@@ -354,7 +648,7 @@ if ($talentDto) {
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-### 9.4 获取等级配置
|
|
|
+### 10.4 获取等级配置
|
|
|
|
|
|
```php
|
|
|
// 获取所有达人等级配置
|
|
|
@@ -367,9 +661,9 @@ foreach ($configs as $config) {
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-## 10. 事件系统
|
|
|
+## 11. 事件系统
|
|
|
|
|
|
-### 10.1 达人等级升级事件
|
|
|
+### 11.1 达人等级升级事件
|
|
|
|
|
|
```php
|
|
|
use App\Module\UrsPromotion\Events\UrsTalentLevelUpEvent;
|
|
|
@@ -402,7 +696,7 @@ if ($newLevel > $talent->talent_level) {
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-### 10.2 事件监听器
|
|
|
+### 11.2 事件监听器
|
|
|
|
|
|
```php
|
|
|
use App\Module\UrsPromotion\Listeners\UrsTalentLevelUpListener;
|
|
|
@@ -426,9 +720,9 @@ class UrsTalentLevelUpListener
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-## 11. 数据统计和分析
|
|
|
+## 12. 数据统计和分析
|
|
|
|
|
|
-### 11.1 达人等级分布统计
|
|
|
+### 12.1 达人等级分布统计
|
|
|
|
|
|
```php
|
|
|
use App\Module\UrsPromotion\Models\UrsUserTalent;
|
|
|
@@ -448,7 +742,7 @@ foreach ($levelDistribution as $level => $count) {
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-### 11.2 团队规模统计
|
|
|
+### 12.2 团队规模统计
|
|
|
|
|
|
```php
|
|
|
// 获取团队规模统计
|
|
|
@@ -467,7 +761,7 @@ echo "平均团队总人数:{$teamStats->avg_total}";
|
|
|
echo "最大团队规模:{$teamStats->max_team_size}";
|
|
|
```
|
|
|
|
|
|
-### 11.3 达人排行榜
|
|
|
+### 12.3 达人排行榜
|
|
|
|
|
|
```php
|
|
|
// 获取达人排行榜(按团队总人数排序)
|
|
|
@@ -484,9 +778,9 @@ foreach ($topTalents as $index => $talent) {
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-## 12. 性能优化
|
|
|
+## 13. 性能优化
|
|
|
|
|
|
-### 12.1 缓存策略
|
|
|
+### 13.1 缓存策略
|
|
|
|
|
|
```php
|
|
|
use Illuminate\Support\Facades\Cache;
|
|
|
@@ -520,7 +814,7 @@ class UrsTalentService
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-### 12.2 批量处理优化
|
|
|
+### 13.2 批量处理优化
|
|
|
|
|
|
```php
|
|
|
// 批量更新优化
|
|
|
@@ -554,9 +848,9 @@ public static function batchUpdateTalentLevelsOptimized(array $ursUserIds): arra
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-## 13. 测试和调试
|
|
|
+## 14. 测试和调试
|
|
|
|
|
|
-### 13.1 单元测试示例
|
|
|
+### 14.1 单元测试示例
|
|
|
|
|
|
```php
|
|
|
use Tests\TestCase;
|
|
|
@@ -593,7 +887,7 @@ class UrsTalentServiceTest extends TestCase
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-### 13.2 调试命令
|
|
|
+### 14.2 调试命令
|
|
|
|
|
|
```php
|
|
|
use Illuminate\Console\Command;
|
|
|
@@ -634,9 +928,9 @@ class TestUrsTalentCommand extends Command
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-## 14. 注意事项和最佳实践
|
|
|
+## 15. 注意事项和最佳实践
|
|
|
|
|
|
-### 14.1 开发注意事项
|
|
|
+### 15.1 开发注意事项
|
|
|
|
|
|
1. **数据一致性**
|
|
|
- 所有涉及等级更新的操作必须使用数据库事务
|
|
|
@@ -658,7 +952,7 @@ class TestUrsTalentCommand extends Command
|
|
|
- 等级配置修改需要管理员权限
|
|
|
- 防止恶意刷等级行为
|
|
|
|
|
|
-### 14.2 维护建议
|
|
|
+### 15.2 维护建议
|
|
|
|
|
|
1. **定期检查**
|
|
|
- 定期检查团队统计数据的准确性
|
|
|
@@ -675,7 +969,7 @@ class TestUrsTalentCommand extends Command
|
|
|
- 监控异常升级的用户
|
|
|
- 监控系统性能指标
|
|
|
|
|
|
-### 14.3 扩展考虑
|
|
|
+### 15.3 扩展考虑
|
|
|
|
|
|
1. **等级体系扩展**
|
|
|
- 预留更高等级的扩展空间
|
|
|
@@ -692,9 +986,9 @@ class TestUrsTalentCommand extends Command
|
|
|
- 支持时间段内的活跃度统计
|
|
|
- 支持团队质量评估
|
|
|
|
|
|
-## 15. 常见问题解答
|
|
|
+## 16. 常见问题解答
|
|
|
|
|
|
-### 15.1 等级计算相关
|
|
|
+### 16.1 等级计算相关
|
|
|
|
|
|
**Q: 为什么我的团队人数够了但等级没有升级?**
|
|
|
A: 达人等级升级需要同时满足直推人数和团队总人数两个条件,请检查直推人数是否达标。
|
|
|
@@ -705,7 +999,7 @@ A: 系统会在团队成员变化时自动触发等级更新,同时也支持
|
|
|
**Q: 等级会降级吗?**
|
|
|
A: 默认情况下等级只升不降,除非有特殊的业务需求或管理员手动调整。
|
|
|
|
|
|
-### 15.2 收益分成相关
|
|
|
+### 16.2 收益分成相关
|
|
|
|
|
|
**Q: 收益分成是如何计算的?**
|
|
|
A: 根据用户的达人等级和推荐关系层级,按照配置的分成比例进行计算。推广收益使用固定奖励组,种植收益使用比例分成。
|
|
|
@@ -716,7 +1010,7 @@ A: 系统会跳过未进入农场的用户,继续向上级分发收益,确
|
|
|
**Q: 分成比例可以修改吗?**
|
|
|
A: 分成比例支持后台配置修改,但修改只影响新产生的收益,不会影响历史收益记录。
|
|
|
|
|
|
-### 15.3 技术实现相关
|
|
|
+### 16.3 技术实现相关
|
|
|
|
|
|
**Q: 如何处理大量用户的等级更新?**
|
|
|
A: 使用批量处理机制,分批更新用户等级,避免内存溢出和数据库压力过大。
|
|
|
@@ -727,25 +1021,41 @@ A: 用户达人信息缓存1小时,等级配置缓存2小时,在数据更新
|
|
|
**Q: 如何保证数据一致性?**
|
|
|
A: 所有涉及多表操作的功能都使用数据库事务,确保数据的一致性和完整性。
|
|
|
|
|
|
-## 16. 总结
|
|
|
+### 16.4 活跃用户相关
|
|
|
+
|
|
|
+**Q: 什么是活跃用户?如何判定?**
|
|
|
+A: 活跃用户是指最近15天内有活动记录的用户,基于农场用户的 `last_activity_time` 字段判定。系统每日自动更新活跃状态。
|
|
|
+
|
|
|
+**Q: 活跃用户条件是否会影响已有的达人等级?**
|
|
|
+A: 活跃用户条件是新增的升级要求,与原有条件并列。如果用户的活跃团队成员不足,可能会影响等级升级,但不会导致等级降级。
|
|
|
+
|
|
|
+**Q: 如何提高团队的活跃度?**
|
|
|
+A: 推广者应该关注推荐用户的质量,引导用户积极参与农场活动,而不是单纯追求推荐数量。
|
|
|
+
|
|
|
+**Q: 活跃状态更新失败怎么办?**
|
|
|
+A: 可以使用命令 `php artisan urs:update-active-status --limit=100` 进行小批量重试,或联系技术人员检查系统状态。
|
|
|
+
|
|
|
+## 17. 总结
|
|
|
|
|
|
-URS推广模块的达人等级系统是一个完整的用户激励体系,通过6级达人等级、双重升级条件、三代收益分成等机制,有效激励用户发展团队,提升用户活跃度和粘性。
|
|
|
+URS推广模块的达人等级系统是一个完整的用户激励体系,通过6级达人等级、四重升级条件(直推人数、团队总人数、活跃直推人数、活跃团队总人数)、三代收益分成等机制,有效激励用户发展高质量团队,提升用户活跃度和粘性。
|
|
|
|
|
|
-### 16.1 核心优势
|
|
|
+### 17.1 核心优势
|
|
|
|
|
|
1. **体系完整**:从等级定义到收益分成,形成完整的激励闭环
|
|
|
-2. **配置灵活**:支持后台配置管理,适应业务发展需要
|
|
|
-3. **性能优化**:采用缓存、批量处理等优化策略,保证系统性能
|
|
|
-4. **扩展性强**:预留扩展接口,支持未来业务发展需求
|
|
|
+2. **质量导向**:引入活跃用户概念,确保推广体系的真实性和有效性
|
|
|
+3. **配置灵活**:支持后台配置管理,适应业务发展需要
|
|
|
+4. **性能优化**:采用缓存、批量处理等优化策略,保证系统性能
|
|
|
+5. **扩展性强**:预留扩展接口,支持未来业务发展需求
|
|
|
|
|
|
-### 16.2 应用价值
|
|
|
+### 17.2 应用价值
|
|
|
|
|
|
-1. **用户激励**:通过等级差异化收益,激励用户积极发展团队
|
|
|
-2. **社交裂变**:推荐关系形成社交网络,促进用户增长
|
|
|
-3. **收益分配**:公平透明的收益分成机制,提升用户满意度
|
|
|
-4. **数据驱动**:完整的统计分析功能,支持运营决策
|
|
|
+1. **用户激励**:通过等级差异化收益,激励用户积极发展高质量团队
|
|
|
+2. **质量保证**:活跃用户机制确保推广体系的真实性和可持续性
|
|
|
+3. **社交裂变**:推荐关系形成社交网络,促进用户增长
|
|
|
+4. **收益分配**:公平透明的收益分成机制,提升用户满意度
|
|
|
+5. **数据驱动**:完整的统计分析功能,支持运营决策
|
|
|
|
|
|
-### 16.3 持续优化
|
|
|
+### 17.3 持续优化
|
|
|
|
|
|
达人等级系统作为核心业务功能,需要持续关注用户反馈,优化升级条件和收益配置,确保系统的公平性和激励效果。同时要关注系统性能,及时优化查询和计算逻辑,保证用户体验。
|
|
|
|