Quellcode durchsuchen

优化计算团队贡献值逻辑

sunxiaobiao vor 1 Jahr
Ursprung
Commit
66fc714ca5
1 geänderte Dateien mit 72 neuen und 48 gelöschten Zeilen
  1. 72 48
      app/common/repositories/user/UserRepository.php

+ 72 - 48
app/common/repositories/user/UserRepository.php

@@ -2492,7 +2492,7 @@ class UserRepository extends BaseRepository
2492 2492
     }
2493 2493
     public function get_yanglao($member_id){
2494 2494
 
2495
-       
2495
+
2496 2496
         $data = Db::name("user")
2497 2497
             ->where("uid",$member_id)
2498 2498
             ->field("wechat_user_id,card_id,ali_user_id,annuity_frozen,annuity_num,annuity,create_time,birthday,birthday60,card_number,annuity_yiqu,pay_price")
@@ -2553,7 +2553,7 @@ class UserRepository extends BaseRepository
2553 2553
 //        $data["yinghang"]='https://app.bjtdba.com/uploads/def/20201021/8cb66944101287b8ac9c9b9fb1b13a79.png';
2554 2554
         $data["add_up"] = 0.00;
2555 2555
 
2556
-     
2556
+
2557 2557
 
2558 2558
         return $data;
2559 2559
     }
@@ -3273,9 +3273,9 @@ class UserRepository extends BaseRepository
3273 3273
         $lowerLevelNumMin = min($lowerLevelNumList);
3274 3274
         // 获取需要 递归最深的层数,比如 高级合伙人需要递归10层 普通用户需要递归一层
3275 3275
         $needLower = 0;
3276
-        // 0 代表要递归无限极
3277
-        if($lowerLevelNumMax > 0) {
3278
-            $needLower = $lowerLevelNumMin - 1;
3276
+        // 0 代表要递归无限极 -1 代表一级也不查
3277
+        if($lowerLevelNumMin > 0) {
3278
+            $needLower = $lowerLevelNumMax;
3279 3279
         }
3280 3280
         // 最大等级限制
3281 3281
         $maxLvRestrict = 0;
@@ -3287,28 +3287,17 @@ class UserRepository extends BaseRepository
3287 3287
         $determineResult = $this->determineUserUpgradeTime($uid);
3288 3288
         $userData['user_group'] = $determineResult['user_group'];
3289 3289
         $userData['identity_up_time'] = $determineResult['identity_up_time'];
3290
-        if ($userData['user_group'] == 1) {
3290
+        $startTime = $userData['identity_up_time'];
3291
+        $endTime = date('Y-m-d H:i:s');
3292
+
3293
+        // 如果用户身份 为 用户 或者 升级成业务员的时间为空 则无法计算它的团队贡献值
3294
+        if ($userData['user_group'] == 1 || empty($startTime)) {
3291 3295
             $maxLvRestrict = 2;
3296
+            $needLower = -1;
3292 3297
         }
3293 3298
 
3294 3299
         // 4、获取下级用户 贡献值
3295
-        $userContributionSumMap = [];
3296
-        // 获取用户的直属下级
3297
-        $uidContributeList = $this->getUidContributeListBySpreadUidList([$uid]);
3298
-        foreach ($uidContributeList as $uidContribute) {
3299
-            // 获取每个下级(部门)的个人贡献值
3300
-            $userContributionSumMap[$uidContribute['uid']] = $this->getContributionSumByLevel(
3301
-                [$uidContribute['uid']],
3302
-                $needLower,
3303
-                $userData['is_old'],
3304
-                $userData['identity_up_time'] ?? null
3305
-            );
3306
-            $userContributionSumMap[$uidContribute['uid']][0] = $uidContribute['contribute'];
3307
-            ksort($userContributionSumMap[$uidContribute['uid']]);
3308
-            // 假设 老大的 下级是 张三和李四, 董事(最高级身份)需要循环最深的等级是 3 级    得出来的结果↓  这样是为了计算大小部门
3309
-            // $userContributionSumMap[直属下级(部门)张三] =>[0 => 张三个人贡献值, 1 => 张三所有下级用户的个人贡献值, 2 => 张三所有下级用户的下级用户贡献值]
3310
-            // $userContributionSumMap[直属下级(部门)李四] =>[0 => 李四个人贡献值, 1 => 李四所有下级用户的个人贡献值, 2 => 李四所有下级用户的下级用户贡献值]
3311
-        }
3300
+        $userContributionSumMap = $this->getSubordinateContributeByUid($uid, $startTime, $endTime, $needLower);
3312 3301
 
3313 3302
         // 5、将用户等级由低到高
3314 3303
         usort($identityList, function ($a, $b) {
@@ -3704,6 +3693,60 @@ class UserRepository extends BaseRepository
3704 3693
         return $subordinatesOfCurrentLevelUidList;
3705 3694
     }
3706 3695
 
3696
+
3697
+    /**
3698
+     * 根据时间和递归层级 获取部门下 每一层级的 贡献值
3699
+     *  假设 老大的 下级是 张三和李四, 董事(最高级身份)需要循环最深的等级是 3 级    得出来的结果↓  这样是为了计算大小部门
3700
+     * $userContributionSumMap[直属下级(部门)张三] =>[0 => 张三个人贡献值, 1 => 张三所有下级用户的个人贡献值, 2 => 张三所有下级用户的下级用户贡献值]
3701
+     * $userContributionSumMap[直属下级(部门)李四] =>[0 => 李四个人贡献值, 1 => 李四所有下级用户的个人贡献值, 2 => 李四所有下级用户的下级用户贡献值]
3702
+     * @param $uid
3703
+     * @param null $startTime
3704
+     * @param null $endTime
3705
+     * @param int $depth
3706
+     * @return array
3707
+     * @throws DataNotFoundException
3708
+     * @throws DbException
3709
+     * @throws ModelNotFoundException
3710
+     */
3711
+    public function getSubordinateContributeByUid($uid, $startTime, $endTime, $depth = 10)
3712
+    {
3713
+        // 4、获取下级用户 贡献值
3714
+        $userContributionSumMap = [];
3715
+        if ($depth >= 0 && !empty($startTime)) {
3716
+            // 获取用户的直属下级
3717
+            $uidContributeList = $this->getUidContributeListBySpreadUidList([$uid]);
3718
+            $uidContributeUidList = array_column($uidContributeList, 'uid');
3719
+            $subordinatesOfCurrentLevelUidList = $this->getUserContributeByUidList($uidContributeUidList, $startTime, $endTime);
3720
+
3721
+            foreach ($uidContributeList as $uidContribute) {
3722
+                $goOnDepth = $depth;
3723
+                // 获取用户规定时间内 所产生的贡献值 第一级
3724
+                $userContributionSumMap[$uidContribute['uid']][0] = $subordinatesOfCurrentLevelUidList[$uidContribute['uid']] ?? 0;
3725
+                if ($depth == 1) {
3726
+                    break;
3727
+                } else if ($depth > 1){
3728
+                    $goOnDepth = $depth - 1;
3729
+                }
3730
+                // 获取每个下级(部门)的个人贡献值 $goOnDepth = 0 时表示无限递归
3731
+                $userContributionSumMap[$uidContribute['uid']] = $this->getContributionSumByLevel(
3732
+                    [$uidContribute['uid']],
3733
+                    $goOnDepth,
3734
+                    0,
3735
+                    $startTime,
3736
+                    $endTime
3737
+                );
3738
+
3739
+                if (!empty($userContributionSumMap[$uidContribute['uid']])) {
3740
+                    ksort($userContributionSumMap[$uidContribute['uid']]);
3741
+                }
3742
+                // 假设 老大的 下级是 张三和李四, 董事(最高级身份)需要循环最深的等级是 3 级    得出来的结果↓  这样是为了计算大小部门
3743
+                // $userContributionSumMap[直属下级(部门)张三] =>[0 => 张三个人贡献值, 1 => 张三所有下级用户的个人贡献值, 2 => 张三所有下级用户的下级用户贡献值]
3744
+                // $userContributionSumMap[直属下级(部门)李四] =>[0 => 李四个人贡献值, 1 => 李四所有下级用户的个人贡献值, 2 => 李四所有下级用户的下级用户贡献值]
3745
+            }
3746
+        }
3747
+        return $userContributionSumMap;
3748
+    }
3749
+
3707 3750
     /**
3708 3751
      * 获取用户 团队贡献值信息
3709 3752
      * @param $uid
@@ -3736,41 +3779,22 @@ class UserRepository extends BaseRepository
3736 3779
 
3737 3780
         // 如果用户身份是  用户  则
3738 3781
         /**
3782
+         *  如果用户身份是 用户,则不计算团队贡献值,因计算团队贡献值 需要升级成业务员后 再进行进行统计
3783
+         *  如用户也统计团队贡献值可能会导致: 用户进入系统后,不进行消费,团队贡献值确增长迅速,等某时刻 他只要 进行消费,身份就会快速跃迁,不公平
3739 3784
          * (1)达标贡献值=自己消费产生的贡献值
3740
-         * (2)团队达标贡献值=小区团队的贡献值(用户的团队贡献值只统计一级);如果团队只有一人,那团队贡献值就是0
3785
+         * (2)团队达标贡献值= 不计算团队
3741 3786
          */
3742 3787
         if ($userData['user_group'] == 1) {
3743
-            $depth = 1;
3788
+            $depth = -1;
3744 3789
         }
3745 3790
 
3746 3791
         // 4、获取下级用户 贡献值
3747
-        $userContributionSumMap = [];
3748
-        // 获取用户的直属下级
3749
-        $uidContributeList = $this->getUidContributeListBySpreadUidList([$uid]);
3750
-        $uidContributeUidList = array_column($uidContributeList, 'uid');
3751
-        // TODO 身份是用户的 $startTime = null
3752
-        $subordinatesOfCurrentLevelUidList = $this->getUserContributeByUidList($uidContributeUidList, $startTime, $endTime);
3753
-
3754
-        foreach ($uidContributeList as $uidContribute) {
3755
-            // 获取每个下级(部门)的个人贡献值
3756
-            $userContributionSumMap[$uidContribute['uid']] = $this->getContributionSumByLevel(
3757
-                [$uidContribute['uid']],
3758
-                $depth,
3759
-                $userData['is_old'],
3760
-                $startTime,
3761
-                $endTime
3762
-            );
3763
-            $userContributionSumMap[$uidContribute['uid']][0] = $subordinatesOfCurrentLevelUidList[$uidContribute['uid']];
3764
-            ksort($userContributionSumMap[$uidContribute['uid']]);
3765
-            // 假设 老大的 下级是 张三和李四, 董事(最高级身份)需要循环最深的等级是 3 级    得出来的结果↓  这样是为了计算大小部门
3766
-            // $userContributionSumMap[直属下级(部门)张三] =>[0 => 张三个人贡献值, 1 => 张三所有下级用户的个人贡献值, 2 => 张三所有下级用户的下级用户贡献值]
3767
-            // $userContributionSumMap[直属下级(部门)李四] =>[0 => 李四个人贡献值, 1 => 李四所有下级用户的个人贡献值, 2 => 李四所有下级用户的下级用户贡献值]
3768
-        }
3769
-
3792
+        $userContributionSumMap = $this->getSubordinateContributeByUid($uid, $startTime, $endTime, $depth);
3770 3793
         $subordinateContribution = [];
3771 3794
         foreach ($userContributionSumMap as $key => $value) {
3772 3795
             $subordinateContribution[$key] = array_sum($value);
3773 3796
         }
3797
+
3774 3798
         $dqYj = 0;
3775 3799
         $arriveNumTeam = 0;
3776 3800
         if (!empty($subordinateContribution)) {