414 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			414 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | |||
|  | // +----------------------------------------------------------------------
 | |||
|  | // | likeshop开源商城系统
 | |||
|  | // +----------------------------------------------------------------------
 | |||
|  | // | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
 | |||
|  | // | gitee下载:https://gitee.com/likeshop_gitee
 | |||
|  | // | github下载:https://github.com/likeshop-github
 | |||
|  | // | 访问官网:https://www.likeshop.cn
 | |||
|  | // | 访问社区:https://home.likeshop.cn
 | |||
|  | // | 访问手册:http://doc.likeshop.cn
 | |||
|  | // | 微信公众号:likeshop技术社区
 | |||
|  | // | likeshop系列产品在gitee、github等公开渠道开源版本可免费商用,未经许可不能去除前后端官方版权标识
 | |||
|  | // |  likeshop系列产品收费版本务必购买商业授权,购买去版权授权后,方可去除前后端官方版权标识
 | |||
|  | // | 禁止对系统程序代码以任何目的,任何形式的再发布
 | |||
|  | // | likeshop团队版权所有并拥有最终解释权
 | |||
|  | // +----------------------------------------------------------------------
 | |||
|  | // | author: likeshop.cn.team
 | |||
|  | // +----------------------------------------------------------------------
 | |||
|  | 
 | |||
|  | namespace app\admin\logic\distribution; | |||
|  | 
 | |||
|  | use app\common\basics\Logic; | |||
|  | use app\common\model\user\User; | |||
|  | use app\common\model\user\UserLevel; | |||
|  | use app\common\server\UrlServer; | |||
|  | use app\common\model\WithdrawApply; | |||
|  | use app\common\model\distribution\DistributionOrderGoods; | |||
|  | use app\common\model\distribution\DistributionMemberApply; | |||
|  | use think\facade\Db; | |||
|  | 
 | |||
|  | class MemberLogic extends Logic | |||
|  | { | |||
|  |     public static function memberLists($get) | |||
|  |     { | |||
|  |         // 关键词
 | |||
|  |         $where[] = ['is_distribution', '=', 1]; | |||
|  |         if (!empty($get['search_key']) && !empty($get['keyword'])) { | |||
|  |             $where[] = [$get['search_key'], '=', trim($get['keyword'])]; | |||
|  |         } | |||
|  |         //分销状态
 | |||
|  |         if (isset($get['freeze_distribution']) && $get['freeze_distribution'] != '') { | |||
|  |             $where[] = ['freeze_distribution', '=', $get['freeze_distribution']]; | |||
|  |         } | |||
|  | 
 | |||
|  |         $user = new User(); | |||
|  |         $count = $user->where($where)->count(); | |||
|  | 
 | |||
|  |         $lists = $user | |||
|  |             ->where($where) | |||
|  |             ->page($get['page'], $get['limit']) | |||
|  |             ->append(['fans', 'distribution_order', 'leader']) | |||
|  |             ->hidden(['password,pay_password,salt']) | |||
|  |             ->order('id desc') | |||
|  |             ->select() | |||
|  |             ->toArray(); | |||
|  | 
 | |||
|  |         foreach ($lists as &$item) { | |||
|  |             $item['avatar'] = UrlServer::getFileUrl($item['avatar']); | |||
|  | 
 | |||
|  |             $item['distribution_num'] = $item['distribution_order']['num'] ?? 0;//分销订单数
 | |||
|  |             $item['distribution_amount'] = $item['distribution_order']['amount'] ?? 0;//分销订单金额
 | |||
|  |             $item['distribution_money'] = $item['distribution_order']['money'] ?? 0;//分销佣金
 | |||
|  |         } | |||
|  |         return ['count' => $count, 'lists' => $lists]; | |||
|  |     } | |||
|  | 
 | |||
|  |     public static function addMember($post) | |||
|  |     { | |||
|  |         // 根据会员编号查询用户
 | |||
|  |         $user = User::field('id,sn,is_distribution,distribution_add_remarks,del') | |||
|  |             ->where(['sn'=>$post['sn']])->findOrEmpty(); | |||
|  |         // 校验用户
 | |||
|  |         if ($user->isEmpty()) { return '该用户不存在!'; } | |||
|  |         $user = $user->toArray(); | |||
|  |         if ($user['del'] === 1) { return '该用户已被删除!'; } | |||
|  |         if ($user['is_distribution']) { return '该用户已是分销会员,无需重复添加'; } | |||
|  |         $result =  User::where(['id' => (int)$user['id']])->update([ | |||
|  |             'is_distribution'          => 1, | |||
|  |             'distribution_add_remarks' => $post['remarks'] ?? '', | |||
|  |             'update_time' => time() | |||
|  |         ]); | |||
|  |         return $result ? true : '添加失败'; | |||
|  |     } | |||
|  | 
 | |||
|  |     public static function getMemberInfo($get) | |||
|  |     { | |||
|  |         $user_id = $get['id']; | |||
|  |         $user = User::alias('u') | |||
|  |             ->field('u.*,u.sn as user_sn') | |||
|  |             ->leftJoin('distribution_order_goods d', 'd.user_id = u.id') | |||
|  |             ->where('u.id', $user_id) | |||
|  |             ->append(['distribution_order']) | |||
|  |             ->hidden(['password', 'pay_password', 'salt']) | |||
|  |             ->find(); | |||
|  | 
 | |||
|  |         $user['distribution_text'] = '否'; | |||
|  |         if ($user['is_distribution'] == 1) { | |||
|  |             $user['distribution_text'] = '是'; | |||
|  |         } | |||
|  | 
 | |||
|  |         //上级编号
 | |||
|  |         $user['first_leader_sn'] = User::where('id', $user['first_leader'])->value('sn'); | |||
|  |         //直推会员数
 | |||
|  |         $user['first_fans'] = User::where(['first_leader' => $user_id, 'del' => 0])->count(); | |||
|  |         // 已提现金额
 | |||
|  |         $have_withdraw = WithdrawApply::where(['status' => WithdrawApply::STATUS_SUCCESS, 'user_id' => $user_id]) | |||
|  |             ->sum('money'); | |||
|  | 
 | |||
|  |         $user['distribution_num'] = $user['distribution_order']['num'] ?? 0;//分销订单数
 | |||
|  |         $user['distribution_amount'] = $user['distribution_order']['amount'] ?? 0;//分销订单金额
 | |||
|  |         $user['distribution_money'] = $user['distribution_order']['money'] ?? 0;//分销佣金
 | |||
|  |         $user['have_withdraw'] = $have_withdraw;//已提现金额
 | |||
|  |         return $user; | |||
|  |     } | |||
|  | 
 | |||
|  |     public static function getFansLists($get) | |||
|  |     { | |||
|  |         $user_id = $get['id']; | |||
|  |         $where = []; | |||
|  |         if (!empty($get['search_key']) && !empty($get['keyword'])) { | |||
|  |             $keyword = $get['keyword']; | |||
|  |             $where[] = [$get['search_key'], 'like', '%' . $keyword . '%']; | |||
|  |         } | |||
|  | 
 | |||
|  |         $fans_type = $get['type'] ?? 'all'; | |||
|  |         if ($fans_type == 'all') { | |||
|  |             $where[] = ['first_leader|second_leader|third_leader', '=', $user_id]; | |||
|  |         } else { | |||
|  |             $where[] = [$fans_type, '=', $user_id]; | |||
|  |         } | |||
|  | 
 | |||
|  |         $user = new User(); | |||
|  |         $count = $user | |||
|  |             ->where($where) | |||
|  |             ->append(['fans', 'distribution_order']) | |||
|  |             ->hidden(['password,pay_password,salt']) | |||
|  |             ->count(); | |||
|  | 
 | |||
|  |         $lists = $user | |||
|  |             ->where($where) | |||
|  |             ->append(['fans', 'distribution_order']) | |||
|  |             ->hidden(['password,pay_password,salt']) | |||
|  |             ->page($get['page'], $get['limit']) | |||
|  |             ->select()->toArray(); | |||
|  | 
 | |||
|  |         // 用户等级列表
 | |||
|  |         $user_level = UserLevel::where(['del' => 0])->column('name', 'id'); | |||
|  |         // 提取所有上级id
 | |||
|  |         $leader_ids = array_column($lists, 'first_leader'); | |||
|  |         // 所有上级列表
 | |||
|  |         $leaders = User::where('id', 'in', $leader_ids) | |||
|  |             ->column('sn,nickname,mobile,level', 'id'); | |||
|  | 
 | |||
|  |         foreach ($lists as &$item) { | |||
|  |             $item['avatar'] = UrlServer::getFileUrl($item['avatar']); | |||
|  |             $item['leader'] = $leaders[$item['first_leader']] ?? []; | |||
|  |             if (!empty($item['leader'])) { | |||
|  |                 $leader_level = $item['leader']['level'] ?? 0; | |||
|  |                 $item['leader']['level'] = $user_level[$leader_level] ?? '无等级'; | |||
|  |             } | |||
|  |             $item['distribution_num'] = $item['distribution_order']['num'] ?? 0;//分销订单数
 | |||
|  |             $item['distribution_amount'] = $item['distribution_order']['amount'] ?? 0;//分销订单金额
 | |||
|  |             $item['distribution_money'] = $item['distribution_order']['money'] ?? 0;//分销佣金
 | |||
|  |         } | |||
|  | 
 | |||
|  |         return ['count' => $count, 'lists' => $lists]; | |||
|  |     } | |||
|  | 
 | |||
|  |     public static function getEarningsDetail($get) | |||
|  |     { | |||
|  |         $user_id = $get['id']; | |||
|  |         $where = []; | |||
|  |         $where[] = ['d.user_id', '=', $user_id]; | |||
|  |         $where[] = ['d.status', '=', DistributionOrderGoods::STATUS_SUCCESS]; | |||
|  | 
 | |||
|  |         //记录时间
 | |||
|  |         if (isset($get['start_time']) && $get['start_time'] != '') { | |||
|  |             $where[] = ['d.create_time', '>=', strtotime($get['start_time'])]; | |||
|  |         } | |||
|  |         if (isset($get['end_time']) && $get['end_time'] != '') { | |||
|  |             $where[] = ['d.create_time', '<=', strtotime($get['end_time'])]; | |||
|  |         } | |||
|  | 
 | |||
|  |         $count = DistributionOrderGoods::alias('d') | |||
|  |             ->field('d.id as distribution_id, d.sn, o.order_sn, d.money, d.create_time') | |||
|  |             ->join('order_goods og', 'og.id = d.order_goods_id') | |||
|  |             ->join('order o', 'o.id = og.order_id') | |||
|  |             ->where($where) | |||
|  |             ->count(); | |||
|  | 
 | |||
|  |         $lists = DistributionOrderGoods::alias('d') | |||
|  |             ->field('d.id as distribution_id, d.sn, o.order_sn, d.money, d.create_time') | |||
|  |             ->join('order_goods og', 'og.id = d.order_goods_id') | |||
|  |             ->join('order o', 'o.id = og.order_id') | |||
|  |             ->where($where) | |||
|  |             ->page($get['page'], $get['limit']) | |||
|  |             ->select(); | |||
|  | 
 | |||
|  |         foreach ($lists as &$item) { | |||
|  |             $item['type'] = '分销佣金'; | |||
|  |         } | |||
|  | 
 | |||
|  |         return ['count' => $count, 'lists' => $lists]; | |||
|  |     } | |||
|  | 
 | |||
|  |     public static function getLeaderInfo($user_id) | |||
|  |     { | |||
|  |         $first_leader = User::alias('u') | |||
|  |             ->field('u1.nickname,u1.sn') | |||
|  |             ->join('user u1', 'u1.id = u.first_leader') | |||
|  |             ->where('u.id', $user_id) | |||
|  |             ->find(); | |||
|  | 
 | |||
|  |         $leader_data = '无'; | |||
|  |         if ($first_leader) { | |||
|  |             $leader_data = $first_leader['nickname'] . '(' . $first_leader['sn'] . ')'; | |||
|  |         } | |||
|  |         return $leader_data; | |||
|  |     } | |||
|  | 
 | |||
|  |     public static function updateRelation($post) | |||
|  |     { | |||
|  |         Db::startTrans(); | |||
|  |         try{ | |||
|  |             $user_id = $post['user_id']; | |||
|  |             $referrer_sn =  $post['referrer_sn']; | |||
|  | 
 | |||
|  |             //清空上级
 | |||
|  |             $data = [ | |||
|  |                 'first_leader' => 0, | |||
|  |                 'second_leader' => 0, | |||
|  |                 'third_leader' => 0, | |||
|  |                 'ancestor_relation' => '', | |||
|  |             ]; | |||
|  |             $my_first_leader = 0; | |||
|  |             $my_second_leader = 0; | |||
|  |             $my_ancestor_relation = ''; | |||
|  | 
 | |||
|  |             if ($post['change_type'] == 'appoint'){ | |||
|  |                 //指定上级
 | |||
|  |                 $my_leader = User::where(['sn' => $referrer_sn])->findOrEmpty(); | |||
|  | 
 | |||
|  |                 //更新我的第一上级、第二上级、第三上级、关系链
 | |||
|  |                 $my_first_leader = $my_leader['id']; | |||
|  |                 $my_second_leader = $my_leader['first_leader']; | |||
|  |                 $my_third_leader = $my_leader['second_leader']; | |||
|  |                 $my_ancestor_relation = trim("{$my_first_leader},{$my_leader['ancestor_relation']}", ','); | |||
|  |                 $data = [ | |||
|  |                     'first_leader' => $my_first_leader, | |||
|  |                     'second_leader' => $my_second_leader, | |||
|  |                     'third_leader' => $my_third_leader, | |||
|  |                     'ancestor_relation' => $my_ancestor_relation, | |||
|  |                 ]; | |||
|  |             } | |||
|  |             // 更新我的上级、上上级、上上上级、关系链
 | |||
|  |             User::where(['id' => $user_id])->update($data); | |||
|  | 
 | |||
|  |             //更新我向下一级的第二上级、第三上级
 | |||
|  |             $data = [ | |||
|  |                 'second_leader' => $my_first_leader, | |||
|  |                 'third_leader' => $my_second_leader, | |||
|  |             ]; | |||
|  |             User::where(['first_leader' => $user_id])->update($data); | |||
|  | 
 | |||
|  |             //更新我向下二级的第三级
 | |||
|  |             $data = [ | |||
|  |                 'third_leader' => $my_first_leader, | |||
|  |             ]; | |||
|  |             User::where(['second_leader' => $user_id])->update($data); | |||
|  | 
 | |||
|  |             //更新当前用户所有后代的关系链
 | |||
|  |             $posterityArr = User::field('id,ancestor_relation') | |||
|  |                 ->whereFindInSet('ancestor_relation', $post['user_id']) | |||
|  |                 ->select() | |||
|  |                 ->toArray(); | |||
|  |             $updateData = []; | |||
|  |             $replace_ancestor_relation = $post['user_id'] . ','. $my_ancestor_relation; | |||
|  |             foreach($posterityArr as $item) { | |||
|  |                 $updateData[] = [ | |||
|  |                     'id' => $item['id'], | |||
|  |                     'ancestor_relation' => str_replace($post['user_id'], $replace_ancestor_relation, $item['ancestor_relation']) | |||
|  |                 ]; | |||
|  |             } | |||
|  |             // 批量更新
 | |||
|  |             (new User())->saveAll($updateData); | |||
|  | 
 | |||
|  |             Db::commit(); | |||
|  |             return true; | |||
|  |         } catch (Exception $e){ | |||
|  |             Db::rollback(); | |||
|  |             return $e->getMessage(); | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     public static function freeze($post) | |||
|  |     { | |||
|  |         $user = User::where('id', $post['id'])->find(); | |||
|  |         $user->freeze_distribution = 1; | |||
|  |         if ($post['type'] == 'unfreeze'){ | |||
|  |             $user->freeze_distribution = 0; | |||
|  |         } | |||
|  |         return $user->save(); | |||
|  |     } | |||
|  | 
 | |||
|  |     public static function del($post) | |||
|  |     { | |||
|  |         $user = User::find($post['id']); | |||
|  |         $user->is_distribution = 0; | |||
|  |         $user->update_time = time(); | |||
|  |         return $user->save(); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 待审核会员列表 | |||
|  |      */ | |||
|  |     public static function auditLists($get) | |||
|  |     { | |||
|  |         $where = []; | |||
|  |         if (!empty($get['search_key']) && !empty($get['keyword'])) { | |||
|  |             $keyword = $get['keyword']; | |||
|  |             if ($get['search_key'] == 'mobile') { | |||
|  |                 $where[] = ['u.mobile', 'like', '%' . $keyword . '%']; | |||
|  |             } else { | |||
|  |                 $where[] = [$get['search_key'], 'like', '%' . $keyword . '%']; | |||
|  |             } | |||
|  |         } | |||
|  |         //审核状态
 | |||
|  |         if (isset($get['status']) && $get['status'] != '') { | |||
|  |             $where[] = ['status', '=', $get['status']]; | |||
|  |         } | |||
|  | 
 | |||
|  | 
 | |||
|  |         $field = [ | |||
|  |             'a.*', 'u.sn', 'u.nickname', 'u.mobile', 'u.level', 'u.sex', 'a.reason', | |||
|  |             'u.create_time' => 'register_time', 'u.avatar', 'u.first_leader' | |||
|  |         ]; | |||
|  | 
 | |||
|  |         $count = DistributionMemberApply::alias('a') | |||
|  |             ->join('user u', 'u.id = a.user_id') | |||
|  |             ->where($where) | |||
|  |             ->count(); | |||
|  | 
 | |||
|  |         $lists = DistributionMemberApply::alias('a') | |||
|  |             ->field($field) | |||
|  |             ->join('user u', 'u.id = a.user_id') | |||
|  |             ->order('a.id desc') | |||
|  |             ->page($get['page'], $get['limit']) | |||
|  |             ->where($where) | |||
|  |             ->select() | |||
|  |             ->toArray(); | |||
|  | 
 | |||
|  |         $user_level = UserLevel::where(['del' => 0])->column('name', 'id'); | |||
|  | 
 | |||
|  |         $leader_ids = array_column($lists, 'first_leader'); | |||
|  |         $leaders = User::where('id', 'in', $leader_ids) | |||
|  |             ->column('sn,nickname,mobile,level', 'id'); | |||
|  | 
 | |||
|  |         foreach ($lists as &$item) { | |||
|  |             $item['level'] = $user_level[$item['level']] ?? '无等级'; | |||
|  |             $item['sex'] = self::getSexText($item['sex']); | |||
|  |             $item['register_time'] = date('Y-m-d H:i:s', $item['register_time']); | |||
|  |             $item['status_text'] = DistributionMemberApply::getApplyStatus($item['status']); | |||
|  |             $item['leader'] = $leaders[$item['first_leader']] ?? []; | |||
|  |             $item['avatar'] = UrlServer::getFileUrl($item['avatar']); | |||
|  |             if (!empty($item['leader'])) { | |||
|  |                 $leader_level = $item['leader']['level'] ?? 0; | |||
|  |                 $item['leader']['level'] = $user_level[$leader_level] ?? '无等级'; | |||
|  |             } | |||
|  |         } | |||
|  |         return ['count' => $count, 'lists' => $lists]; | |||
|  |     } | |||
|  | 
 | |||
|  |     public static function getSexText($value) | |||
|  |     { | |||
|  |         switch ($value) { | |||
|  |             case 1: | |||
|  |                 return '男'; | |||
|  |             case 2: | |||
|  |                 return '女'; | |||
|  |             default: | |||
|  |                 return '未知'; | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     public static function auditPass($post) | |||
|  |     { | |||
|  |         Db::startTrans(); | |||
|  |         try { | |||
|  |             $apply = DistributionMemberApply::where('id', $post['id'])->find(); | |||
|  |             $apply->status = DistributionMemberApply::STATUS_AUDIT_SUCCESS; | |||
|  |             $apply->update_time = time(); | |||
|  |             $apply->save(); | |||
|  | 
 | |||
|  |             $user = User::where('id', $apply['user_id'])->find(); | |||
|  |             $user->is_distribution = 1; | |||
|  |             $user->save(); | |||
|  | 
 | |||
|  |             Db::commit(); | |||
|  |             return true; | |||
|  |         } catch (Exception $e) { | |||
|  |             Db::rollback(); | |||
|  |             return $e->getMessage(); | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     public static function auditRefuse($post) | |||
|  |     { | |||
|  |         $apply = DistributionMemberApply::where('id', $post['id'])->find(); | |||
|  |         $apply->status = DistributionMemberApply::STATUS_AUDIT_ERROR; | |||
|  |         $apply->denial_reason = $post['denial_reason'] ?? ''; | |||
|  |         $apply->save(); | |||
|  |         return true; | |||
|  |     } | |||
|  | } |