Browse Source

会员升级

Kirin 1 year ago
parent
commit
e17c303e97

+ 27 - 0
app/common.php

@@ -571,3 +571,30 @@ if (!function_exists('formatFileSize')) {
 
 }
 
+
+if (!function_exists('get_group_user')) {
+    //所有下级
+    function get_group_user($id, $init = true, $members = null)
+    {
+        if ($init) {
+            $us = \app\model\user\User::column('spread_uid', 'uid');
+            $members = [];
+            foreach ($us as $k => $v) {
+                if ($v > 0)
+                    $members[$v][] = $k;
+            }
+            $id = [$id];
+        }
+        $arr = array();
+        foreach ($id as $v) {
+            $child = $members[$v] ?? [];
+            $arr = array_merge($arr, $child);
+        }
+        if (count($arr)) {
+            return array_merge($arr, get_group_user($arr, false, $members));
+        } else {
+            return $arr;
+        }
+    }
+}
+

+ 5 - 2
app/controller/admin/v1/user/UserLevel.php

@@ -64,7 +64,9 @@ class UserLevel extends AuthController
             ['image', ''],
             ['is_show', ''],
             ['explain', ''],
-            ['exp_num', 0]
+            ['exp_num', 0],
+            ['achievement', 0],
+            ['sub_grade_num', 0],
         ]);
         if ($data['valid_date'] == 0) $data['is_forever'] = 1;//有效时间为0的时候就是永久
         if (!$data['name']) return $this->fail('请输入等级名称');
@@ -72,7 +74,8 @@ class UserLevel extends AuthController
         if (!$data['explain']) return $this->fail('请输入等级说明');
         if (!$data['icon']) return $this->fail('请上传等级图标');
         if (!$data['image']) return $this->fail('请上传等级背景图标');
-        if (!$data['exp_num']) return $this->fail('请输入升级经验值');
+//        if (!$data['exp_num']) return $this->fail('请输入升级经验值');
+        if (!$data['achievement']) return $this->fail('请输入升级业绩');
 
         return $this->success($this->services->save((int)$data['id'], $data));
     }

+ 43 - 20
app/jobs/integral/IntegralJob.php

@@ -3,6 +3,7 @@
 namespace app\jobs\integral;
 
 use app\services\user\UserAwardIntegralServices;
+use app\services\user\UserServices;
 use crmeb\basic\BaseJobs;
 use crmeb\traits\QueueTrait;
 use think\facade\Log;
@@ -20,29 +21,51 @@ class IntegralJob extends BaseJobs
     {
         /** @var UserAwardIntegralServices $awardIntegralService */
         $awardIntegralService = app()->make(UserAwardIntegralServices::class);
+        /** @var UserServices $userService */
+        $userService = app()->make(UserServices::class);
+        $user = $userService->getUserInfo($order['uid']);
         $integral_price = $awardIntegralService->getPrice($order['id']);
         $total_price = $order['total_price'];
-        try {
-            //添加静态积分
-            $static_integral_ratio = sys_config('static_integral_ratio', 0);
-            $give_static_integral = bcdiv(bcmul($total_price, $static_integral_ratio), 100, 2);
-            if ($give_static_integral > 0) {
-                $rate = sys_config('static_integral_rate', 3);
-                $extract_sum = bcmul($total_price, $rate, 2);
-                $mark = '购买商品,获得静态积分';
-                $awardIntegralService->incIntegral($order['uid'], $integral_price, $give_static_integral, $total_price, 0, $extract_sum, $order['id'], $mark);
+        return $awardIntegralService->transaction(function () use ($awardIntegralService, $userService, $user, $integral_price, $total_price, $order) {
+            try {
+                //添加静态积分
+                $static_integral_ratio = sys_config('static_integral_ratio', 0);
+                $give_static_integral = bcdiv(bcmul($total_price, $static_integral_ratio), 100, 2);
+                if ($give_static_integral > 0) {
+                    $rate = sys_config('static_integral_rate', 3);
+                    $extract_sum = bcmul($total_price, $rate, 2);
+                    $mark = '购买商品,获得静态积分';
+                    $awardIntegralService->incIntegral($order['uid'], $integral_price, $give_static_integral, $total_price, 0, $extract_sum, $order['id'], $mark);
+                }
+                //添加奖池
+                $lake_ratio = sys_config('lake_ratio', 0);
+                $add_lake = bcdiv(bcmul($total_price, $lake_ratio), 100, 2);
+                if ($add_lake > 0) {
+                    $mark = '用户' . $order['uid'] . '购买商品,添加资金池';
+                    $awardIntegralService->addLake($add_lake, $order['id'], $mark);
+                }
+                //TODO 加动态积分
+                //推荐奖
+                $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);
+                        }
+                    }
+                }
+                return true;
+            } catch (\Throwable $e) {
+                Log::error('处理积分奖池失败,失败原因:' . $e->getMessage());
+                return false;
             }
-            //添加奖池
-            $lake_ratio = sys_config('lake_ratio', 0);
-            $add_lake = bcdiv(bcmul($total_price, $lake_ratio), 100, 2);
-            if ($add_lake > 0) {
-                $mark = '用户' . $order['uid'] . '购买商品,添加资金池';
-                $awardIntegralService->addLake($add_lake, $order['id'], $mark);
-            }
-            //TODO 加动态积分
-        } catch (\Throwable $e) {
-            Log::error('处理积分奖池失败,失败原因:' . $e->getMessage());
-        }
+        });
+
     }
 
     /**

+ 21 - 0
app/model/user/UserIntegral.php

@@ -88,6 +88,27 @@ class UserIntegral extends BaseModel
         $query->where('status', $value);
     }
 
+
+    /**
+     * 门店ID
+     * @param $query
+     * @param $value
+     */
+    public function searchAddTimeGtAttr($query, $value)
+    {
+        $query->where('add_time', '>', $value);
+    }
+
+    /**
+     * 门店ID
+     * @param $query
+     * @param $value
+     */
+    public function searchExtractTimeGtAttr($query, $value)
+    {
+        $query->where('extract_time', '>', $value);
+    }
+
     /**
      * 门店店员ID
      * @param $query

+ 35 - 0
app/services/user/UserAwardIntegralServices.php

@@ -65,6 +65,41 @@ class UserAwardIntegralServices extends BaseServices
         return $this->dao->sum($where, 'num', true);
     }
 
+
+    /**
+     * 获取单条数据
+     * @return float
+     */
+    public function getPaySum($uid)
+    {
+        $where = ['uid' => $uid, 'status' => 0, 'type' => 0];
+        return $this->dao->sum($where, 'order_price', true);
+    }
+
+
+    /**
+     * 获取单条数据
+     * @return float
+     */
+    public function getHourExtractPaySum($uid, $HourLimit = 0)
+    {
+        $where = ['uid' => $uid, 'status' => 1, 'type' => 0];
+        $where['extract_time_gt'] = time() - ($HourLimit * 3600);
+        return $this->dao->sum($where, 'order_price', true);
+    }
+
+
+    /**
+     * 获取用户业绩
+     * @param $uid
+     * @return float
+     */
+    public function getAchievement($uid)
+    {
+        $where = ['uid' => array_merge([$uid], get_group_user($uid)), 'type' => 0];
+        return $this->dao->sum($where, 'order_price', true);
+    }
+
     /**
      * 获取单条数据
      * @return float

+ 1 - 0
app/services/user/UserServices.php

@@ -1690,6 +1690,7 @@ class UserServices extends BaseServices
         $static_integral = $award_integral_service->getIntegralSum(['status' => 0, 'type' => 0, 'uid' => $user['uid']]);
         $action_integral = $award_integral_service->getIntegralSum(['status' => 0, 'type' => 1, 'uid' => $user['uid']]);
         $user['is_default_avatar'] = $user['avatar'] == sys_config('h5_avatar') ? 1 : 0;
+        $user['achievement'] = $award_integral_service->getAchievement($user['uid']);
         return array_merge($user, compact('award_lack', 'integral_price', 'static_integral', 'action_integral'));
     }
 

+ 64 - 63
app/services/user/level/UserLevelServices.php

@@ -238,9 +238,17 @@ 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('exp_num', '解锁需经验值达到', $vipinfo['exp_num'] ?? 0)->min(0)->precision(0)->col(8);
-        $field[] = Form::frameImage('icon', '图标', Url::buildUrl(config('admin.admin_prefix') .  '/widget.images/index', array('fodder' => 'icon')), $vipinfo['icon'] ?? '')->icon('ios-add')->width('960px')->height('505px')->modal(['footer-hide' => true])->appendValidate(Iview::validateStr()->required()->message('请选择图标'));
-        $field[] = Form::frameImage('image', '会员背景', Url::buildUrl(config('admin.admin_prefix') .  '/widget.images/index', array('fodder' => 'image')), $vipinfo['image'] ?? '')->icon('ios-add')->width('960px')->height('505px')->modal(['footer-hide' => true])->appendValidate(Iview::validateStr()->required()->message('请选择背景'));
+//        $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);
+
+        $pre_level = false;
+        if (isset($vipinfo)) {
+            $pre_level = app()->make(SystemUserLevelServices::class)->getPreLevel($vipinfo['grade']);
+        }
+
+        $field[] = Form::number('sub_grade_num', $pre_level ? '解锁需存在' . $pre_level['name'] . '以上大区' : '解锁需存在低级别以上大区', $vipinfo['sub_grade_num'] ?? 0)->min(0)->precision(0)->col(8);
+        $field[] = Form::frameImage('icon', '图标', Url::buildUrl(config('admin.admin_prefix') . '/widget.images/index', array('fodder' => 'icon')), $vipinfo['icon'] ?? '')->icon('ios-add')->width('960px')->height('505px')->modal(['footer-hide' => true])->appendValidate(Iview::validateStr()->required()->message('请选择图标'));
+        $field[] = Form::frameImage('image', '会员背景', Url::buildUrl(config('admin.admin_prefix') . '/widget.images/index', array('fodder' => 'image')), $vipinfo['image'] ?? '')->icon('ios-add')->width('960px')->height('505px')->modal(['footer-hide' => true])->appendValidate(Iview::validateStr()->required()->message('请选择背景'));
         $field[] = Form::radio('is_show', '是否显示', $vipinfo['is_show'] ?? 0)->options([['label' => '显示', 'value' => 1], ['label' => '隐藏', 'value' => 0]])->col(24);
         $field[] = Form::textarea('explain', '等级说明', $vipinfo['explain'] ?? '');
         return create_form($msg, $field, Url::buildUrl('/user/user_level'), 'POST');
@@ -256,48 +264,41 @@ class UserLevelServices extends BaseServices
         /** @var SystemUserLevelServices $systemUserLevel */
         $systemUserLevel = app()->make(SystemUserLevelServices::class);
         $levelOne = $systemUserLevel->getWhereLevel(['is_del' => 0, 'grade' => $data['grade']]);
-        $levelTwo = $systemUserLevel->getWhereLevel(['is_del' => 0, 'exp_num' => $data['exp_num']]);
         $levelThree = $systemUserLevel->getWhereLevel(['is_del' => 0, 'name' => $data['name']]);
         $levelPre = $systemUserLevel->getPreLevel($data['grade']);
         $levelNext = $systemUserLevel->getNextLevel($data['grade']);
-        if ($levelPre && $data['exp_num'] <= $levelPre['exp_num']) {
-            throw new AdminException('会员经验必须大于上一等级设置的经验');
+        if ($levelPre && $data['achievement'] < $levelPre['achievement']) {
+            throw new AdminException('会员业绩必须大于等于上一等级设置的业绩');
         }
-        if ($levelNext && $data['exp_num'] >= $levelNext['exp_num']) {
-            throw new AdminException('会员经验必须小于下一等级设置的经验');
+        if ($levelNext && $data['achievement'] > $levelNext['achievement']) {
+            throw new AdminException('会员业绩必须小于等于下一等级设置的业绩');
         }
         //修改
         if ($id) {
             if (($levelOne && $levelOne['id'] != $id) || ($levelThree && $levelThree['id'] != $id)) {
                 throw new AdminException('已检测到您设置过的会员等级,此等级不可重复');
             }
-            if ($levelTwo && $levelTwo['id'] != $id) {
-                throw new AdminException('已检测到您设置过该会员经验值,经验值不可重复');
-            }
             if (!$systemUserLevel->update($id, $data)) {
                 throw new AdminException('修改失败');
             }
 
-			$data['id'] = $id;
-			$systemUserLevel->dao->cacheUpdate($data);
+            $data['id'] = $id;
+            $systemUserLevel->dao->cacheUpdate($data);
 
             return '修改成功';
         } else {
             if ($levelOne || $levelThree) {
                 throw new AdminException('已检测到您设置过的会员等级,此等级不可重复');
             }
-            if ($levelTwo) {
-                throw new AdminException('已检测到您设置过该会员经验值,经验值不可重复');
-            }
             //新增
             $data['add_time'] = time();
-			$res = $systemUserLevel->save($data);
+            $res = $systemUserLevel->save($data);
             if (!$res) {
                 throw new AdminException('添加失败');
             }
 
-			$data['id'] = $res->id;
-			$systemUserLevel->cacheUpdate($data);
+            $data['id'] = $res->id;
+            $systemUserLevel->cacheUpdate($data);
 
             return '添加成功';
         }
@@ -325,7 +326,7 @@ class UserLevelServices extends BaseServices
                 throw new AdminException('删除失败');
             }
         }
-		$systemUserLevel->cacheDelById($id);
+        $systemUserLevel->cacheDelById($id);
         return '删除成功';
     }
 
@@ -342,7 +343,7 @@ class UserLevelServices extends BaseServices
         if (!$systemUserLevel->getWhereLevel(['id' => $id]))
             throw new AdminException('数据不存在');
         if ($systemUserLevel->update($id, ['is_show' => $is_show])) {
-			$systemUserLevel->cacheSaveValue($id, 'is_show', $is_show);
+            $systemUserLevel->cacheSaveValue($id, 'is_show', $is_show);
             return $is_show == 1 ? '显示成功' : '隐藏成功';
         } else {
             throw new AdminException($is_show == 1 ? '显示失败' : '隐藏失败');
@@ -362,7 +363,7 @@ class UserLevelServices extends BaseServices
         if (!$systemUserLevel->getWhereLevel(['id' => $id]))
             throw new AdminException('数据不存在');
         if ($systemUserLevel->update($id, [$data['field'] => $data['value']])) {
-			$systemUserLevel->cacheSaveValue($id, $data['field'], $data['value']);
+            $systemUserLevel->cacheSaveValue($id, $data['field'], $data['value']);
             return true;
         } else {
             throw new AdminException('保存失败');
@@ -386,10 +387,10 @@ class UserLevelServices extends BaseServices
         if (!$user) {
             throw new ValidateException('没有此用户,无法检测升级会员');
         }
-		//没有激活暂不升级
-		if (!$user['level_status']) {
-			return true;
-		}
+        //没有激活暂不升级
+        if (!$user['level_status']) {
+            return true;
+        }
         /** @var SystemUserLevelServices $systemUserLevel */
         $systemUserLevel = app()->make(SystemUserLevelServices::class);
         $userAllLevel = $systemUserLevel->getList([['is_del', '=', 0], ['is_show', '=', 1], ['exp_num', '<=', (float)$user['exp']]]);
@@ -517,19 +518,19 @@ class UserLevelServices extends BaseServices
             $levelInfo['vip_icon'] = $levelInfo['icon'];
             $levelInfo['vip_name'] = $levelInfo['name'];
         }
-		$data['level_info'] = $levelInfo;
-		$i = 0;
-		foreach ($levelList as &$level) {
-			if ($level['grade'] < $levelInfo['grade']) {
-				$level['next_exp_num'] = $levelList[$i + 1]['exp_num'] ?? $level['exp_num'];
-			} else {
-				$level['next_exp_num'] = $level['exp_num'];
-			}
-			$level['image'] = set_file_url($level['image']);
-			$level['icon'] = set_file_url($level['icon']);
-			$i++;
-		}
-		$data['level_list'] = $levelList;
+        $data['level_info'] = $levelInfo;
+        $i = 0;
+        foreach ($levelList as &$level) {
+            if ($level['grade'] < $levelInfo['grade']) {
+                $level['next_exp_num'] = $levelList[$i + 1]['exp_num'] ?? $level['exp_num'];
+            } else {
+                $level['next_exp_num'] = $level['exp_num'];
+            }
+            $level['image'] = set_file_url($level['image']);
+            $level['icon'] = set_file_url($level['icon']);
+            $i++;
+        }
+        $data['level_list'] = $levelList;
 
         $data['level_info']['exp'] = $user['exp'] ?? 0;
         /** @var UserBillServices $userBillservices */
@@ -602,24 +603,24 @@ class UserLevelServices extends BaseServices
             throw new ValidateException('不需要重复激活');
         }
         $extend_info = $userServices->handelExtendInfo($data, true) ?: [];
-		$update = ['level_status' => 1];
-		if ($extend_info) {
-			$default = $userServices->defaultExtendInfo;
-			$params = array_column($default, 'param');
-			$sex = $userServices->sex;
-			$update['level_extend_info'] = $extend_info;
-			foreach ($extend_info as $info) {
-				if (isset($info['param']) && in_array($info['param'], $params) && isset($info['value'])) {
-					if ($info['param'] == 'sex') {
-						$update['sex'] = $sex[$info['value']] ?? 0;
-					} elseif ($info['param'] == 'birthday') {
-						$update['birthday'] = strtotime($info['value']);
-					} else {
-						$update[$info['param']] = $info['value'];
-					}
-				}
-			}
-		}
+        $update = ['level_status' => 1];
+        if ($extend_info) {
+            $default = $userServices->defaultExtendInfo;
+            $params = array_column($default, 'param');
+            $sex = $userServices->sex;
+            $update['level_extend_info'] = $extend_info;
+            foreach ($extend_info as $info) {
+                if (isset($info['param']) && in_array($info['param'], $params) && isset($info['value'])) {
+                    if ($info['param'] == 'sex') {
+                        $update['sex'] = $sex[$info['value']] ?? 0;
+                    } elseif ($info['param'] == 'birthday') {
+                        $update['birthday'] = strtotime($info['value']);
+                    } else {
+                        $update[$info['param']] = $info['value'];
+                    }
+                }
+            }
+        }
         $userServices->update($uid, $update);
         $data = [];
         //获取激活送好礼
@@ -639,12 +640,12 @@ class UserLevelServices extends BaseServices
             $coupon = $couponServices->getList(['id' => $ids]);
             $data['level_give_coupon'] = $coupon;
         }
-		if (!$data['level_integral_status']) {
-			$data['level_give_integral'] = 0;
-		}
-		if (!$data['level_money_status']) {
-			$data['level_give_money'] = 0;
-		}
+        if (!$data['level_integral_status']) {
+            $data['level_give_integral'] = 0;
+        }
+        if (!$data['level_money_status']) {
+            $data['level_give_money'] = 0;
+        }
         //激活会员卡事件
         event('user.activate.level', [$uid]);
         return $data;