// +---------------------------------------------------------------------- namespace App\Services\Common; use App\Models\ActionLogModel; use App\Models\MemberModel; use App\Services\Api\TeamService; use App\Services\BaseService; use App\Services\RedisService; use Illuminate\Support\Facades\DB; /** * 会员管理-服务类 * @author laravel开发员 * @since 2020/11/11 * Class MemberService * @package App\Services\Common */ class MemberService extends BaseService { /** * 构造函数 * @author laravel开发员 * @since 2020/11/11 * MemberService constructor. */ public function __construct() { $this->model = new MemberModel(); } /** * 获取列表 * @param $params 参数 * @param int $pageSize 分页大小:默认 15 * @return array */ public function getDataList($params, $pageSize = 10, $field=[]) { $page = request()->post('page', 1); $cacheKey = "caches:member:list_{$page}_{$pageSize}_".md5(json_encode($params)); $list = RedisService::get($cacheKey); if($list){ return [ 'pageSize'=> $pageSize, 'total'=>isset($list['total'])? $list['total'] : 0, 'list'=> isset($list['data'])? $list['data'] : [] ]; } $where = ['a.mark' => 1]; $status = isset($params['status'])? $params['status'] : 0; if($status>0){ $where['a.status'] = $status; } $list = $this->model->with(['level','parent','pledge']) ->from('member as a') ->leftJoin('member as b','b.id','a.parent_id') ->where($where) ->where(function($query) use($params){ $walletUrl = isset($params['wallet_url'])? trim($params['wallet_url']) : ''; if($walletUrl){ $query->where('a.wallet_url','like',"%{$walletUrl}%"); } $parentUrl = isset($params['parent_url'])? trim($params['parent_url']) : ''; if($parentUrl){ $query->where('b.wallet_url','like',"%{$parentUrl}%"); } $parentId = isset($params['parent_id'])? intval($params['parent_id']) : 0; if($parentId){ $query->where('a.parent_id',$parentId); } $teamId = isset($params['team_id'])? intval($params['team_id']) : 0; if($teamId){ $query->whereRaw("FIND_IN_SET({$teamId},lev_a.parent_ids)"); } }) ->where(function($query) use($params){ $account = isset($params['account'])? trim($params['account']) : ''; if($account){ $query->where('a.nickname','like',"%{$account}%")->orWhere('a.id','=', intval($account)); } }) ->select($field? $field : ['a.*','b.wallet_url as parent_url']) ->orderBy('a.create_time','desc') ->orderBy('a.id','desc') ->paginate($pageSize > 0 ? $pageSize : 9999999); $list = $list? $list->toArray() :[]; if($list){ foreach($list['data'] as &$item){ $item['create_time_text'] = $item['create_time']? datetime($item['create_time'],'Y.m.d H:i:s'):''; $item['invite_num'] = TeamService::make()->getTeamUserCountByType($item['id'], 1, 0); $item['team_num'] = TeamService::make()->getTeamUserCountByType($item['id'], 2, 0); $item['team_performance'] = TeamService::make()->getTeamPerformanceByType($item['id'], 2); $item['pledge_total'] = PledgeOrderService::make()->getTotalByUser($item['id']); $pledge = isset($item['pledge'])? $item['pledge'] : []; $item['is_pledge'] = $pledge? 1 : 0; $item['recharge_total'] = BalanceLogService::make()->getTotalByUser($item['id']); $item['withdraw_total'] = BalanceLogService::make()->getTotalByUser($item['id']); $rechargeData = BalanceLogService::make()->getTeamTotalByUser($item['id'], 1); $ptRechargeData = BalanceLogService::make()->getTeamTotalByUser($item['id'], 2); $item['team_recharge'] = $rechargeData; $item['pt_recharge'] = $ptRechargeData; } RedisService::set($cacheKey, $list, rand(3,5)); } return [ 'pageSize'=> $pageSize, 'total'=>isset($list['total'])? $list['total'] : 0, 'list'=> isset($list['data'])? $list['data'] : [] ]; } /** * 添加会编辑会员 * @return array * @since 2020/11/11 * @author laravel开发员 */ public function edit() { // 请求参数 $data = request()->all(); // 头像处理 if($data['avatar']){ $avatar = trim($data['avatar']); if (strpos($avatar, "temp")) { $data['avatar'] = save_image($avatar, 'member'); } else { $data['avatar'] = str_replace(IMG_URL, "", $data['avatar']); } } if(isset($data['password']) && $data['password']){ $data['password'] = get_password(trim($data['password'])); } DB::beginTransaction(); try { // 判断团队分红比例 $uid = isset($data['id'])? $data['id'] : 0; $info = $this->model->where(['id'=> $uid,'mark'=>1])->select(['id','member_level','parent_ids','bonus_rate','room_bonus_rate'])->first(); $info = $info? $info->toArray() : []; $userParentId = isset($info['parent_id'])? $info['parent_id'] : 0; $memberLevel = isset($info['member_level'])? $info['member_level'] : 0; $userParentIds = isset($info['parent_ids'])? $info['parent_ids'] : ''; // 最大设置比例 $bonusRate = isset($data['bonus_rate'])? floatval($data['bonus_rate']) : 0; if($bonusRate){ $maxBonusRate = \App\Services\Api\MemberService::make()->getUpBonusRate($uid, $userParentIds); if ($maxBonusRate > 0 && $bonusRate > $maxBonusRate) { DB::rollBack(); $this->error = lang(2037,['rate'=>$maxBonusRate]); return message($this->error, false); } } // 工作室分红 $roomBonusRate = isset($data['room_bonus_rate'])? floatval($data['room_bonus_rate']) : 0; if($roomBonusRate){ $maxBonusRate = \App\Services\Api\MemberService::make()->getUpRoomBonusRate($uid, $userParentIds); if ($maxBonusRate > 0 && $roomBonusRate > $maxBonusRate) { DB::rollBack(); $this->error = lang(2038,['rate'=>$maxBonusRate]); return message($this->error, false); } } // 判断是否修改了上级 $parentId = isset($data['parent_id'])? intval($data['parent_id']) : 0; if($parentId>0 && $userParentId != $parentId){ // 上级是否存在 $parentInfo = $this->model->where(['id'=> $parentId,'mark'=>1])->select(['id','parent_ids'])->first(); $parentInfo = $parentInfo? $parentInfo->toArray() : []; $parentIds = isset($parentInfo['parent_ids'])? trim($parentInfo['parent_ids']) : ''; // 判断该推荐人是否为团队下级 $parents = get_parents($parentIds); if(in_array($uid, $parents)){ DB::rollBack(); $this->error = 2039; return message($this->error, false); } // 更新自己推荐关系 $data['parent_id'] = $parentId; $data['parent_ids'] = $parentIds? trim($parentIds,',').",{$parentId}," : "{$parentId},"; $userNewParentIds = $data['parent_ids']; // 更新下级团队用户推荐关系 $users = $this->model->whereRaw("FIND_IN_SET({$uid},parent_ids)")->select(['id','parent_id','parent_ids'])->get(); foreach($users as $item){ $parentIds = $item['parent_ids']; if($parentIds){ $oldParentIds = $userParentIds? trim($userParentIds,',').",{$uid}," : "{$uid},"; $newParentIds = $userNewParentIds? trim($userNewParentIds,',').",{$uid}," : "{$uid},"; $newParentIds = $parentIds? str_replace("{$oldParentIds}","{$newParentIds}", $parentIds) : ''; if($newParentIds){ $updateData = [ 'parent_ids'=> $newParentIds, 'update_time'=> time(), ]; if(!$this->model->where(['id'=> $item['id']])->update($updateData)){ DB::rollBack(); return message(1014, false); } } } } ActionLogModel::setTitle("修改用户推荐人"); ActionLogModel::record(); } $level = isset($data['member_level'])? intval($info['member_level']) : 0; if($level != $memberLevel){ ActionLogModel::setTitle("修改用户等级为[S{$level}]"); ActionLogModel::record(); } unset($data['parent']); unset($data['pt_recharge']); unset($data['team_recharge']); unset($data['level']); unset($data['pledge']); $result = parent::edit($data); $success = isset($result['success']) ? $result['success'] : false; if(!$success){ DB::rollBack(); return $result; } ActionLogModel::setTitle("修改会员信息"); ActionLogModel::record(); RedisService::keyDel("caches:member:list*"); DB::commit(); return $result; } catch (\Exception $exception){ return message(1003, false, ['error'=> $exception->getMessage()]); } } /** * 上级用户列表 * @return array */ public function parents() { // 获取参数 $param = request()->all(); // 用户ID $keyword = getter($param, "keyword"); $parentId = getter($param, "parent_id"); $userId = getter($param, "user_id"); $datas = $this->model->where(function($query) use($userId){ $query->where(['status'=> 1,'mark'=>1]); if($userId){ $query->whereNotIn('id', [$userId]); } }) ->where(function($query) use($userId, $parentId){ if($userId){ // $query->whereRaw("NOT FIND_IN_SET({$userId},parent_ids)"); // $query->where(['id'=> $parentId]); } }) ->where(function($query) use($keyword){ if($keyword){ $query->where('nickname','like',"%{$keyword}%")->orWhere('wallet_url','like',"%{$keyword}%"); } }) ->select(['id','wallet_url','code','nickname','status']) ->get(); $datas = $datas? $datas->toArray() : []; if($datas){ foreach ($datas as &$item){ $labels = ['ID:'.$item['id']]; if($item['nickname']){ $labels[] = $item['nickname']; } if($item['wallet_url']){ $labels[] = format_str($item['wallet_url'], 6,6); } $item['label'] = implode(' ', $labels); } } return $datas; } /** * 用户选项 * @return array */ public function options() { // 获取参数 $param = request()->all(); // 用户ID $keyword = getter($param, "keyword"); $parentId = getter($param, "parent_id"); $userId = getter($param, "user_id"); $datas = $this->model->where(function($query) use($parentId){ if($parentId){ $query->where(['id'=> $parentId,'mark'=>1]); }else{ $query->where(['status'=> 1,'mark'=>1]); } }) ->where(function($query) use($userId){ if($userId){ $query->whereNotIn('id', [$userId]); } }) ->where(function($query) use($keyword){ if($keyword){ $query->where('nickname','like',"%{$keyword}%")->orWhere('wallet_url','like',"%{$keyword}%"); } }) ->select(['id','code','nickname','wallet_url','status']) ->get(); return $datas? $datas->toArray() : []; } /** * 批量冻结解冻 * @param $params 参数:user_id-用户ID,type-(1-冻结,2-解冻) * @return bool */ public function lock($params) { $type = isset($params['type'])? intval($params['type']) : 0; $userId = isset($params['user_id'])? intval($params['user_id']) : 0; if($userId<=0){ $this->error = 2014; return false; } $status = $type==1? 2 : 1; if(!$this->model->whereRaw("FIND_IN_SET({$userId},parent_ids)")->where(['status'=>$status==1?2:1,'mark'=>1])->update(['status'=>$status,'update_time'=>time()])){ $this->error = 1003; return false; } ActionLogModel::setTitle("批量冻结/解冻用户"); ActionLogModel::record(); $this->error = 1002; return true; } }