瀏覽代碼

会员升级

Kirin 1 年之前
父節點
當前提交
47ec0277bc

+ 1 - 0
app/controller/admin/v1/user/UserLevel.php

@@ -67,6 +67,7 @@ class UserLevel extends AuthController
             ['exp_num', 0],
             ['achievement', 0],
             ['sub_grade_num', 0],
+            ['group_award', 0],
         ]);
         if ($data['valid_date'] == 0) $data['is_forever'] = 1;//有效时间为0的时候就是永久
         if (!$data['name']) return $this->fail('请输入等级名称');

+ 24 - 3
app/jobs/integral/IntegralJob.php

@@ -2,6 +2,7 @@
 
 namespace app\jobs\integral;
 
+use app\services\user\level\UserLevelServices;
 use app\services\user\UserAwardIntegralServices;
 use app\services\user\UserServices;
 use crmeb\basic\BaseJobs;
@@ -23,10 +24,12 @@ class IntegralJob extends BaseJobs
         $awardIntegralService = app()->make(UserAwardIntegralServices::class);
         /** @var UserServices $userService */
         $userService = app()->make(UserServices::class);
+        /** @var UserLevelServices $levelServices */
+        $levelServices = app()->make(UserLevelServices::class);
         $user = $userService->getUserInfo($order['uid']);
         $integral_price = $awardIntegralService->getPrice($order['id']);
         $total_price = $order['total_price'];
-        return $awardIntegralService->transaction(function () use ($awardIntegralService, $userService, $user, $integral_price, $total_price, $order) {
+        return $awardIntegralService->transaction(function () use ($levelServices, $awardIntegralService, $userService, $user, $integral_price, $total_price, $order) {
             try {
                 //添加静态积分
                 $static_integral_ratio = sys_config('static_integral_ratio', 0);
@@ -46,19 +49,38 @@ class IntegralJob extends BaseJobs
                 }
                 //TODO 加动态积分
                 //推荐奖
+                $rate = sys_config('action_integral_rate', 3);
                 $spread = $userService->getUserInfo($user['spread_uid']);
                 if ($spread) {
                     if ($awardIntegralService->getPaySum($spread['uid']) >= 1000 || $awardIntegralService->getHourExtractPaySum($spread['uid'], 24) >= 1000) {
                         $award_ratio = sys_config('recommend_integral', 0);
                         $give_action_integral = bcdiv(bcmul($total_price, $award_ratio), 100, 2);
                         if ($give_action_integral > 0) {
-                            $rate = sys_config('action_integral_rate', 3);
                             $extract_sum = bcmul($give_action_integral, $rate, 2);
                             $mark = '推荐用户' . $user['nickname'] . "({$user['uid']})" . '购买商品,获得推荐积分';
                             $awardIntegralService->incIntegral($spread['uid'], $integral_price, $give_action_integral, $total_price, 1, $extract_sum, $order['id'], $mark);
                         }
                     }
                 }
+                $levelServices->detection((int)$user['uid']);
+                $pass = [$user['uid']];
+                $send = 0;
+                while ($spread && !in_array($spread['uid'], $pass)) {
+                    //先发奖,再结算等级
+                    $level = $levelServices->getUserLevel($spread['uid']);
+                    $ratio = $level['levelInfo']['group_award'] ?? 0;
+                    $give_action_integral = bcdiv(bcmul($total_price, $ratio), 100, 2);
+                    if ($give_action_integral > $send) {
+                        $real_send = bcsub($give_action_integral, $send, 2);
+                        $extract_sum = bcmul($real_send, $rate, 2);
+                        $mark = '团队用户' . $user['nickname'] . "({$user['uid']})" . '购买商品,获得团队级差积分';
+                        $awardIntegralService->incIntegral($spread['uid'], $integral_price, $real_send, $total_price, 1, $extract_sum, $order['id'], $mark);
+                        $send = $give_action_integral;
+                    }
+                    $levelServices->detection((int)$spread['uid']);
+                    $pass[] = $spread['uid'];
+                    $spread = $userService->getUserInfo($spread['spread_uid']);
+                }
                 return true;
             } catch (\Throwable $e) {
                 Log::error('处理积分奖池失败,失败原因:' . $e->getMessage());
@@ -67,7 +89,6 @@ class IntegralJob extends BaseJobs
         });
 
     }
-
     /**
      * 减积分
      * @param int $uid 用户

+ 21 - 1
app/services/user/level/UserLevelServices.php

@@ -15,6 +15,7 @@ namespace app\services\user\level;
 use app\services\activity\coupon\StoreCouponIssueServices;
 use app\services\activity\coupon\StoreCouponUserServices;
 use app\services\BaseServices;
+use app\services\user\UserAwardIntegralServices;
 use app\services\user\UserServices;
 use app\services\user\UserBillServices;
 use app\services\user\UserSignServices;
@@ -238,6 +239,7 @@ class UserLevelServices extends BaseServices
 //        $field[] = Form::number('valid_date', '有效时间(天)', $vipinfo['valid_date'] ?? 0)->min(0)->col(12);
         $field[] = Form::number('grade', '等级', $vipinfo['grade'] ?? 0)->min(0)->precision(0)->col(8);
         $field[] = Form::number('discount', '享受折扣', $vipinfo['discount'] ?? 100)->min(0)->max(100)->col(8)->placeholder('输入折扣数100,代表原价,90代表9折');
+        $field[] = Form::number('group_award', '团队奖(%)', $vipinfo['group_award'] ?? 100)->min(0)->max(100)->step(0.01)->col(8)->placeholder('输入团队奖百分比');
 //        $field[] = Form::number('exp_num', '解锁需经验值达到', $vipinfo['exp_num'] ?? 0)->min(0)->precision(0)->col(8);
         $field[] = Form::number('achievement', '解锁需业绩达到', $vipinfo['achievement'] ?? 0)->min(0)->step(0.01)->col(8);
 
@@ -393,7 +395,8 @@ class UserLevelServices extends BaseServices
         }
         /** @var SystemUserLevelServices $systemUserLevel */
         $systemUserLevel = app()->make(SystemUserLevelServices::class);
-        $userAllLevel = $systemUserLevel->getList([['is_del', '=', 0], ['is_show', '=', 1], ['exp_num', '<=', (float)$user['exp']]]);
+        $achievement = app()->make(UserAwardIntegralServices::class)->getAchievement($uid);
+        $userAllLevel = $systemUserLevel->getList([['is_del', '=', 0], ['is_show', '=', 1], ['exp_num', '<=', (float)$user['exp']], ['achievement', '<=', (float)$achievement]]);
         if (!$userAllLevel) {
             return true;
         }
@@ -404,6 +407,23 @@ class UserLevelServices extends BaseServices
             if (in_array($vipinfo['id'], $userLevel)) {
                 continue;
             }
+
+            $num = 0;
+            $sub_user = $userServices->getColumn(['spread_uid' => $user['uid']], 'uid');
+            if (!count($sub_user)) {
+                $num = 0;
+            } else {
+                foreach ($sub_user as $v) {
+                    $subUsers = $this->dao->getColumn([['grade', '>=', $vipinfo['grade'] - 1], ['status', '=', 1], ['is_del', '=', 0], ['uid', 'in', get_group_user($v)]], 'uid');
+                    if (count(array_unique($subUsers)) > 0) {
+                        $num++;
+                    }
+                }
+            }
+            if ($vipinfo['sub_grade_num'] > $num) {
+                continue;
+            }
+
             $data['mark'] = '尊敬的用户' . $user['nickname'] . '在' . date('Y-m-d H:i:s', time()) . '成为了' . $vipinfo['name'];
             $uservip = $this->dao->getOne(['uid' => $uid, 'level_id' => $vipinfo['id']]);
             if ($uservip) {