544 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			544 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			PHP
		
	
	
| <?php
 | |
| namespace app\admin\logic\user;
 | |
| 
 | |
| use app\admin\validate\user\UserValidate;
 | |
| use app\common\basics\Logic;
 | |
| use app\common\enum\ClientEnum;
 | |
| use app\common\enum\OrderEnum;
 | |
| use app\common\logic\AccountLogLogic;
 | |
| use app\common\model\AccountLog;
 | |
| use app\common\model\BusinessTeam;
 | |
| use app\common\model\user\User;
 | |
| use app\common\model\user\UserLevel;
 | |
| use app\common\model\user\UserTag;
 | |
| use app\common\server\UrlServer;
 | |
| use app\common\model\order\Order;
 | |
| use think\facade\Db;
 | |
| 
 | |
| class UserLogic extends Logic
 | |
| {
 | |
|     public static function lists($get)
 | |
|     {
 | |
|         $where[] = ['del','=', '0'];
 | |
| 
 | |
|         //查询
 | |
|         if(isset($get['keyword']) && $get['keyword']){
 | |
|             $where[] = [$get['keyword_type'],'like', '%'. trim($get['keyword']) . '%'];
 | |
|         }
 | |
| 
 | |
|         //用户状态
 | |
|         if(isset($get['disable']) && $get['disable'] !== ''){
 | |
|             $where[] = ['disable', '=', $get['disable']];
 | |
|         }
 | |
| 
 | |
|         //业务团队
 | |
|         if(isset($get['team_id']) && $get['team_id'] !== ''){
 | |
|             $where[] = ['team_id','=',$get['team_id']];
 | |
|         }
 | |
| 
 | |
|         //是否API授权用户
 | |
|         if(isset($get['is_api']) && $get['is_api'] !== ''){
 | |
|             $where[] = ['is_api','=',$get['is_api']];
 | |
|         }
 | |
| 
 | |
|         //等级查询
 | |
|         if(isset($get['level']) && $get['level'] !== ''){
 | |
|             $where[] = ['level','=',$get['level']];
 | |
|         }
 | |
| 
 | |
|         // 标签查询
 | |
|         if(isset($get['tag']) && $get['tag']){
 | |
|             $where[] = ['tag_ids','find in set',$get['tag']];
 | |
|         }
 | |
| 
 | |
|         //注册来源
 | |
|         if(isset($get['client']) && $get['client']){
 | |
|             $where[] = ['client','=',$get['client']];
 | |
|         }
 | |
| 
 | |
|         //消费金额
 | |
|         if(isset($get['total_amount_start']) && $get['total_amount_start']){
 | |
|             $where[] = ['total_order_amount','>=',$get['total_amount_start']];
 | |
|         }
 | |
|         if(isset($get['total_amount_end']) && $get['total_amount_end']){
 | |
|             $where[] = ['total_order_amount','<=',$get['total_amount_end']];
 | |
|         }
 | |
| 
 | |
|         //注册时间
 | |
|         if(isset($get['start_time']) && $get['start_time']!=''){
 | |
|             $where[] = ['create_time','>=',strtotime($get['start_time'])];
 | |
|         }
 | |
|         if(isset($get['end_time']) && $get['end_time']!=''){
 | |
|             $where[] = ['create_time','<=',strtotime($get['end_time'])];
 | |
|         }
 | |
| 
 | |
|         $user_count = User::where($where)->count();
 | |
| 
 | |
|         $user_list = User::where($where)
 | |
|             ->field('id,sn,nickname,avatar,level,total_order_amount,tag_ids,client,login_time,create_time,user_growth,user_money,earnings,first_leader,disable,team_id,is_api')
 | |
|             ->page($get['page'],$get['limit'])
 | |
|             ->order('id desc')
 | |
|             ->select()
 | |
|             ->toArray();
 | |
| 
 | |
|         // 业务团队
 | |
|         $business_team = BusinessTeam::order('id desc')->column('name','id');
 | |
|         //会员等级
 | |
|         $user_level = UserLevel::where(['del'=>0])->column('name','id');
 | |
|         // 会员标签
 | |
|         $user_tag = UserTag::where(['del'=>0])->column('name', 'id');
 | |
|         // 注册来源
 | |
|         $client_list = ClientEnum::getClient(true);
 | |
| 
 | |
|         foreach ($user_list as &$item){
 | |
|             // 可提现金额
 | |
|             $item['earnings'] = empty($item['earnings']) ? 0 :  $item['earnings'];
 | |
|             // 总资产
 | |
|             $item['total_amount'] = $item['user_money'] + $item['earnings'];
 | |
|             // 业务团队
 | |
|             $item['team_name'] = $business_team[$item['team_id']] ?? '无';
 | |
|             // 会员等级
 | |
|             $item['level_name'] = '暂无等级';
 | |
|             if(isset($user_level[$item['level']])){
 | |
|                 $item['level_name'] = $user_level[$item['level']];
 | |
|             }
 | |
|             // 头像
 | |
|             if ($item['avatar'] != '/static/common/image/default/user.png') {
 | |
|                 $item['abs_avatar'] = $item['avatar'] ? UrlServer::getFileUrl($item['avatar']) : '';
 | |
|             } else {
 | |
|                 $item['abs_avatar'] = '/static/common/image/default/user.png';
 | |
|             }
 | |
|             // 会员标签
 | |
|             $item['tag_str'] = '';
 | |
|             if(!empty($item['tag_ids'])) {
 | |
|                 $tempArr = explode(',',$item['tag_ids']);
 | |
|                 foreach($tempArr as $v) {
 | |
|                     $item['tag_str'] .= $user_tag[$v] . ',';
 | |
|                 }
 | |
|                 $item['tag_str'] = trim( $item['tag_str'], ',');
 | |
|             }
 | |
|             // 注册来源
 | |
|             $item['client_desc'] = $client_list[$item['client']];
 | |
| 
 | |
|             // 上级推荐人
 | |
|             $item['first_leader_info'] = User::getUserInfo($item['first_leader']);
 | |
| 
 | |
|             //推荐下级人数
 | |
|             $item['fans'] = User::where([
 | |
|                 ['first_leader|second_leader', '=', $item['id']],
 | |
|                 ['del', '=', 0]
 | |
|             ])->count();
 | |
|         }
 | |
| 
 | |
|         return ['count'=>$user_count , 'lists'=>$user_list];
 | |
|     }
 | |
| 
 | |
|     public static function setTag($post)
 | |
|     {
 | |
|         try{
 | |
|             User::where([
 | |
|                 ['id', 'in', $post['user_ids']]
 | |
|             ])->update([
 | |
|                 'tag_ids' => $post['tag_ids'],
 | |
|                 'update_time' => time()
 | |
|             ]);
 | |
|             return true;
 | |
|         }catch(\Exception $e) {
 | |
|             self::$error = $e->getMessage();
 | |
|             return false;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public static function getUser($id)
 | |
|     {
 | |
|         $field = [
 | |
|             'id', 'sn','nickname','avatar','mobile','sex','birthday','tag_ids',
 | |
|             'remark','user_money','user_growth','user_integral','earnings', 'disable', 'team_id'
 | |
|         ];
 | |
|         $user = User::field($field)->where(['del' => 0, 'id' => $id])->findOrEmpty();
 | |
| 
 | |
|         if($user->isEmpty()) {
 | |
|             return [];
 | |
|         }
 | |
|         // 头像
 | |
|         if($user['avatar']) {
 | |
|             $user['avatar'] = UrlServer::getFileUrl($user['avatar']);
 | |
|         }
 | |
|         // 会员标签
 | |
|         $user['tag_ids'] = json_encode(explode(',', $user['tag_ids']));
 | |
|         // 业务团队
 | |
|         $user['team_ids'] = json_encode(explode(',', $user['team_id']));
 | |
| 
 | |
|         return $user->toArray();
 | |
|     }
 | |
| 
 | |
|     public static function edit($post)
 | |
|     {
 | |
|         try{
 | |
|             $data = [
 | |
|                 'id' => $post['id'],
 | |
|                 'nickname' => $post['nickname'],
 | |
|                 'avatar' => clearDomain($post['avatar']),
 | |
|                 'mobile' => $post['mobile'],
 | |
|                 'birthday' => strtotime($post['birthday']),
 | |
|                 'tag_ids' => $post['select'],
 | |
|                 'team_id' => $post['team_id'] ?? 0,
 | |
|                 'remark' => $post['remark'],
 | |
|                 'disable' => $post['disable'],
 | |
|                 'update_time' => time()
 | |
|             ];
 | |
|             User::update($data);
 | |
|             return true;
 | |
|         }catch(\Exception $e) {
 | |
|             self::$error = $e->getMessage();
 | |
|             return false;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public static function getInfo($id)
 | |
|     {
 | |
|         $field = [
 | |
|             'id', 'sn', 'nickname', 'avatar', 'birthday', 'sex', 'mobile', 'client',
 | |
|             'create_time','login_time', 'user_money', 'tag_ids', 'user_growth', 'earnings',
 | |
|             'first_leader', 'disable'
 | |
|         ];
 | |
|         $user =  User::field($field)->findOrEmpty($id);
 | |
| 
 | |
|         if($user->isEmpty()) {
 | |
|             return [];
 | |
|         }
 | |
|         $user =$user->toArray();
 | |
|         $orderWhere = [
 | |
|             'user_id' => $id,
 | |
|             'del' => 0,
 | |
|             'pay_status' => OrderEnum::PAY_STATUS_PAID
 | |
|         ];
 | |
|         // 上级推荐人
 | |
|         $user['first_leader_info'] = User::getUserInfo($user['first_leader']);
 | |
|         // 推荐下级人数
 | |
|         $user['fans'] = User::where([
 | |
|             ['first_leader|second_leader', '=', $user['id']],
 | |
|             ['del', '=', 0],
 | |
|         ])->count();
 | |
|         // 总资产
 | |
|         $user['assets'] = $user['user_money'] + $user['earnings'];
 | |
|         // 总订单数
 | |
|         $user['order_num'] = Order::where($orderWhere)->count();
 | |
|         // 总消费金额
 | |
|         $user['total_amount'] = Order::where($orderWhere)->sum('order_amount');
 | |
|         $user['total_amount'] = round($user['total_amount'] ,2);
 | |
|         // 平均消费单价
 | |
|         $user['avg_amount'] = Order::where($orderWhere)->avg('order_amount');
 | |
|         $user['avg_amount'] = round($user['avg_amount'], 2);
 | |
|         // 头像
 | |
|         $user['avatar'] = UrlServer::getFileUrl($user['avatar']);
 | |
|         // 客户端
 | |
|         $user['client_desc'] = ClientEnum::getClient($user['client']);
 | |
|         // 会员标签
 | |
|         $user_tag = UserTag::where(['del'=>0])->column('name', 'id');
 | |
|         $user['tag_str'] = '';
 | |
|         if(!empty($user['tag_ids'])) {
 | |
|             $tempArr = explode(',',$user['tag_ids']);
 | |
|             foreach($tempArr as $v) {
 | |
|                 $user['tag_str'] .= $user_tag[$v] . ',';
 | |
|             }
 | |
|             $user['tag_str'] = trim( $user['tag_str'], ',');
 | |
|         }
 | |
| 
 | |
|         return $user;
 | |
|     }
 | |
| 
 | |
|     public static function adjustAccount($post)
 | |
|     {
 | |
|         Db::startTrans();
 | |
|         try{
 | |
|             $user = User::findOrEmpty($post['id']);
 | |
|             if($user->isEmpty()) {
 | |
|                 throw new \Exception('用户不存在');
 | |
|             }
 | |
|             // 余额调整
 | |
|             if($post['type'] == 'money') {
 | |
|                 if(empty($post['money'])) {
 | |
|                     throw new \Exception('请输入调整的余额');
 | |
|                 }
 | |
|                 if(empty($post['money_remark'])) {
 | |
|                     throw new \Exception('请输入余额备注');
 | |
|                 }
 | |
|                 if($post['money_handle'] == 1) { // 增加
 | |
|                     $user->user_money = $user->user_money + $post['money'];
 | |
|                     $user->save();
 | |
|                     AccountLogLogic::AccountRecord($user['id'], $post['money'],1,AccountLog::admin_add_money, $post['money_remark']);
 | |
|                 }else{
 | |
|                     $user->user_money = $user->user_money - $post['money'];
 | |
|                     $user->save();
 | |
|                     AccountLogLogic::AccountRecord($user['id'], $post['money'],0,AccountLog::admin_reduce_money, $post['money_remark']);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             // 成长值调整
 | |
|             if($post['type'] == 'growth') {
 | |
|                 if(empty($post['growth'])) {
 | |
|                     throw new \Exception('请输入调整的成长值');
 | |
|                 }
 | |
|                 if(empty($post['growth_remark'])) {
 | |
|                     throw new \Exception('请输入成长值备注');
 | |
|                 }
 | |
|                 if($post['growth_handle'] == 1) { // 增加
 | |
|                     $user->user_growth = $user->user_growth + $post['growth'];
 | |
|                     $user->save();
 | |
|                     AccountLogLogic::AccountRecord($user['id'], $post['growth'],1,AccountLog::admin_add_growth, $post['growth_remark']);
 | |
|                 }else{
 | |
|                     $user->user_growth = $user->user_growth - $post['growth'];
 | |
|                     $user->save();
 | |
|                     AccountLogLogic::AccountRecord($user['id'], $post['growth'],0,AccountLog::admin_reduce_growth, $post['growth_remark']);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             // 积分调整
 | |
|             if($post['type'] == 'integral') {
 | |
|                 if(empty($post['integral'])) {
 | |
|                     throw new \Exception('请输入调整的积分');
 | |
|                 }
 | |
|                 if(empty($post['integral_remark'])) {
 | |
|                     throw new \Exception('请输入积分调整备注');
 | |
|                 }
 | |
|                 if($post['integral_handle'] == 1) { // 增加
 | |
|                     $user->user_integral = $user->user_integral + $post['integral'];
 | |
|                     $user->save();
 | |
|                     AccountLogLogic::AccountRecord($user['id'], $post['integral'],1,AccountLog::admin_add_integral, $post['integral_remark']);
 | |
|                 }else{
 | |
|                     $user->user_integral = $user->user_integral - $post['integral'];
 | |
|                     $user->save();
 | |
|                     AccountLogLogic::AccountRecord($user['id'], $post['integral'],0,AccountLog::admin_reduce_integral, $post['integral_remark']);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
| 
 | |
|             // 佣金调整
 | |
|             if($post['type'] == 'earnings') {
 | |
|                 if(empty($post['earnings'])) {
 | |
|                     throw new \Exception('请输入调整的佣金');
 | |
|                 }
 | |
|                 if(empty($post['earnings_remark'])) {
 | |
|                     throw new \Exception('请输入佣金调整备注');
 | |
|                 }
 | |
|                 if($post['earnings_handle'] == 1) { // 增加
 | |
|                     $user->earnings = $user->earnings + $post['earnings'];
 | |
|                     $user->save();
 | |
|                     AccountLogLogic::AccountRecord($user['id'], $post['earnings'],1,AccountLog::admin_inc_earnings, $post['earnings_remark']);
 | |
|                 }else{
 | |
|                     $user->earnings = $user->earnings - $post['earnings'];
 | |
|                     $user->save();
 | |
|                     AccountLogLogic::AccountRecord($user['id'], $post['earnings'],0,AccountLog::admin_reduce_earnings, $post['earnings_remark']);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
| 
 | |
|             Db::commit();
 | |
|             return true;
 | |
|         }catch(\Exception $e) {
 | |
|             Db::rollback();
 | |
|             self::$error = $e->getMessage();
 | |
|             return false;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public static function  fans($params)
 | |
|     {
 | |
|         $where = [];
 | |
|         // 一级
 | |
|         if ($params['type'] == 'one') {
 | |
|             $where[] = ['first_leader', '=', $params['id']];
 | |
|         }
 | |
|         // 二级粉丝
 | |
|         if ($params['type'] == 'two') {
 | |
|             $where[] = ['second_leader', '=', $params['id']];
 | |
|         }
 | |
|         if(isset($params['keyword']) && !empty($params['keyword'])) {
 | |
|             $where[] = [$params['field'], 'like', '%'. $params['keyword'] . '%'];
 | |
|         }
 | |
|         $lists = User::field('id,sn,nickname,avatar,first_leader')
 | |
|             ->where($where)
 | |
|             ->page($params['page'], $params['limit'])
 | |
|             ->select()
 | |
|             ->toArray();
 | |
| 
 | |
|         $count = User::field('id,sn,nickname,avatar,first_leader')
 | |
|             ->where($where)
 | |
|             ->count();
 | |
| 
 | |
|         foreach($lists as &$item) {
 | |
|             $item['avatar'] = empty($item['avatar']) ? '' : UrlServer::getFileUrl($item['avatar']);
 | |
|             $item['first_leader_info'] = User::getUserInfo($item['first_leader']);
 | |
|             $item['fans'] = User::where([
 | |
|                 ['first_leader|second_leader', '=', $item['id']],
 | |
|                 ['del', '=', 0]
 | |
|             ])->count();
 | |
|         }
 | |
|         return [
 | |
|             'lists' => $lists,
 | |
|             'count' => $count,
 | |
|         ];
 | |
|     }
 | |
| 
 | |
|     public static function adjustLevel($params)
 | |
|     {
 | |
|        try {
 | |
|             $user = User::findOrEmpty($params['id']);
 | |
|             if ($user->isEmpty()) {
 | |
|                 throw new \Exception('用户不存在');
 | |
|             }
 | |
|             $user->level = $params['level'];
 | |
|             $user->remark = $params['remark'];
 | |
|             $user->save();
 | |
| 
 | |
|            return true;
 | |
|        } catch(\Exception $e) {
 | |
|             self::$error = $e->getMessage();
 | |
|             return false;
 | |
|        }
 | |
|     }
 | |
| 
 | |
|     public static function adjustFirstLeader($params)
 | |
|     {
 | |
|         Db::startTrans();
 | |
|         try {
 | |
|             switch($params['type']) {
 | |
|                 // 指定推荐人
 | |
|                 case 'assign':
 | |
|                     $formatData = self::assignFirstLeader($params);
 | |
|                     break;
 | |
|                 // 设置推荐人为系统,即清空上级
 | |
|                 case 'system':
 | |
|                     $formatData = self::clearFirstLeader($params);
 | |
|                     break;
 | |
|             }
 | |
| 
 | |
|             $user = User::findOrEmpty($params['id']);
 | |
|             // 旧关系链
 | |
|             if (!empty($user->ancestor_relation)) {
 | |
|                 $old_ancestor_relation = $user->id . ',' .$user->ancestor_relation;
 | |
|             } else {
 | |
|                 $old_ancestor_relation = $user->id;
 | |
|             }
 | |
| 
 | |
| 
 | |
|             // 更新当前用户的分销关系
 | |
|             User::where(['id' => $params['id']])->update($formatData);
 | |
| 
 | |
|             //更新当前用户下级的分销关系
 | |
|             $data = [
 | |
|                 'second_leader' => $formatData['first_leader'],
 | |
|                 'third_leader' => $formatData['second_leader'],
 | |
|                 'update_time'  => time()
 | |
|             ];
 | |
|             User::where(['first_leader' => $params['id']])->update($data);
 | |
| 
 | |
|             //更新当前用户下下级的分销关系
 | |
|             $data = [
 | |
|                 'third_leader' => $formatData['first_leader'],
 | |
|                 'update_time'  => time()
 | |
|             ];
 | |
|             User::where(['second_leader' => $params['id']])->update($data);
 | |
| 
 | |
|             //更新当前用户所有后代的关系链
 | |
|             $posterityArr = User::field('id,ancestor_relation')
 | |
|                 ->whereFindInSet('ancestor_relation', $params['id'])
 | |
|                 ->select()
 | |
|                 ->toArray();
 | |
|             $updateData = [];
 | |
|             $replace_ancestor_relation = $params['id'] . ','. $formatData['ancestor_relation'];
 | |
|             foreach($posterityArr as $item) {
 | |
|                 $updateData[] = [
 | |
|                     'id' => $item['id'],
 | |
|                     'ancestor_relation' => trim(str_replace($old_ancestor_relation, $replace_ancestor_relation, $item['ancestor_relation']), ',')
 | |
|                 ];
 | |
|             }
 | |
|             // 批量更新
 | |
|             (new User())->saveAll($updateData);
 | |
| 
 | |
|             Db::commit();
 | |
|             return true;
 | |
|         } catch(\Exception $e) {
 | |
|             Db::rollback();
 | |
|             self::$error = $e->getMessage();
 | |
|             return false;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public static function assignFirstLeader($params)
 | |
|     {
 | |
|         if (empty($params['first_id'])) {
 | |
|             throw new \think\Exception('请选择推荐人');
 | |
|         }
 | |
|         $firstLeader = User::field(['id', 'first_leader', 'second_leader', 'third_leader', 'ancestor_relation'])
 | |
|             ->where('id', $params['first_id'])
 | |
|             ->findOrEmpty()
 | |
|             ->toArray();
 | |
|         if(empty($firstLeader)) {
 | |
|             throw new \think\Exception('推荐人不存在');
 | |
|         }
 | |
| 
 | |
|         if ($params['first_id'] == $params['id']) {
 | |
|             throw new \think\Exception('不能指定上级是自己');
 | |
|         }
 | |
|         $ancestorArr = explode(',', trim($firstLeader['ancestor_relation']));
 | |
|         if(!empty($ancestorArr) && in_array($params['id'], $ancestorArr)) {
 | |
|             throw new \think\Exception('不能指定推荐人为自己的下级');
 | |
|         }
 | |
| 
 | |
|         // 上级
 | |
|         $first_leader_id = $firstLeader['id'];
 | |
|         // 上上级
 | |
|         $second_leader_id = $firstLeader['first_leader'];
 | |
|         // 上上上级
 | |
|         $third_leader_id = $firstLeader['second_leader'];
 | |
|         // 拼接关系链
 | |
|         $firstLeader['ancestor_relation'] = $firstLeader['ancestor_relation'] ?? ''; // 清空null值及0
 | |
|         $my_ancestor_relation = $first_leader_id. ',' . $firstLeader['ancestor_relation'];
 | |
|         // 去除两端逗号
 | |
|         $my_ancestor_relation = trim($my_ancestor_relation, ',');
 | |
|         $data = [
 | |
|             'first_leader' => $first_leader_id,
 | |
|             'second_leader' => $second_leader_id,
 | |
|             'third_leader' => $third_leader_id,
 | |
|             'ancestor_relation' => $my_ancestor_relation,
 | |
|             'update_time'  => time()
 | |
|         ];
 | |
|         return $data;
 | |
|     }
 | |
| 
 | |
|     public static function clearFirstLeader($params)
 | |
|     {
 | |
|         $data = [
 | |
|             'first_leader' => 0,
 | |
|             'second_leader' => 0,
 | |
|             'third_leader' => 0,
 | |
|             'ancestor_relation' => '',
 | |
|             'update_time'  => time()
 | |
|         ];
 | |
|         return $data;
 | |
|     }
 | |
| 
 | |
|     public static function userLists()
 | |
|     {
 | |
|         $where[] = ['del', '=', 0];
 | |
|         // 用户信息
 | |
|         if (isset($params['keyword']) && !empty($params['keyword'])) {
 | |
|             $where[] = ['sn|nickname', 'like', '%'. $params['keyword'] .'%'];
 | |
|         }
 | |
| 
 | |
|         $lists = User::field('id,sn,nickname,id as distribution')
 | |
|             ->where($where)
 | |
|             ->page($params['page'], $params['limit'])
 | |
|             ->select()
 | |
|             ->toArray();
 | |
|         $count = User::where($where)->count();
 | |
| 
 | |
|         return [
 | |
|             'count' => $count,
 | |
|             'lists' => $lists,
 | |
|         ];
 | |
|     }
 | |
| }
 |