select('id,user_id,pos,pid,mall_id,help_num,team_num')->where(['mall_id'=>$mallId,'user_id'=>$pullUserId,'status' => StatusEnum::ENABLED])->asArray()->one(); $pushUser = DoubleCopyUser::find()->select('id,user_id,pos,pid,mall_id,help_num,team_num')->where(['mall_id'=>$mallId,'user_id'=>$pushUserId,'status' => StatusEnum::ENABLED])->asArray()->one(); //修改助力用户 团队数量 修改PID 等 self::editHelpTeamNum($pullUser,$pushUser); //添加数据 self::addSpread($pullUserId,$pushUserId,$pullUser['pid']); } /** * 绑定上级为平台 * * @param int $pullUserId 选择下级用户ID * @param int $pushUserId 绑定上级用户ID * @param int $mallId 商城ID * @return bool */ public static function bindingHandlePlatform($pullUserId,$mallId,$admin) { self::$mallId = $mallId; self::$admin = $admin; $pullUser = DoubleCopyUser::find()->select('id,user_id,pos,pid,mall_id,help_num,team_num')->where(['mall_id'=>$mallId,'user_id'=>$pullUserId,'status' => StatusEnum::ENABLED])->asArray()->one(); $pushUser = DoubleCopyUser::find()->select('id,user_id,pos,pid,mall_id,help_num,team_num')->where(['mall_id'=>$mallId,'user_id'=>$pullUser['pid'],'status' => StatusEnum::ENABLED])->asArray()->one(); //修改助力用户 团队数量 修改PID 等 self::editHelpTeamNumPlatform($pullUser,$pushUser); //添加数据 self::addSpread($pullUserId,0,$pullUser['pid']); } /** * 绑定上级为平台,修改助力用户 团队数量 修改PID * * @param [type] $pullUser 拉取下级用户 * @param [type] $pushUser 绑定上级用户 * @return void */ public static function editHelpTeamNumPlatform($pullUser,$pushUser) { //修改该用户上级的团队数量(team_num)、助力用户数量(help_num) $userPidAllAttrs = self::recursionGetAllPidUser($pullUser); if($userPidAllAttrs) self::calculateTeamNum($userPidAllAttrs,'-',$pullUser['team_num']); if($pullUser['pid']) self::calculateHelpNum($pullUser['pid'],'-'); //修改该用户的兄弟用户,pos都要-1个位置 self::editPullPos($pullUser); //修改该用户的pid、topid、pos为0 $editPid = DoubleCopyUser::findOne($pullUser['id']); $editPid->pid = 0; $editPid->topid = 0; $editPid->pos = 0; if(!$editPid->save()) throw new Exception('修改该用户的pid、topid、pos为0,失败'); // 根据用户id,递归找出所有下级中,pos=1 || pos=2的下级,把这些用户的topid改为0 if($pullUser['pid']) { $result = []; self::findDescendants($pullUser['user_id'], $result); DoubleCopyUser::updateAll(['topid' => 0, 'updated_at' => time()], ['id' => $result]); } } // 根据用户id,递归找出所有下级中,pos=1 || pos=2的下级 public static function findDescendants($userId, &$result = []) { $children = DoubleCopyUser::find() ->select(['id', 'user_id', 'pid', 'topid', 'pos']) ->where(['pid' => $userId, 'status' => StatusEnum::ENABLED]) ->asArray()->all(); foreach ($children as $child) { // 如果 pos 为 1 或 2,加入结果 if ($child['pos'] == 1 || $child['pos'] == 2) { $result[] = $child['id']; } // 递归查找下级 self::findDescendants($child['user_id'], $result); } } /** * 修改助力用户 团队数量 修改PID * * @param [type] $pullUser 拉取下级用户 * @param [type] $pushUser 绑定上级用户 * @return void */ public static function editHelpTeamNum($pullUser,$pushUser) { //修改拉取上级用户数量 团队 助力用户数量 $userPidAllAttrs = self::recursionGetAllPidUser($pullUser); if($userPidAllAttrs) self::calculateTeamNum($userPidAllAttrs,'-',$pullUser['team_num']); if($pullUser['pid']) self::calculateHelpNum($pullUser['pid'],'-'); //修改拉取POS位置 self::editPullPos($pullUser); //修改绑定上级用户 团队 助力用户数量 $userPushAllAttrs = self::recursionGetAllPidUser($pushUser); $userPushAllAttrs[] = $pushUser; self::calculateTeamNum($userPushAllAttrs,'+',$pullUser['team_num']); if($pushUser['user_id']) self::calculateHelpNum($pushUser['user_id'],'+'); //修改推送Pos位置 self::editPushPos($pullUser,$pushUser); //修改 Pid $editPid = DoubleCopyUser::findOne($pullUser['id']); $editPid->pid = $pushUser['user_id']; if(!$editPid->save()) throw new Exception("修改Pid失败"); if($pullUser['pid']) self::editTopId($pullUser['pid']); if($pushUser['user_id']) self::editTopId($pushUser['user_id']); } /** * 获取PID上级所有用户 * * @param array $user 用户 * @return array */ public static function recursionGetAllPidUser($userData,&$users = []) { $userData = DoubleCopyUser::find() ->select('id,user_id,pid,help_num,team_num,mall_id') ->where(['mall_id'=>self::$mallId,'user_id'=>$userData['pid'],'status' => StatusEnum::ENABLED]) ->asArray() ->one(); if($userData){ $users[] = $userData; self::recursionGetAllPidUser($userData, $users); } return $users; } /** * 处理团队数量 * * @param array $aggregate 数组循环 * @param string $rule +或者- * @param integer $step 增加数量 * @return void */ public static function calculateTeamNum($aggregate,$rule='+',$step=0) { $num = $step + 1;//修改的数量 foreach ($aggregate as $k=>$v){ $spread = DoubleCopyUser::findOne($v['id']); if($rule == '+'){ $spread->team_num = bcadd($v['team_num'],$num); }else if ($rule == '-') { $spread->team_num = bcsub($v['team_num'],$num); } if(!$spread->save()) throw new Exception("处理团队数量修改失败"); } } /** * 处理助力用户数量 * * @param [type] 要处理的上级ID * @param string $rule * @return void */ public static function calculateHelpNum($pid,$rule='+') { $spread = DoubleCopyUser::find()->where(['user_id'=>$pid,'mall_id'=>self::$mallId,'status' => StatusEnum::ENABLED])->one(); if(!$spread) return false; if($rule == '+'){ $spread->help_num = bcadd($spread['help_num'],1); }else if ($rule == '-') { $spread->help_num = bcsub($spread['help_num'],1); } if(!$spread->save()) throw new Exception('修改处理助力用户数量失败'); } /** * 修改拉取用户链的Pos * * @param [type] $pullUser 拉取用户 * @return bool */ public static function editPullPos($pullUser) { $users = DoubleCopyUser::find() ->select('id,user_id,pos') ->where(['status' => StatusEnum::ENABLED,'pid'=>$pullUser['pid'],'mall_id'=>self::$mallId]) ->andWhere(['>','pos',$pullUser['pos']]) ->asArray() ->all(); if(empty($users)) return true; foreach ($users as $user) { $editUserPos = DoubleCopyUser::findOne($user['id']); $editUserPos->pos = bcsub($user['pos'],1); if(!$editUserPos->save()) throw new Exception('修改用户链的POS失败'); } } /** * 修改推送用户链的Pos * * @param [type] $pullUser 拉取用户 * @param [type] $pushUser 推送用户 * @return bool */ public static function editPushPos($pullUser,$pushUser) { $user = DoubleCopyUser::find() ->select('id,user_id,pos') ->where(['status' => StatusEnum::ENABLED,'pid'=>$pushUser['user_id'],'mall_id'=>self::$mallId]) ->orderBy(['pos' => SORT_DESC]) ->asArray() ->one(); $num = empty($user['pos'])? 1 :$user['pos']+1; $editUserPos = DoubleCopyUser::findOne($pullUser['id']); $editUserPos->pos = $num; if(!$editUserPos->save()) throw new Exception('修改推送用户链的POS失败'); } /** * 批量修改TOPID * * @param int 输入关系链的上一级的USERID * @return void */ public static function editTopId($userId) { $boss_level = DoubleCopyLevel::find()->select('upgrade_type_condition, checked_condition_values')->where(['mall_id' => self::$mallId, 'level' => DoubleCopyEnum::LEVEL_BOSS, 'status' => StatusEnum::ENABLED])->asArray()->one(); $upgrade_num = 0;// 需要直推的升级数量 // json解析升级条件数量 $json = Json::decode($boss_level['checked_condition_values'], true); $upgrade_num = $json[0]['value']['val0'] ?? 0; $copy_user = DoubleCopyUser::findOne(['user_id' => $userId, 'status' => StatusEnum::ENABLED]); if (!empty($copy_user)) self::batchGetUsers($copy_user,$upgrade_num);// 非空处理,避免原上级并非二二复制用户情况 } /** * 添加推广变更列表 * * @param int $pullUserId 拉取用户 * @param int $pushUserId 推送用户 * @return void */ public static function addSpread($pullUserId,$pushUserId,$originalUserid) { $add = new DoubleCopySpread(); $add->pull_user_id = $pullUserId; $add->push_user_id = $pushUserId; $add->mall_id = self::$mallId; $add->original_pid = $originalUserid; $add->admin_id = self::$admin->id; if(!$add->save()) throw new Exception('推广变更列表失败'); } /** * 批量修改用户位置 * @Author: lun * @DateTime: 2023/6/1 0001 18:44 * @Copyright: copyright (c) 2021 广东七件事集团 * @param DoubleCopyUser $changeUser * @param $upgrade_num * @param $change_pos_id */ public static function batchGetUsers(DoubleCopyUser $changeUser, $upgrade_num) { $child_list = self::getAllUserIDs($changeUser->user_id); foreach ($child_list as $item) { if ($item == $changeUser->user_id) { $user = $changeUser; } else { $user = DoubleCopyUser::findOne(['user_id' => $item, 'status' => StatusEnum::ENABLED]); } if ($user) { self::updateTopId($user, $upgrade_num); } } } /** * * @Author: lun * @DateTime: 2023/6/1 0001 18:22 * @Copyright: copyright (c) 2021 广东七件事集团 * @param DoubleCopyUser $user * @param $upgrade_num * @param $change_pos_id */ public static function updateTopId(DoubleCopyUser $user, $upgrade_num) { $parent_ids = self::recursionGetAllPidUser($user); $parent_ids = array_column($parent_ids,'user_id');// 倒序数组 array_unshift($parent_ids, $user->user_id); foreach ($parent_ids as $key => $pid) { // 查询上级是否有身份 $pdc_user = DoubleCopyUser::find()->select('user_id,pos,pid')->where(['user_id' => $pid, 'status' => StatusEnum::ENABLED])->asArray()->one(); if (empty($pdc_user)) { // 获取当前用户的上级uid $ppuid = $parent_ids[$key + 1] ?? 0; if ($ppuid) { // 统计跟此用户同级人数,并且判断当前用户的平级数量是否大于或等于2号位 $equal_num = DoubleCopyUser::find()->where(['pid' => $ppuid, 'status' => StatusEnum::ENABLED])->count(); if ($equal_num >= $upgrade_num) {// 符合位置则表示当前用户的上级必定是拿平台补贴用户(拿平台补贴用户可以没有身份) $topid = $ppuid; break; } } } else { // 如果当前位置是大于或等于3号位则表示此用户上级必定是老板 if ($pdc_user['pos'] > $upgrade_num) { $topid = $pdc_user['pid']; break; } } $topid = $pid; } // 临时检测的平台补贴用户id跟之前不同则需要修改平台补贴用户id if ($user->topid != $topid && $user->pid != 0) { $user->topid = $topid; $user->save(); } } /** * 获取用户的所有下级 包括自己 * * @param [type] $topUserId 顶级用户ID * @return array */ public static function getAllUserIDs($topUserId) { $result = [$topUserId]; $subUsers = DoubleCopyUser::find()->where(['pid' => $topUserId])->all(); foreach ($subUsers as $user) { $result[] = $user->user_id; $result = array_merge($result, self::getAllUserIDs($user->user_id)); } $result = array_unique($result); return $result; } /** * 判断是否是主商城关系链 * * @param [type] $pullUserId 下级用户ID * @param [type] $pushUserId 上级用户ID * @return bool */ public static function valPidIsMall($pullUserId,$pushUserId) { $pullTree = UserPartitionRelationship::getTree($pullUserId); $deep = $pullTree[1] - 1; $pullstrTree = $pullTree[0]; $lastCommaPos = strrpos($pullstrTree, ','); if ($lastCommaPos !== false) { $str = substr($pullstrTree, 0, $lastCommaPos); } else { $str = $pullstrTree; } $treeUser = UserPartitionRelationship::find()->where(['deep'=>$deep,'tree'=>$str])->asArray()->one(); if($pushUserId == $treeUser['user_id']){ return true; }else{ return false; } } }