浏览代码

修改我的-团队贡献值查询方式

sunxiaobiao 1 年之前
父节点
当前提交
be30cf1d02
共有 2 个文件被更改,包括 173 次插入5 次删除
  1. 160 5
      app/common/repositories/user/UserRepository.php
  2. 13 0
      app/controller/api/user/User.php

+ 160 - 5
app/common/repositories/user/UserRepository.php

@@ -3280,12 +3280,59 @@ class UserRepository extends BaseRepository
3280 3280
 
3281 3281
         // 3、获取个人贡献值
3282 3282
         $userData = $this->dao->get($uid)->toArray();
3283
-        if ($userData['is_old'] == 1 && $userData['user_group'] > 1 && empty($userData['identity_up_time'])) {
3284
-            if (empty($userData['create_time'])) {
3285
-                return $userData['user_group'];
3283
+        // 这一步骤是为了 确定用户升级时间,因为后边的团队贡献值,需要查询 用户 升级为业务员后 所产生的团队贡献值
3284
+        if (empty($userData['identity_up_time'])) {
3285
+            // 老用户的身份 升级时间已无法确定, 则采用用户的创建时间
3286
+            if ($userData['is_old'] == 1 && $userData['user_group'] > 1) {
3287
+                if (empty($userData['create_time'])) {
3288
+                    return $userData['user_group'];
3289
+                }
3290
+                $userData['identity_up_time'] = $userData['create_time'];
3291
+                $this->dao->update($uid, ['identity_up_time' => $userData['identity_up_time']]);
3292
+            }
3293
+            // 如果是新用户 则 根绝他的贡献值记录表 确认成为业务员的时间
3294
+            if ($userData['is_old'] == 0) {
3295
+                $upArriveNumOwn = 0;
3296
+                $yeWuYuanId = 0;
3297
+                foreach ($identityList as $value) {
3298
+                    if ($value['user_group_name'] == '业务员') {
3299
+                        $upArriveNumOwn = $value['arrive_num_own'];
3300
+                        $yeWuYuanId = $value['user_group_id'];
3301
+                        break;
3302
+                    }
3303
+                }
3304
+                if (!empty($upArriveNumOwn)) {
3305
+                    $userSignGongxianList = Db::name('user_sign_gongxian')
3306
+                        ->where('uid', $uid)
3307
+                        ->where('status', 1) // 贡献值状态1-有效 0-失效 -1待确认
3308
+                        ->whereNotNull('settlement_time') // `settlement_time` datetime DEFAULT NULL COMMENT '结算时间',
3309
+                        ->order('id asc')
3310
+                        ->field('uid, number, type, settlement_time') // 只需要下级的uid和贡献值
3311
+                        ->select()
3312
+                        ->toArray();
3313
+                    $myArriveNumOwn = 0;
3314
+                    $myIdentityUpTime = '';
3315
+                    foreach ($userSignGongxianList as $value) {
3316
+                        if ($value['type'] == 1) {
3317
+                            $myArriveNumOwn += $value['number'];
3318
+                        } else {
3319
+                            $myArriveNumOwn -= $value['number'];
3320
+                        }
3321
+                        if ($myArriveNumOwn >= $upArriveNumOwn) {
3322
+                            $myIdentityUpTime = $value['settlement_time'];
3323
+                            break;
3324
+                        }
3325
+                    }
3326
+                    if (!empty($myIdentityUpTime) && !empty($yeWuYuanId)) {
3327
+                        $userData['identity_up_time'] = $userData['create_time'];
3328
+                        $userData['user_group'] = $yeWuYuanId;
3329
+                        $this->dao->update($uid, [
3330
+                            'identity_up_time' => $myIdentityUpTime,
3331
+                            'user_group' => $yeWuYuanId
3332
+                        ]);
3333
+                    }
3334
+                }
3286 3335
             }
3287
-            $userData['identity_up_time'] = $userData['create_time'];
3288
-            $this->dao->update($uid, ['identity_up_time' => $userData['identity_up_time']]);
3289 3336
         }
3290 3337
         if ($userData['user_group'] == 1) {
3291 3338
             $maxLvRestrict = 2;
@@ -3532,4 +3579,112 @@ class UserRepository extends BaseRepository
3532 3579
 
3533 3580
         return $levelContributions;
3534 3581
     }
3582
+
3583
+    public function getUserContributeInfoByDepth($uid, $depth = 10)
3584
+    {
3585
+        // 3、获取个人贡献值
3586
+        $userData = $this->dao->get($uid)->toArray();
3587
+        // 这一步骤是为了 确定用户升级时间,因为后边的团队贡献值,需要查询 用户 升级为业务员后 所产生的团队贡献值
3588
+        if (empty($userData['identity_up_time'])) {
3589
+            // 老用户的身份 升级时间已无法确定, 则采用用户的创建时间
3590
+            if ($userData['is_old'] == 1 && $userData['user_group'] > 1) {
3591
+                if (empty($userData['create_time'])) {
3592
+                    return $userData['user_group'];
3593
+                }
3594
+                $userData['identity_up_time'] = $userData['create_time'];
3595
+                $this->dao->update($uid, ['identity_up_time' => $userData['identity_up_time']]);
3596
+            }
3597
+            // 如果是新用户 则 根绝他的贡献值记录表 确认成为业务员的时间
3598
+            if ($userData['is_old'] == 0) {
3599
+                $upArriveNumOwn = 0;
3600
+                $yeWuYuanId = 0;
3601
+                // 1、获取所有等级信息
3602
+                /** @var UserIdentityRepository $identityRepository */
3603
+                $identityRepository = app()->make(UserIdentityRepository::class);
3604
+                $identityList = $identityRepository->getIdentityList();
3605
+                foreach ($identityList as $value) {
3606
+                    if ($value['user_group_name'] == '业务员') {
3607
+                        $upArriveNumOwn = $value['arrive_num_own'];
3608
+                        $yeWuYuanId = $value['user_group_id'];
3609
+                        break;
3610
+                    }
3611
+                }
3612
+                if (!empty($upArriveNumOwn)) {
3613
+                    $userSignGongxianList = Db::name('user_sign_gongxian')
3614
+                        ->where('uid', $uid)
3615
+                        ->where('status', 1) // 贡献值状态1-有效 0-失效 -1待确认
3616
+                        ->whereNotNull('settlement_time') // `settlement_time` datetime DEFAULT NULL COMMENT '结算时间',
3617
+                        ->order('id asc')
3618
+                        ->field('uid, number, type, settlement_time') // 只需要下级的uid和贡献值
3619
+                        ->select()
3620
+                        ->toArray();
3621
+                    $myArriveNumOwn = 0;
3622
+                    $myIdentityUpTime = '';
3623
+                    foreach ($userSignGongxianList as $value) {
3624
+                        if ($value['type'] == 1) {
3625
+                            $myArriveNumOwn += $value['number'];
3626
+                        } else {
3627
+                            $myArriveNumOwn -= $value['number'];
3628
+                        }
3629
+                        if ($myArriveNumOwn >= $upArriveNumOwn) {
3630
+                            $myIdentityUpTime = $value['settlement_time'];
3631
+                            break;
3632
+                        }
3633
+                    }
3634
+                    if (!empty($myIdentityUpTime) && !empty($yeWuYuanId)) {
3635
+                        $userData['identity_up_time'] = $userData['create_time'];
3636
+                        $userData['user_group'] = $yeWuYuanId;
3637
+                        $this->dao->update($uid, [
3638
+                            'identity_up_time' => $userData['identity_up_time'],
3639
+                            'user_group' => $yeWuYuanId
3640
+                        ]);
3641
+                    }
3642
+                }
3643
+            }
3644
+        }
3645
+
3646
+        // 如果用户身份是  用户  则
3647
+        /**
3648
+         * (1)达标贡献值=自己消费产生的贡献值
3649
+         * (2)团队达标贡献值=小区团队的贡献值(用户的团队贡献值只统计一级);如果团队只有一人,那团队贡献值就是0
3650
+         */
3651
+        if ($userData['user_group'] == 1) {
3652
+            $depth = 1;
3653
+        }
3654
+
3655
+        // 4、获取下级用户 贡献值
3656
+        $userContributionSumMap = [];
3657
+        // 获取用户的直属下级
3658
+        $uidContributeList = $this->getUidContributeListBySpreadUidList([$uid]);
3659
+        foreach ($uidContributeList as $uidContribute) {
3660
+            // 获取每个下级(部门)的个人贡献值
3661
+            $userContributionSumMap[$uidContribute['uid']] = $this->getContributionSumByLevel(
3662
+                [$uidContribute['uid']],
3663
+                $depth,
3664
+                $userData['is_old'],
3665
+                $userData['identity_up_time'] ?? null
3666
+            );
3667
+            $userContributionSumMap[$uidContribute['uid']][0] = $uidContribute['contribute'];
3668
+            // 假设 老大的 下级是 张三和李四, 董事(最高级身份)需要循环最深的等级是 3 级    得出来的结果↓  这样是为了计算大小部门
3669
+            // $userContributionSumMap[直属下级(部门)张三] =>[0 => 张三个人贡献值, 1 => 张三所有下级用户的个人贡献值, 2 => 张三所有下级用户的下级用户贡献值]
3670
+            // $userContributionSumMap[直属下级(部门)李四] =>[0 => 李四个人贡献值, 1 => 李四所有下级用户的个人贡献值, 2 => 李四所有下级用户的下级用户贡献值]
3671
+        }
3672
+
3673
+        $subordinateContribution = [];
3674
+        foreach ($userContributionSumMap as $key => $value) {
3675
+            $subordinateContribution[$key] = array_sum($value);
3676
+        }
3677
+        $arriveNumTeam = 0;
3678
+        if (!empty($subordinateContribution)) {
3679
+            // 大区业绩
3680
+            $dqYj = max($subordinateContribution);
3681
+            // 总业绩
3682
+            $zYj = array_sum($subordinateContribution);
3683
+            // 小区团体业绩
3684
+            $arriveNumTeam = bcsub($zYj, $dqYj, 2);
3685
+        }
3686
+
3687
+        return ['arriveNumTeam' => $arriveNumTeam, 'contribute' => $userData['contribute'], 'per_contribute' => $userData['per_contribute']];
3688
+
3689
+    }
3535 3690
 }

+ 13 - 0
app/controller/api/user/User.php

@@ -310,6 +310,19 @@ class User extends BaseController
310 310
         log::info("============gongxianinfo");
311 311
         $user = $this->request->userInfo();
312 312
         if($user->uid>0){
313
+            $con = DB::name('user')->where('uid', $user->uid)->find();
314
+            // 先去更新一下用户身份
315
+            $number = Db::name("system_config_value")->where(["config_key" => "team_commission_recursion_depth"])->value("value");
316
+            $this->repository->setUserIdentity($user->uid);
317
+            $result = $this->repository->getUserContributeInfoByDepth($user->uid, $number);
318
+            $data = [
319
+                'no_total_source' => Db::name('user_sign_gongxian')->where('status', -1)->where('uid', $user->uid)->sum('number'),
320
+                'team_gongxian_num' => $result['arriveNumTeam'],
321
+                'zhitui' => $con['per_contribute'],
322
+                'total_source' => $con['contribute']
323
+            ];
324
+            return app('json')->success($data);
325
+
313 326
 
314 327
            // $dateObj=DB::name('user_sign_gongxian')->where('uid', $user->uid)->where("status",1)->select();
315 328
             $con = DB::name('user')->where('uid', $user->uid)->find();